Newsgroup: it.comp.lang.visual-basic
Titolo: Variabile con "troppa" memoria. Lungo

Scusate se riposto il problema a breve distanza ma ormai gli inferimeri 
della neuro sono alla porta e vorrei dire loro 
q.sa
 di sensato....
Scusate anche la lunghezza.
Non riesco a passare una variabile dichiarata come Public nel BAS (e solo 
nel file BAS) da un Form che la calcola ad un altro Form che la utilizza; o 
meglio la variabile in questione viene calcoata correttamente in quanto la 
visualizzo con un MsgBox prima di "passare" all'altro Form, ma il Form di 
destinazione che la utilizza si "ricorda" il valore del calcolo precedente e 
quindi devo fare due volte la stessa operazione per passare il valore 
corretto al Form di destinazione.
Ho provato allora, come facevo in "tempi remoti", a scrivere il valore della 
variabile calcolata dla primo Form in un file Random e poi ho aperto tale 
file nel Form di destinazione per leggere il valore della variabile: stesso 
risultato!
La variabile "letta" è quella del calcolo precedente pur essendo però 
scritta correttamente all'interno del file "di scambio"! (Ho verificato con 
il Notepad).
In pratica succede questo:
Form1 -> "A" vale 4 e viene visualizzato "4" nel MsgBox di controllo (non si 
sa mai...) salvo su file Random la variabile "A" ed il contenuto di tale 
file è "4" scarico il From1 e passo al Form2.
Form2 -> apro il file e leggo la variabile contenuta: A = "4".... tutto bene 
FINO A QUI!
Scarico il From2 e torno al Form1 e stavolta la variabile "A" vale 9... nel 
From2 mi ritrovo sempre "4"!!!!
A meno che non eseguo il calcolo 2 volte ,allora la variabile viene 
correttamente riconosciuta dal Form2 e così via: in pratica il Form2 è 
sempre "un giro indietro" rispetto al Form1 che calcola la variabile.
E questo accade sia DIMensionando A come Public nel solo file BAS, sia 
usando lo stratagemma del file "temporaneo" per passare la variabile da un 
Form all'altro; ovviamente in quest'ultimo caso utilizzo una variabile 
diversa DIMensionata ad hoc all'interno dei singoli Form.
Per favore mi dite cosa succede?
Perchè VB6 ha questa memoria "prodigiosa" ovvero io ho questa demenza 
"scandalosa"?
Grazie.
(G)
---------
Per tagliare la testa la toro ho scritto il contenuto di tale variabile,
assegnandola ad una nuova variabile "locale" (IDcli) all'interno di un file
random: ebbene pur essendo il valore scritto corretto, il VB6 si "ricorda"
il valore della scrittura precedente!
Come mai?
Nel Form4 ho la ListBox dalla quale scegliere il libro che mi interessa:
Private Sub List1_Click()
Dim IDcli As Integer
IDcli = 0
IDcli = Val(Right$(List1.Text, 5))***
MsgBox IDcli   -> IDcli è EFFETTIVAMENTE l'IDlibro che mi interessa!!!
Open "c:\IDlibro" For Random As #1 Len = 10
RecLibro.l1 = IDcli
Put #1, 1, RecLibro
Close #1
Reset
Set Form4 = Nothing
Unload Form4
Form7.Show
End Sub
***=questo perchè utilizzo l'IDlibro che è DIVERSO da List1.ListIndex in 
quanto visualizzo nella ListBox i titoli in ordine alfabetico e l'IDlibro è 
invece dipendente dall'ordine di inserimento dei
titoli ed è quindi il "puntatore" che punta all'interno del file random ove 
sono memorizzati i vari titoli.
--------------------
Nella Form7 ho scritto:
Private Sub Form_Load()
Dim a As Integer
Dim IDcli As Integer
IDcli = 0
Open "c:\IDlibro" For Random As #1 Len = 10
IDcli = Val(RecLibro.l1)
Close #1
Label13.Caption = IDcli
....
........
Ebbene IDcli NON varia se non DOPO LA SECONDA VOLTA CHE SELEZIONO LO STESSO 
TITOLO.
Eppure l'IDcli viene scritto correttamente all'interno del File temporaneo 
"c.\IDlibro" che creo all'upo nel Form4 in quanto l'ho aperto con il Notepad 
e c'è scritto il valore corretto! 

 Label13.Caption = IDcli
non so se ho capito.
anche se nel bas hai messo
    public idcli as integer
le due routine qui sopra quel public li' proprio non lo vedono.
ognuna usa il suo, dimmato sul momento. questione di scope.
te l ha gia'detto salclem.
lascia perdere il file scritto e letto. se fai
'bas
public IdCli as long
'form4
idcli=5
form7.show
unload me
'form7_load
    msgbox idcli
ti assicuro che ti dice 5
ciao, a.

TITOLO.
  A occhio e croce il problema e' che fai il Dim della variabile
all'interno delle Form.
  Onestamente stai dimostrando un assoluto dilettantismo e stai usando
il newsgroup come hotline, il che non va proprio bene.
-- 
  Ciao :-)
  Massimo
Nell'indirizzo, sostituire "micio" con "mc"

 anche se nel bas hai messo  public idcli as integer
Grazie per avermi risposto,
No, nel BAS non compare la variabile "locale" che ho usato SOLO per nella 
Sub relativa al salvataggio dato in un Form e lettura dello stesso in un 
altro Form e, come detto, il file viene scritto correttamente ma quando lo 
vado a riaprire il VB6 si "ricorda" il valore precedente.
Boh?????
Come mai?
(G)

 Scusate anche la lunghezza.
Davvero, io non riesco a capire tutti questi problemi su una cosa tanto
banale.
Secondo me stai pastrocchiando qualcosa in modo poco "standard".
Per prima cosa torno a chiederti un'altra volta se ci sono i vari Option
Explicit si *TUTTI* i moduli, form ecc.
Poi, controlla se selezionando la variabile che non ti torna e facendo click
di destra -> "Definizione" VB ti riporta sulla definizione corretta, e cioè
su Public Vattelapesca As Quelcal'è nel modulo.
Un'altra cosa da imparare ASSOLUTAMENTE ad usare è il debugger di VB:
breakpoints, CTRL+G, Finestra delle variabili locali, tasto click di destra
sulla variabile -> "Aggiungi espressione di controllo" con "interrompi se il
valore cambia" (aggiustare il contesto relativamente alla visibilità attesa
della variabile).
Per ultima cosa ti suggerirei di fare un progettino semplice che riproduca
questi problemi, metterlo su qualche spazio gratuito in internet (che ne so,
Lycos per es. o il tuo se ne hai già uno o il tuo provider te ne offre già
uno) e postare il link.
Così solo a parole è un po' difficile, perchè da come parli quello che ti
succede semplicemente non è possibile, quindi c'è qualcosa che non conosci e
non ritieni importante e che non ci dici.
Ciao

 ciao, a.
Infatti.
Ho ricreato la struttura del "mio" pastrocchio e si ripropone l'errore!
Dove sbaglio?
FORM1:
Option Explicit
Private Sub Invio_Click()
IDcli = Text1.Text
Form2.Show
End Sub
FORM2:
Option Explicit
Private Sub Ricomincia_Click()
Cls
Form1.Show
End Sub
Private Sub Form_Load()
Label1.Caption = IDcli
End Sub
MODULE1.BAS:
Option Explicit
Public IDcli As String

 Ho ricreato la struttura del "mio" pastrocchio e si ripropone l'errore!
zippa il tutto e mandamelo.
se c'e' un db, magari sfronda...
ciao, a.

Vedo che le risposte ai tuoi post non hanno sortito effetto alcuno.
Secondo me hai ancora molto (ma molto) da studiare
Scusa ma, lo fanno capire certi orrori che riesci a scrivere...

 No, nel BAS non compare la variabile "locale"
perdindirindindindindina :)
allora che cavolo hai messo nel bas ?


 Scusa ma, lo fanno capire certi orrori che riesci a scrivere...
Nulla di cui scusarti!
Avete / Hai perfettamente ragione e per questo chiedo aiuto qui se non 
riesco da solo a superare questi ostacoli per voi banali ma per me 
"spaccatesta"!
(G)

 "spaccatesta"!
qui non sei da solo.
ma se salclem -- ch'e' sveglio assai -- ti da' una dritta e tu non ci
ragioni, ti vai a incantonare per conto tuo. e rischi di innervosire anche
chi ti aiuta.
ciao, a.
btw: perche' salclem2? esistono dei salclem1 ? :)

 e stai usando il newsgroup come hotline, il che non va proprio bene.
E questo mi dispiace molto, perň ti assicuro che non č nelle mie intenzioni.
Che male c'č a chiedere cortesemente aiuto (e NON certo pretenderlo!) a chi 
č piů esperto se io da solo non riesco a capire quello che leggo sui testi 
specifici?
Comunque grazie per avermi "avvisato" circa la "brutta-piega".
(G) 

specifici?
  C'e' di male che stai instasando il newsgroup con messaggi che
spesso hanno un subject cinofallico e sono pieni di domande elementari
che non dovrebbero essere fatte da chi studia il VB in maniera
ordinata.


 spesso hanno un subject cinofallico
:-)
Hai ragione e mi scuso ancora.
(G)

 IDcli = Val(RecLibro.l1)
Non e' che non fai la Get dal file...?
Comunque anche io ti suggerirei una cosetta: quando non ti funziona qualcosa 
(oltretutto qualcosa di estremamente semplice come il fatto di valorizzare e 
testare una variabile globale), prima di postare sul ng, fai un progettino 
di prova essenziale che faccia solo la cosa che non ti funziona, come gia' 
ho provato a farti fare io.
Ad esempio,
- fai un progetto nuovo, aggiungi due form ed un modulo;
- dichiara una variabile Public MiaVar as Long *solo* nel modulo;
- sempre nel modulo, aggiungi una Sub Main:
Sub Main()
    MiaVar = 100
    Form1.Show
    Form2.Show
End Sub
- modifica opportunamente le proprieta' del progetto per farlo partire con 
la Sub Main;
- in ognuno dei due form aggiungi una casella di testo e tre pulsanti;
- rinomina i tre pulsanti come segue: "cmdAssegna", "cmdMostra", 
"cmdApriAltroForm";
- valorizza le proprieta' Caption dei tre pulsanti come segue: "Assegna 
valore alla variabile", "Mostra valore della variabile", "Apri altro form";
- ad ognuno dei due form aggiungi il seguente codice:
Private Sub cmdAssegna_Click()
    MiaVar = CLng(Val(Me.Text1))
End Sub
Private Sub cmdMostra_Click()
    Me.Text1 = CStr(MiaVar)
End Sub
Private Sub Form_Load()
    Me.Text1 = CStr(MiaVar)
End Sub
- nel form Form1, aggiungi alla procedura che gestisce l'evento click del 
mouse il codice seguente:
Private Sub cmdApriForm_Click()
    Form2.Show
End Sub
- nel form Form2, aggiungi alla procedura che gestisce l'evento click del 
mouse il codice seguente:
Private Sub cmdApriForm_Click()
    Form1.Show
End Sub
- esegui e prova a modificare il valore nella casella di testo di uno dei 
due form;
- clicca sul pulsante "Assegna valore alla variabile";
- porta in primo piano l'altro form e fai click sul pulsante "Mostra valore 
della variabile" dell'altro form;
- fai un po' di prove inserendo valori diversi nelle caselle di testo, 
assegnando e mostrando il valore della variabile, chiudendo e aprendo i form 
e vedrai che, finche' il programma rimane in esecuzione, il valore della 
variabile rimane quello atteso e viene visto allo stesso modo da entrambi i 
form.
I tuoi post rivelano il fatto che le tue difficolta' non sono dovute solo 
alla scarsa conoscenza dello strumento utilizzato (VB6), ma alla mancanza di 
conoscenza di concetti elementari di programmazione. Anche il fatto che 
continui a ripetere di non riuscire a far funzionare nessuno degli esempi 
proposti dai libri che consulti, e' probabilmente dovuto ad una certa 
superficialita' del tuo approccio.
Evidentemente sei immerso nel frenetico tentativo di arrivare subito al 
risultato... ma cosi' facendo rischi di non arrivarci o di arrivarci con un 
software disordinato, zeppo di bachi e che ti dara' enormi problemi di 
manutenzione, pur facendo operazioni di complessita' minima. Rischi di veder 
comparire nel tuo software problemi su problemi dai quali ti sara' 
estremamente difficile districarti proprio perche' si trattera' di errori 
logici. Insomma, massimo sforzo per il minimo risultato.
Tutto cio', ripeto, non perche' lo strumento utilizzato (VB6) sia di 
particolarmente difficile comprensione.
Inoltre, come dovresti vedere da te, rischi di fare il deserto attorno a te 
nel ng e di non trovare piu' disponibilita' all'aiuto. Nessuno nasce 
"imparato", ma... per imparare un minimo di metodo e di ordine occorre 
averlo.
Ciao!
    Alex

 End Sub
Ovviamente avrebbe dovuto essere cosi':
- rinomina i tre pulsanti come segue: "cmdAssegna", "cmdMostra", 
"cmdApriForm";
[...]
'Form1:
Private Sub cmdApriForm_Click()
    Form2.Show
End Sub
'Form2:
Private Sub cmdApriForm_Click()
    Form1.Show
End Sub
Riciao!
    Alex