Moin Thomas!
[schnibbel]
Post by Thomas GrotePost by Harald M. GenauckNach dem Schließen der Forms (wie sieht Dein Code dazu aus?) nochmal
Forms.Count geprüft, ob tatsächlich alle Forms geschlossen sind?
Private Sub MDIForm_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Dim i%
'Formulare schließen
For i = Forms.Count - 1 To 0 Step -1
Unload Forms(i)
Rem Set Forms(i) = Nothing /verursacht Fehler.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Diese Zeile ist gemeinhin auch völlig unnötig!
^^^^^^^^^^^^^^^^
Au fein! Wieder einmal jemand, der am kommenden Freitag etwas vor
hat (kleiner Hinweis: Du wirst einer der Hauptakteure sein...) ;-))
Post by Thomas GroteEnd Sub
Ich habe ein wenig herum experimentiert und herausgefunden, dass im "Unload"
Ereignis "Forms.Count " immer 1 ermittelt wird, auch wenn noch mehrere Forms
(Zb. MDI Childs)geladen sind. Im "QueryUnload" Event wird offenbar die
richtige Anzahl Forms ermittelt. Scheint jetzt so zu funktionieren. Bin
[schnibbel]
Das Dein Code "funktioniert" liegt an dem verfluchten Befehl nach dem
"Next i". Dieser Befehl bewirkt in Deinem Programm das gleiche, als ob
im übertragenen Sinne ein Busfahrer an der Endhaltestelle den Bus in
die Luft sprengen würde, nur um die letzten Fahrgäste loszuwerden. Und
wieder im übertragenen Sinne zeigen die tragischen Bilder aus London,
wohin das dann im Betriebssystem führen kann. :-(
Es gibt zwar leider einige zwingende Gründe für den Einsatz dieses
Befehls, jedoch sollten diese mit mindestens 1 kB Kommentar versehen
sein. Solche Gründe können u.a. schlampig programmierte Steuerelemente
oder Komponenten von Drittherstellern sein, manchmal der Einsatz des
MSComm-Steuerelementes (s.vorheriges), die Vermeidung des Startes
mehrerer AX-Exe-Instanzen (s. VB-Doku) und einiges Wenige mehr. (Und
bevor ein krankes Hirn auf eine vermeindliche Analogie kommen sollte:
Nein - auch im übertragenen Sinne rechtfertigt das unter keinen
Umständen Bombenanschläge!)
Wenn also das eben Ausgeführte auf Dein Programm nicht zutrifft, dann
liegt der Fehler in Deinem Code selbst. So sind laufende Schleifen und
DB-Zugriffe ein beliebter Fehler. Genauso gerne und immer wieder genommen
sind nicht angehaltene Timer auf Formularen / Benutzersteuerelementen.
Und natürlich auch schon die von Harald genannten Fehler.
Daher ist es für eine saubere Programmierung unerläßlich, ein Objekt
immer ordentlich aufzuräumen. In Klassen und Steuerelementen
ist dafür das Terminate-Ereignis prädestiniert, in Formularen sollte es
das Unload oder QueryUnload-Ereignis sein. Und das gilt für ALLE
Objekte!
In diesen Ereignissen sollten alle anstehenden Aktionen abgeschlossen,
alle Schleifen geschlossen und alle modulweiten Objekte auf Nothing
gesetzt werden. Letzteres ist zwar nur Optik (VB macht das alleine),
hilft aber manchmal beim Debuggen.
In einem Formular könnte das dann so aussehen:
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
'Timer immer zuerst deaktivieren, um nicht von Ereignissen
'derselben "überrascht" zu werden.
Timer1.Enabled = false
Timer1.Intervall = 0
mAdoCon.Close 'Hier ggf. das Close-Ereignis abwarten
'oder die State-Eigenschaft auswerten.
mEinAnderesObjekt.StopArbeit 'Auch hier anhalten.
End Sub
Wenn Du so vorgehst, wirst Du keine Probleme mehr haben, Deine
Anwendung zu beenden.
Viel Schleifen
Gerrit
--
-------------------------------------------------------
KUH-SOFT - Die Software von glücklichen Programmierern
Bahrenfelder Steindamm 100 - D 22761 Hamburg
eMail: ***@kuh-soft.de
Home: http://www.kuh-soft.de