2009-09-08 8 views
5

Próbuję skompilować aplikację VB6, ale nie powiedzie się z powodu błędu "Błąd wykonania" 91 ': Zmienna obiektowa lub Z ustawioną zmienną blokową ". Okazuje się, że zdarzenie Resize kontrolki użytkownika jest uruchamiane podczas kompilacji i wywoływania kodu, który próbuje uzyskać dostęp do obiektu, który nie został jeszcze utworzony.Dlaczego wydarzenie jest uruchamiane podczas kompilacji aplikacji VB6?

Dlaczego wydarzenie jest uruchamiane podczas kompilacji i czy istnieje sposób, aby to zatrzymać?


Edit: Miałem jakiś kod tutaj, ale to nie jest istotne. Problem wynika z faktu, że kod UserControl (mianowicie zdarzenia Initialize, ReadProperties, Resize i WriteProperties) może być wykonywany w nieoczekiwanych momentach. Jeśli kod w tych zdarzeniach opiera się na innym kodzie w celu zainicjowania dowolnej struktury danych, istnieje duża szansa, że ​​zakończy się niepowodzeniem, ponieważ ten kod inicjujący mógł nie zostać wykonany. Szczególnie podczas kompilacji, kiedy nic nie ma być wykonywane! Nazwałbym to błędem, ale jestem pewien, że Microsoft może jakoś to zracjonalizować.

+1

Czy to punkt do konkretnego bloku kodu w kompilacji (do debugowania)? Jeśli tak, czy możesz go tutaj wkleić? Dodatkowo, czy jesteś pewien, że nie jesteś "Building and Running", który spowodowałby jego zbudowanie, a następnie zbombardował, gdy spróbuje uruchomić (stąd błąd czasu wykonywania)? – JasCav

Odpowiedz

6

Oto jest dobry artykuł na lifecyle zdarzeń kontrolnych użytkownik

Understanding Control Lifetime and Key Events

Oto jeden fragment

Kompilacja Projektu

Gdy projekt jest kompilowany do w aplikacja lub składnik, Visual Basic ładuje wszystkie pliki formularzy w sposób niewidoczny, jeden po drugim, aby zapisać zawarte w nich informacje do skompilowanego pliku . Instancja sterowania otrzymuje zdarzenia Initialize, ReadProperties i WriteProperties. Ustawienia właściwości kontrolki są kompilowane w gotowy plik wykonywalny .

Nie wspomina o zmianie rozmiaru (która ma miejsce podczas wykonywania lub kiedy fizycznie zmieniamy kontrolę użytkownika na kontenerze w czasie projektowania). Może zdarzenie Initialize zmienia rozmiar kontrolki użytkownika?

Aby uniknąć błędu można sprawdzić, czy obiekt wykraczająca został stworzony zanim cokolwiek:

If Not Object Is Nothing then 
    do something 
+0

Inny fragment kodu mówi: * Za każdym razem, gdy użytkownik uruchamia zainstalowaną aplikację lub komponent, a formularz jest ładowany, formant otrzymuje zdarzenia Initialize, ReadProperties i Resize. * Jeśli formularze są ładowane niewidocznie, może to tłumaczyć, dlaczego to zdarzenie jest uruchamiane . – raven

1

Wydaje mi się, że niektóre zdarzenia związane z kontrolkami użytkownika są wykonywane podczas projektowania, przynajmniej w celu ich renderowania w spójny sposób.

+0

W przypadku kontroli użytkownika obejmuje to UserControl_Initialize() ..., która może powodować zdarzenia. – Brian

+0

Mogą zrobić o wiele więcej. Zobacz właściwość EditAtDesignTime w UserControl. – Bob77

Powiązane problemy