Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Beenden eines Programms und Aufruf von Form.Activate


Gunther Troost - Mi 04.03.20 11:09
Titel: Beenden eines Programms und Aufruf von Form.Activate
Ich wundere mich etwas, aber wer weiß, vielleicht ist das normal.

Beim Beenden des Programms mit Application.Terminate wird nach dem Abschluss des Prozeduraufrufs die Prozedur Mainform.Activate aufgerufen. Das hat jetzt nicht so besonders schlimme Auswirkungen, doch das wundert mich etwas, weil ja das Programm beendet wird und möglicherweise gewisse Komponenten schon "zerstört" sind, so dass deren Aufruf dann Probleme bereiten könnte. Überhaupt ist diese Prozedur Terminate sehr aufwendig, weil sämtliche Komponenten zerstört und deren Notification-Prozeduren noch abgehandelt werden, was bei der Fehlersuche dann sehr umständlich ist, weil ich in dem Programm mehrere hundert Komponenten auf den jeweiligen Formularen habe. Aber egal, muss wohl so sein.
Aber dass bei dem Beenden eine Formularaktivierungsroutine aufgerufen wird? Hat das möglicherweise damit zu tun, dass bei irgendeiner der Komponenten bei dessen "Zerstörung" die Prozedur aufgerufen wird? Ich suche schon, wo ich das vielleicht unbeabsichtigt programmiert habe. Ich nehme schon die OnChange-Prozeduren so wenig wie möglich in Anspruch, weil die sowieso ständig dazwischenfunken, besonders beim Zerstören eines Objekts. Doch den Verursacher bei der Vielzahl von Abbruchprozeduren der Objekte zu finden ist schlichtweg eine Geduldssache.

Wer kann mir da eine Antwort geben?

Für Eure Hilfe bin ich Euch dankbar.

Liebe Grüße und Gesundheit

Gunther Troost


Moderiert von user profile iconTh69: Topic aus WinForms verschoben am Mi 04.03.2020 um 16:00


Th69 - Mi 04.03.20 12:22

Du meinst für ein Delphi-Programm (nicht .NET), oder?


jaenicke - Mi 04.03.20 13:16

user profile iconGunther Troost hat folgendes geschrieben Zum zitierten Posting springen:
Beim Beenden des Programms mit Application.Terminate wird nach dem Abschluss des Prozeduraufrufs die Prozedur Mainform.Activate aufgerufen.
Bei mir nicht. Wie sieht an der Stelle denn der Stacktrace aus?


Gunther Troost - Mi 04.03.20 18:21

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Du meinst für ein Delphi-Programm (nicht .NET), oder?


Ja, es betrifft ein Delphiprogramm.


Gunther Troost - Mi 04.03.20 18:37

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconGunther Troost hat folgendes geschrieben Zum zitierten Posting springen:
Beim Beenden des Programms mit Application.Terminate wird nach dem Abschluss des Prozeduraufrufs die Prozedur Mainform.Activate aufgerufen.
Bei mir nicht. Wie sieht an der Stelle denn der Stacktrace aus?


Da steht außer der Prozedur Formactivate nur das Hauptprogramm. Wenn ich da auf das Hauptprogramm klicke, kommt der Zeiger auf die "RUN"-Prozedur in der .dpr-Datei. Sonst sind keine weiteren Prozeduren aufgelistet. Zur Zeit geht mir allerdings mein Laptop dermaßen auf den Geist. Das Linken dauert gefühlte 10 Minuten. GRRRRRR! Aber der Laptop war schon immer dermaßen lahmarschig. Denn alle Programme laufen auf dem schleichend. Ich habe schon mehrfach gestestet, ob da nicht ein Virus aktiv sei, aber der Defender zeigt nichts an.


Sinspin - Do 05.03.20 08:42

Zum Speed, da ist ne SSD drinne? Besorg die mal Process Explorer von Sysinternals. Damit kann man auch nach Flaschen mit engen Hälsen suchen.

Zum Problem, verwendest du ein Bugreport Tool? MadExcept oder so? Wenn ja, löß da mal ne Exception aus (natürlich nur beim Beenden) der Stacktrace da ist im Regelfall etwas umfangreicher. Das er richtiger ist ist allerdings nicht garantiert :wink:


jaenicke - Do 05.03.20 17:47

user profile iconGunther Troost hat folgendes geschrieben Zum zitierten Posting springen:
Da steht außer der Prozedur Formactivate nur das Hauptprogramm. Wenn ich da auf das Hauptprogramm klicke, kommt der Zeiger auf die "RUN"-Prozedur in der .dpr-Datei.
Komisch, nur diese beiden Zeilen?
Dann bleibt nur Debug-DCUs zu aktivieren und nach dem end deines OnActivate Ereignisses mit F7 weiter zu debuggen.

user profile iconGunther Troost hat folgendes geschrieben Zum zitierten Posting springen:
Zur Zeit geht mir allerdings mein Laptop dermaßen auf den Geist. Das Linken dauert gefühlte 10 Minuten. GRRRRRR! Aber der Laptop war schon immer dermaßen lahmarschig. Denn alle Programme laufen auf dem schleichend. Ich habe schon mehrfach gestestet, ob da nicht ein Virus aktiv sei, aber der Defender zeigt nichts an.
Das liegt vermutlich am Defender. Der ist leider (trotz anders lautender Testergebnisse) teilweise wirklich furchtbar was die Performance angeht. Bei Antivirenprogrammen habe ich mit den kostenlosen Varianten bisher leider nur Probleme gehabt bzw. bei anderen beobachtet, egal welches...

Der Taskmanager zeigt unter dem Reiter Leistung an wo der Flaschenhals liegt (CPU, Festplatte, ...) und unter dem ersten Reiter Prozesse siehst du welcher Prozess da bremst. Bei dir dürfte das "Antimalware Executable" oder so ähnlich sein.