MEMORIE BISTABILI

Saluti tutti, desidero anzitutto ringraziare per il supporto che ho finora ricevuto, in particolare Nepi e Norman.

Devo memorizzare il valore iniziale di alcune variabili numeriche in una memoria di tipo bistabile che consenta di mantenere stabilmente i valori memorizzati, indipendentemente dal fatto che le variabili cambino continuamente di valore. Sono gi arrivato ad una soluzione che, in alcuni casi funziona bene e in altri no. In ogni caso, la soluzione che ho trovato la trovo poco elegante e sicuramente non ortodossa.

In sostanza ho utilizzato i TextField come “celle di memora”, ad esempio:

dim W as currency = Window1.width // VALORE W DA MEMORIZZARE
dim H as currency = Window1.height // VALORE H DA MEMORIZZARE
dim Wx as currency = Window1.width // VALORE INIZIIALE W MEMORIZZATO
dim Hx as currency = Window1.height // VALORE INIZIALE H MEMORIZZATO

if TextField1.text = Str(nil) then
TextField1.text = Str(W)
end if

If TextField2.tex t = Str(nil) then
TTextField1.text = Str(H)
end if

Wx = Val(StrW) // Il valori Wx e Hx sono memorizzati stabilmente nella " if " dove Str(W) e Str(H) hanno sostituito Str(nil), quindi, bloccano altri nuovi valori.
Hx = Val(StrH) // Per resettare i valori basta reimpostare nel codice la condizione iniziale " if " : TextField1.text = Str(nil) / TextField2.text = Str(nil)

Il problema che i valori iniziali che devo memorizzare sono 6, quindi, mi occorrerebbero altrettanti TextField non visibili, in quanto non fanno parte dei controlli della mia Window. Dovrei, inoltre, risolvere il problema nei casi in cui non funziona, cosa che si sta rilevando molto ostica.
Credo che, in modo molto pi elegante ed ortodosso, si potrebbe utilizzare, ad esempio una MemoryBlock o altro sistema, purch, una volta memorizzati i valori iniziali delle variabili, li mantenga stabilmente, finch non venga resettata.
Purtroppo, per il mio modesto livello di conoscenza di Xojo, ci sto sbattendo la testa da giorni senza riuscire a tirare fuori un ragno dal buco.
Spero che qualcuno di voi possa darmi una mano.
Grazie

Ciao Giulio, e buon Primo Maggio (quest’anno un Primo Maggio un po’ anomalo)

Ti confesso che non so se ho capito bene quello che vuoi fare: mi sembra che tu voglia trovare il modo di salvare 6 valori in modo che non vengano pi modificati (a meno che non decida tu di farlo).

Se questo il problema direi che si pu risolvere tranquillamente.

Non importa utilizzare dei TextField per memorizzare dei dati: puoi farlo tranquillamente usando delle normalissime variabili (nel tuo caso variabili di tipo Integer, visto che devi memorizzare delle propriet di una finestra).

Io farei cos:

Dim SaveWidth As Integer  // qui memorizzo il valore della propriet Width della finestra
Dim SaveHeight As Integer  // qui memorizzo il valore della propriet Height della finestra
Dim SaveTop As Integer  // qui memorizzo il valore della propriet Top della finestra
Dim SaveLeft As Integer  // qui memorizzo il valore della propriet Leftt della finestra
ecc. ecc.

Dim W As Integer = Window1.Width   
Dim H As Integer = Window1.Height
Dim T As Integer = Window1.Top   
Dim L As Integer = Window1.Left

// Se non l'ho ancora fatto salvo i valori delle variabili 
if SaveWidth = 0 Then SaveWidth = W
if SaveHeight = 0 Then SaveHeight = H
if SaveTop = 0 Then SaveTop = T
if SaveLeft = 0 Then SaveLeft = L

// Queste variabili manterranno il loro valore finch non decidi tu di cambiarlo.

Non so se ho centrato il problema, ma se cos non fosse ti prego di spiegarmi bene di cosa si tratta.

Per ogni evenienza conta pure su di me.

Nedi

Caro Nepi, buon Primo Maggio anche a te, sei una persona veramente impagabile, lavori perfino la Festa dei Lavoratori!

Forse non mi sono spiegato bene o io non ha capito il codice che mi hai suggerito.
Ti faccio un caso molto semplice, immagina di avere una Window completamente vuota, cio senza alcun RectControl inserito.
In questo caso, i due soli valori che dovrei memorizzare sono:

Dim W as Integer = Window1.Width // Width il valore iniziale della Window1
Dim H as integer = Window1.heidht // Height il valore iniziale della Window1

Tieni conto, per, che dopo aver lanciato l’applicazione, si ridimensi manualmente la Window, allargandola o restringendola. Di conseguenza, cambiano i valori attuali Width ed Height, mentre non dovrebbero assolutamente cambiare valori iniziale di Width ed Height, precedentemente memorizzati.

Ho provato a scrivere il codice che mi hai suggerito, limitandolo ai due soli valori Width ed Height della mia Window1 vuota. Ridimensionando la Window1, vengono per ridimensionati anche i valori Width ed Height che erano stati in precedenza memorizzati.

Tieni conto che il codice l’ho inserito nell’evento Resized della Window, per cui, ogni volta che ridimensiono la Window, viene rilanciato il codice e, di conseguenza, vengono memorizzati nuovi valori di width ed height, al posto di quelli precedentemente memorizzati. Forse, ci vorrebbe un codice che blocchi le memorizzazione, dopo avere memorizzato i valori iniziali, detto in parole da profano: “se ci sono valori iniziali memorizzati, allora non memorizzare quelli attuali”, ma come scriverlo nel codice?

Di seguito il codice semplificato che ho scritto:

Dim SaveWidth As Integer // qui memorizzo il valore della propriet Width della finestra
Dim SaveHeight As Integer // qui memorizzo il valore della propriet Height della finestra

dim W as Integer= Window1.width
dim H as Integer = Window1.height

// Se non l’ho ancora fatto salvo i valori delle variabili

if SaveWidth = 0 Then SaveWidth = W
if SaveHeight = 0 Then SaveHeight = H

Certo, l’ipotesi di potere eliminare i TextField mi piacerebbe moltissimo, ma dove ho sbagliato?
Grazie Nepi

Adesso ho capito cosa vuoi farne dei valori Width e Height della finestra.
Se vuoi salvare le dimensioni originali della finestra devi impostare le variabili SaveWidth e SaveHeight nell’evento Open della window, mentre le variabili W e H che imposti nell’evento Resized cambiano ogni volta che ridimensioni la finestra.
Spero di essere stato chiaro: in caso contrario dimmelo pure.

Nedi

Ciao Nepi, anche questa volta sei stato prezioso ed hai fatto centro.
Il codice che mi hai suggerito, FUNZIONA PERFETTAMENTE, a parte un caso dove, per mia ignoranza, non
sono riuscito a scrivere un codice più ortodosso, come esposto più avanti:

EVENTO OPEN

dim SaveWidth As Integer // qui memorizzo il valore della proprietà Width della finestra
dim SaveHeight As Integer // qui memorizzo il valore della proprietà Height della finestra
dim Wm as Integer= Window1.width
dim Hm as Integer = Window1.height
if SaveWidth = 0 Then SaveWidth = Wm // Wm = Proprietà Width memorizzata
if SaveHeight = 0 Then SaveHeight = Hm // Hm =Proprietà Height memorizzata

// I seguenti TextField servono solo per controllo:
TFWM.text = Str(Wm)
TFHM.text = Str(Hm)

EVENTO RESIZED

dim W as Integer= Window1.width // Width corrente
dim H as Integer = Window1.height // Heigth corrente

// HELP ME: Non so come fare per richiamare nell’evento “RESIZED” i valori definiti nell’evento “OPEN”
// Wm = ??
// Hm = ??

// L’unico modo che ho potuto escogitare, è attraverso i TextFiels di controllo. FUNZIONA, ma … . .
dim Wm as integer = Val(TFWM.text)
dim Hm as integer = Val(TFHM.text)

// Una volta richiamati valori di Wm e Hm, posso finalmente ottenere:
dim Wx as currency = W /Wm // Wx = Rapporto W / Wm
dim Hx as currency = H /Hm // Hx = Rapporto H / Hm
// ALLA FINE DELLA GIOSTRA, QUESTO E’ QUELLO CHE MI SERVE

// I seguenti TextField servono solo per controllo:
TFW.text = Str(W)
TFH.text = Str(H)
TFWX.text = Str(Wx)
TFHX .text = Str(Hx)

Quello che non sono riuscito a fare é richiamare nell’evento “RESIZED” i valori Wm e Hm che erano stati
memorizzati nell’evento “OPEN”. Tanto per verificare se funzionavano i rapporti W /Wm e H /Hm l’unico
modo che ho escogitato è stato quello di utilizzare i TestFied di controllo TFWX e TFHX, come da codice.
Chiaramente non mi piace questo sistema e spero che tu possa suggerirmi una soluzione più ortodossa.
Non finirò mai di ringraziarti per la tua disponibilità.

Ciao Nepi,
Per capire meglio il funzionamento dell’evento OPEN mi sono messo a smanettare sul codice ed successo una cosa per me sorprendente. Se nel codice di Open scrivo semplicemente:

dim Wm as Integer= Window1.width
dim Hm as Integer = Window1.height

ottengo lo stesso risultato del codice che mi hai suggerito. Cio, come se OPEN si comportasse da dispositivo di memorizzazione, acquisisce il valore iniziale di Wm e Hm che non cambia pi, indipendentemente dal ridimensionamento della Window.

Se poi aggiungo al codice OPEN:

dim x as integer
For x = 0 To Self.ControlCount - 1
if Window.Control(x) isa RectControl then
dim c As RectControl = RectControl(Window.Control(x))
dim N as string = c.name
dim Width as integer = c.width
MsgBox (str(Width))
dim Height as integer = c.height
dim Top as integer = c.top
dim left as integer = c.left
end if
next

da una sommaria verifica mi sembra che restituisce tutti i valori di tutti i RectControl della window, MA DEVO APPROFONDIRE, perch ha fatto un controllo solo con dei MsgBox
Ora, se questo fosse vero, a questo punto il vero problema sarebbe come rendere fruibili questi valori nell’evento RESIZED senza dovere ricorrere all’impiego di TextField, come ho fatto nella prima verifica.
Ti va di pensarci su? grazie

Se una variabile dichiarata nell’open vive solo li. Non la puoi utilizzare altrove.
Quindi ti consiglio di utilizzare una propriet.
visto che vuoi memorizzare la dimensione della window, ti conviene memorizzare la propriet bound (che tipo Rect) che contiene tutti gli elementi.

se vuoi fare la stessa cosa per i controlli, utilizzare sempre il rect (mi pare che bound non c’ ma puoi ottenere il rect lo stesso)

Se vuoi ripristinare il valore iniziale (pulsante, evento o quant’altro) basta che assegni il valore memorizzato nella propriet che hai creato alle relative propriet della finestra o del controllo.

Se vuoi memorizzare tutti i rect dei controlli (non capisco a cosa ti serva, ma non rilevante) ti conviene utilizzare un dictionary (che nell’open inizializzi) e utilizzare il nome del controllo (occhio alla distinzione minuscole/maiuscole) come chiave e il rect come valore.
Inoltre ricorda che i controlli in modalit array hanno tutti lo stesso nome per cui devi, in questo caso, gestire anche l’index (ma semplice farlo)

Infine…
non utilizzare msgBox per inviarti delle informazioni, comodo e immediato, ma se ne hai tante gravoso: utilizza system.debugLog nell’apposita sezione dell’IDE vedrai tutti i messaggi man mano che vengono inviati e puoi anche scorrerli per ulteriori analisi. Restano li fino al prossimo Run e puoi anche copiarli da qualche parte se ti serve.

Ciao Giulio, ti avevo risposto spiegandoti il ciclo di vita delle variabili definite nei metodi e negli eventi; quando ho salvato il post ne sono apparsi due identici, per cui ne ho cancellato uno….salvo accorgermi poco fa che sono spariti entrambi!
Comunque ti ha risposto in maniera esaustiva il nostro guru Antonio Rinaldi, che rappresenta per tutti noi un faro insostituibile.
Se c’è un problema che nessuno sa risolverti, tranquillo che lui una soluzione te la trova.

In ogni caso chiedimi pure tutto quello che vuoi: se sarò in grado di darti una mano lo farò molto volentieri.

Ciao

P.S.: mi chiamo Nedi, non Nepi (con un nome così ormai sono abituato a tutto…chi mi scambia per femmina, chi per extracomunitario… non mi meraviglio più di nulla!!)