Newsgroup: it.comp.lang.visual-basic
Titolo: Non sapevo

 Trovato un bug in un mio programma e imparato una cosa nuova.
In formA scrivo:
x= formB.top
Ora se formB è caricato tutto bene, altrimenti viene caricato (senza essere 
visualizzato e subito chiuso) e viene anche eseguito tutto il codice che si 
trova nell'evento load, con tutto quello che ne consegue nel bene e nel 
male.
Io pensavo, erroneamente, che il valore .top venisse memorizzato, e poi 
letto da qualche parte, invece viene letto dal vivo.
-- 
Greg 

 ha scritto

direi che ogni volta che chiami una proprieta' di un controllo, se non e' 
caricato lo carica.
e d'altra parte come puo' un form avere un top se non e' caricato?
se ti serve e non si deve vedere il form, memorizzi il top prima di 
scaricarlo, o nascondi il form.
ciao, a. 

 letto da qualche parte, invece viene letto dal vivo.
Se ci pensi bene è un valore relativo alla form. Per leggerlo la form deve
essere caricata.

 End With
In questi casi io preferisco fare così, evitando tra l'altro di usare 
l'istanza predefinita:
Dim frm As New frmInputDati
    If frm.ShowDialog() Then
        '... prende i risultati
    End If
Nel form frmInputDati, con i classici bottoni cmdOK e cmdCancel:
Private mResult   As Boolean
Public Function ShowDialog() As Boolean
    mResult = False
    Me.Show vbModal
    ShowDialog = mResult
End Function
Private Sub cmdCancel_Click()
    Unload Me
End Sub
Private Sub cmdOK_Click()
    mResult = True
    Unload Me
End Sub
Bye
Raf 

greg ha detto questo mercoledì :

Sarebbe stato memorizzato da qualche parte, se .Top fosse un attributo 
della form.
Invece è una proprietà.
E le proprietà, come i metodi, esistono e 'girano' solo se l'oggetto è 
istanziato. E l'istanziarsi di una form è il suo caricamento, ossia il 
Load.
Più che una peculiarità della form, quindi, ciò che hai osservato è una 
cosa intrinseca del concetto della programmazione a oggetti.
Ciao
Alberto
-- 
La forza di volontà è guardare negli occhi una ragazza in topless.

 Load.
In realtà (in "Classic" VB) c'è una sottile differenza: per oggetti come 
form e controlli ci sono 2 "categorie" di membri: quelli intrinseci e quelli 
definiti dall'utente.
L'accesso ai membri intrinseci della classe Form causa un caricamento 
implicito del form (tutti, anche quelli non "visuali" come ad esempio Name e 
Tag).
L'accesso a quelli eventualmente definiti dall'utente invece no (a meno che 
a loro volta non accedano a membri intrinseci).
Di conseguenza è possibile creare una nuova istanza di form e accedere a 
membri definiti dall'utente senza che venga mai innescato il Form_Load.
Per incasinare ancora di più le cose, Classic VB ha il concetto di "istanza 
predefinita" di form, che nelle prime versioni di 
VB.NET
 era stato 
(giustamente IMHO) abbandonato.
Ciao
Raf 

 End Sub
A parte la sintassi forse piů pulita, ci sono vantaggi, oppure il metodo č
analogo?
Il fatto di istanziarne una nuova ogni volta, immagino sia per evitare
problemi se viene richiamata da piů parti.
In ogni caso le form di input sono solitamente legate a braccetto col
chiamante, a volte ritorno un valore, a volte un recordset filtrato, a
volte una collection ecc.
L'unica standard potrebbe essere la classica finestrina con griglia per
ricerca valori (es. elenco codici articolo, elenco clienti, elenco cod.iva
ecc.), alla quale faccio ritornare un Rs Filtrato se č avvenuta la scelta,
altrimenti torna EOF.
E tale finestrina la chiamo da una function globale del tipo:
Set Rs = CercaCampo("NOMETABELLA", "NOMECAMPOID")

 membri definiti dall'utente senza che venga mai innescato il Form_Load.
Appunto.
Alberto
-- 
Noi ammazziamo solo per motivi buoni.
E quando sono buoni, sta a noi indicarlo.
[Guccini]

 Set Rs = CercaCampo("NOMETABELLA", "NOMECAMPOID")
Giusto.
Bye
Raf 


mmm, non hai letto nessun manuale prima di metterti a programmare?
(non è un'offesa nè un flame!)
ciao
--
AranBanjo
Blog contest:
http://blog.ponchio.it/index.php?/archives/49-Halloween-Contest.html