2009-09-08 8 views
5

Sto tentando di compilare un'applicazione VB6, ma non riesce con l'errore "Errore run-time" 91 ": Variabile oggetto o Con variabile di blocco non impostata". Si scopre che l'evento Resize di un controllo utente viene attivato durante la compilazione e il codice chiamante che tenta di accedere a un oggetto che non è stato ancora istanziato.Perché un evento si attiva durante la compilazione di un'app VB6?

Perché un evento si attiva durante la compilazione e c'è un modo per fermarlo?


Edit: Ho avuto un certo codice qui, ma non è rilevante. Il problema deriva dal fatto che il codice UserControl (ovvero gli eventi Initialize, ReadProperties, Resize e WriteProperties) può essere eseguito in momenti imprevisti. Se il codice in questi eventi si basa su un altro codice per inizializzare una qualsiasi delle sue strutture dati, ci sono buone probabilità che fallisca perché il codice di inizializzazione potrebbe non essere stato eseguito. Soprattutto durante la compilazione quando nulla dovrebbe essere in esecuzione! Lo definirei un bug, ma sono sicuro che Microsoft possa razionalizzarlo in qualche modo.

+1

lo fa punto da uno specifico blocco di codice nel tuo compilazione (su debug)? Se è così, puoi incollarlo qui? Inoltre, sei sicuro di non essere "Building and Running" che lo farebbe costruire e poi bombardare quando tenta di eseguire (quindi, l'errore di run time)? – JasCav

risposta

6

Ecco un buon articolo sulla ai cicli di vita degli eventi di controllo utente

Understanding Control Lifetime and Key Events

Ecco un frammento di

compilazione del progetto

Quando il progetto viene compilato in un applicazione o componente, Visual Basic carica tutti i file di modulo in modo invisibile, uno dopo l'altro, per scrivere le informazioni che contengono nel file compilato . Un'istanza di controllo ottiene gli eventi Initialize, ReadProperties e WriteProperties. Le impostazioni della proprietà del controllo sono compilate in l'eseguibile finito.

Non menziona il ridimensionamento (che si verifica durante l'esecuzione o quando si ridimensiona fisicamente l'usercontrol su un contenitore in fase di progettazione). Forse il tuo evento Initialize sta ridimensionando il controllo utente?

Per evitare l'errore si può verificare se l'oggetto incriminato è stata creata prima di fare qualsiasi cosa:

If Not Object Is Nothing then 
    do something 
+0

Un altro snippet dice: * Ogni volta che un utente esegue l'applicazione o il componente installato e il modulo viene caricato, il controllo riceve gli eventi Initialize, ReadProperties e Resize. * Se i moduli vengono caricati in modo invisibile, ciò spiegherebbe perché questo evento viene attivato . – raven

1

Penso che alcuni eventi per i controlli utente vengano eseguiti durante la fase di progettazione, almeno allo scopo di renderli coerenti.

+0

Nel caso di controlli utente, questo include UserControl_Initialize() ... che può attivare eventi. – Brian

+0

Possono fare molto di più. Vedi la proprietà EditAtDesignTime di un UserControl. – Bob77