Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Beim anzeigen meines Programmes aus der Taskleiste Hauptform nicht anzeigen (https://www.delphipraxis.net/189989-beim-anzeigen-meines-programmes-aus-der-taskleiste-hauptform-nicht-anzeigen.html)

RandomDD 17. Aug 2016 21:48


Beim anzeigen meines Programmes aus der Taskleiste Hauptform nicht anzeigen
 
Mein Programm macht ab und zu Berechnungen die etwa 3 Minuten dauern können.
Wenn man es dann in die Taskleiste minimiert, wird ein Form am Bildschirmrand angezeigt wo der aktuelle Status angezeigt wird.

Wenn ich auf mein Programmsymbol in der Taskleiste klicke kommt mein Programm wieder nach oben und dann soll das Formular am Bildschirmrand weggehen.

Kann ich irgendwie anders als mit ApplicationEvents OnRestore auf das wiederhochholen des Fensters reagieren?
OnRestore klappt nicht weil mein Programm während der Berechnung in einer Procedur hängt.

sh17 17. Aug 2016 22:32

AW: Beim anzeigen meines Programmes aus der Taskleiste Hauptform nicht anzeigen
 
Ist denn die Prozedur in einen Thread bzw asynchronen Task ausgelagert?

RandomDD 17. Aug 2016 22:36

AW: Beim anzeigen meines Programmes aus der Taskleiste Hauptform nicht anzeigen
 
Die Prozedur ist in einem Thread ausgelagert. Im Thread selber wird aber auf VCL-Elemente der Hauptform zugegriffen.
Hab mittlerweile alles getestet. Ob mit Thread oder ohne, kommt alles aufs gleiche raus > OnRestore wird nicht aufgerufen.

Ich bräuchte eine Art Code die Checkt, ob FormX sichtbar ist.
Hatte diesen Check in einen eigenen Thread ausgelagert hat aber auch nicht geklappt.

Aviator 18. Aug 2016 10:54

AW: Beim anzeigen meines Programmes aus der Taskleiste Hauptform nicht anzeigen
 
Zitat:

Zitat von RandomDD (Beitrag 1345077)
Im Thread selber wird aber auf VCL-Elemente der Hauptform zugegriffen.

Das solltest du so nicht tun. Früher oder später könnte dir das um die Ohren fliegen. Das klingt eben fast so, als ob du dir die Daten mit denen du rechnest aus dem VCL-Komponenten ziehst und diese nicht aus einer eigenen Klasseninstanz liest. Da wird wohl deine Programmarchitektur ein wenig falsch aufgebaut sein.

RandomDD 18. Aug 2016 11:17

AW: Beim anzeigen meines Programmes aus der Taskleiste Hauptform nicht anzeigen
 
Danke für deinen Post.
Ich habe den gesamten Code wieder aus dem Thread genommen. Er rennt jetzt wieder im Hauptthread der Anwendung.
Grund ist, dass der Thread keine ABhilfe geschafft hat.

Was ich im Prinzip brauche ist eine ALternative zu Application.OnRestore.
Ein OnRestore (Klick auf mein Icon in der Taskleiste) was eben auch auslöst, wenn ich in einer Prozedur bin.

Aviator 18. Aug 2016 11:31

AW: Beim anzeigen meines Programmes aus der Taskleiste Hauptform nicht anzeigen
 
Das Event würde auslösen, wenn du aus deinem Thread nicht auf die MainForm zugreifen würdest. Durch den Zugriff auf die MainForm aus dem Thread heraus ist es so, als würdest du gar keinen Thread verwenden. Somit wird die GUI blockiert und kann auch keine Events (oder nur verzögert) auslösen.

Was genau bezweckst du denn mit dem Zugriff auf deine MainForm? Nimmst du dir von dort die Daten oder willst du dort was aktualisieren? Wenn ja, dann löse Events aus dem Thread mit
Delphi-Quellcode:
Synchronize()
aus um was zu aktualisieren. Die Daten die du im Thread benötigst um zu rechnen solltest du mit einer Klasseninstanz an deinen Thread übergeben, sodass der Zugriff auf deine MainForm wegfällt.

RandomDD 18. Aug 2016 11:44

AW: Beim anzeigen meines Programmes aus der Taskleiste Hauptform nicht anzeigen
 
Synchronise ist eine gute Idee, danke.
Viele Variablen kann ich leider nicht an die Klasse binden und dort ändern, da sie auch an anderen Stellen benötigt werden.

Also grob gesagt: wenn ich Synchronize verwende ist alles halbwegs in Butter?

Bleibt nur das Problem mit der blockierten GUI und dem nicht auslösenden OnRestore. Das bekomme ich wahrscheinlich gar nicht weg oder?

Luckie 18. Aug 2016 11:54

AW: Beim anzeigen meines Programmes aus der Taskleiste Hauptform nicht anzeigen
 
Doch indem du den blockierenden Code in einen Thread auslagerst. Dann reagiert deine GUI auch wieder. Natürlich wird das wieder hinfällig, wenn du ständig aus dem Thread raus die GUI aktualisierst.

stahli 18. Aug 2016 11:56

AW: Beim anzeigen meines Programmes aus der Taskleiste Hauptform nicht anzeigen
 
Hier ist eine schöne Zusammenfassung zur Thread-Synchronisation: https://www.youtube.com/watch?v=Jhcpgjs1uPA

p80286 18. Aug 2016 12:19

AW: Beim anzeigen meines Programmes aus der Taskleiste Hauptform nicht anzeigen
 
Zitat:

Zitat von RandomDD (Beitrag 1345136)
Synchronise ist eine gute Idee, danke.
Viele Variablen kann ich leider nicht an die Klasse binden und dort ändern, da sie auch an anderen Stellen benötigt werden.

Darum bekommt dein Thread ja auch eine Kopie der Daten

Zitat:

Zitat von RandomDD (Beitrag 1345136)
Also grob gesagt: wenn ich Synchronize verwende ist alles halbwegs in Butter?

Falls Du z.B. nur Daten für eine Fortschrittsanzeige hast, ist
Delphi-Quellcode:
postmessage
voll und ganz ausreichend.

Zitat:

Zitat von RandomDD (Beitrag 1345136)
Bleibt nur das Problem mit der blockierten GUI und dem nicht auslösenden OnRestore. Das bekomme ich wahrscheinlich gar nicht weg oder?

Solange Du keinen Entwurf machst, der alle Ansprüche an und in Deinem Programm berücksichtigt, Nein!

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz