Delphi-PRAXiS
Seite 2 von 8     12 34     Letzte »    

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/)
-   -   10.3.1: OnActivate wird vor OnCreate ausgeführt (https://www.delphipraxis.net/200117-10-3-1-onactivate-wird-vor-oncreate-ausgefuehrt.html)

Bbommel 21. Mär 2019 21:14

AW: 10.3.1: OnActivate wird vor OnCreate ausgeführt
 
Zitat:

Zitat von hoika (Beitrag 1428319)
Hallo,
Zitat:

Aber ich würde immer noch gerne die Ursache verstehen und ob es wirklich ein Fehler von mir ist oder ein Bug in der VCL.
Wo ist das Problem?
Binde deine verwendeten Komponenten immer weiter ein und finde die, die Murks macht.

Ja, klar, das wäre die Notlösung. Das wird allerdings auch einiges an Bastelei, vielleicht würde ich dann doch einfach aufgeben und es halt doch einfach so hinnehmen. ;-)

Ich hatte gehofft, dass es eine Funktion aus den Standard-Units gibt, die benutzt wird, um das WM_ACTIVATE-Event anzulegen. Dann könnte man ja da einen Breakpoint reinsetzen und schauen, von wo aus das aufgerufen wird.

Bbommel 21. Mär 2019 21:16

AW: 10.3.1: OnActivate wird vor OnCreate ausgeführt
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1428321)
Bist du sicher, daß es wirklich vor dem OnCreate aufgerufen wird oder eventuell auch innerhalb des OnCreate, noch bevor das fertig ist?

Ich hatte Breakpoints auf jeweils der ersten Zeile von meinem FormActivate und vom FormCreate. Die erste Zeile vom Activate wurde vor der ersten Zeile vom Create ausgeführt.

Uwe Raabe 21. Mär 2019 23:07

AW: 10.3.1: OnActivate wird vor OnCreate ausgeführt
 
Zitat:

Zitat von Bbommel (Beitrag 1428325)
Ich hatte gehofft, dass es eine Funktion aus den Standard-Units gibt, die benutzt wird, um das WM_ACTIVATE-Event anzulegen. Dann könnte man ja da einen Breakpoint reinsetzen und schauen, von wo aus das aufgerufen wird.

Das WM_ACTIVATE wird vom OS gesendet und kommt in der Anwendung in TCustomForm.WMActivate an. Es gibt meines Wissens keine Stelle, in der die VCL selbst ein WM_ACTIVATE absetzt.

Aber das WM_ACTIVATE löst den FormActivate Event gar nicht direkt aus. Dies geschieht in einer CM_ACTIVATE Message und diese wird an verschiedenen Stellen in einem Form ausgelöst: SetFocusedControl, ShowModal oder als Folge einer empfangenen WM_ACTIVATEAPP Message.

Gibt es vielleicht irgendwo einen Aufruf von Applicatition.ProcessMessages?
Welche Einstellung hat das Form-Property OldCreateOrder?

Bbommel 22. Mär 2019 10:29

AW: 10.3.1: OnActivate wird vor OnCreate ausgeführt
 
Hmh, es scheint so, als würde das Activate beim Fokussieren des PageControl auf dem Formular ausgelöst, und in den aufrufenden Funktionen davor passiert irgendwas mit einer Umrechnung wegen DPI. Ich vermute da irgendwo jetzt ein Problem vielleicht auch gerade im Zuammenspiel mit Win 8.1.

Um die Fragen noch zu beantworten:
OldCreationOrder ist false und war es auch immer. Aber auch ein Setzen von OldCreationOrder auf true ändert nichts - das Activate wird auch dann vorher ausgeführt.

Application.ProcessMessages kommt in meinem Programm an ein paar wenigen Stellen vor, aber nicht beim Initialisieren. Sicherheitshalber habe ich in die ProcessMessages aber auch mal einen Breakpoint gesetzt, um zu testen, ob es nicht doch schon versehentlich irgendwo aufgerufen wird. Wird es nicht.

Ich gebe die Ursachenforschung jetzt erst einmal auf - um das Formular Stück für Stück auseinanderzunehmen oder zu versuchen, noch tiefer in die VCL abzustiegen und rauszufinden, wo ein entscheidender Unterschied zwischen 10.2.3 und 10.3.1 ist, fehlt mir leider gerade die Zeit. Ich nehme es also erst einmal so hin, dass Activate und Create in umgekehrter Reihenfolge auftreten können und werde das mit Statusvariablen entsprechend abfangen (bzw. habe das in meiner 10.3-Spielwiese getan). Dann funktioniert das Programm ansonsten problemlos.

Danke für eure Anregungen!

hoika 22. Mär 2019 12:02

AW: 10.3.1: OnActivate wird vor OnCreate ausgeführt
 
Hallo,
Zitat:

beim Fokussieren des PageControl auf dem Formular
Den Fokus sollte man frühestens im OnShow, besser aber im OnActivate setzen,
weil vorher das Fenster (das eigentliche Windows-Fenster) noch gar nicht erzeugt ist.

hoika 22. Mär 2019 12:21

AW: 10.3.1: OnActivate wird vor OnCreate ausgeführt
 
Hallo,
Zitat:

Es gibt meines Wissens keine Stelle, in der die VCL selbst ein WM_ACTIVATE absetzt.
Die VCL nicht, aber diverse Fremd-Komponenten, z.B. der TAdvDateTimePicker.
Der schickt ein WM_ACTIVATE an sein Parent beim CloseUp seines Auswahlfeldes.

Ich habe mir deshalb angewöhnt, als erstes im FormActivate ein OnActivate=nil zu machen,
um die Ereignisbehandlung nicht mehrfach auszulösen.

Uwe Raabe 22. Mär 2019 12:42

AW: 10.3.1: OnActivate wird vor OnCreate ausgeführt
 
Zitat:

Zitat von Bbommel (Beitrag 1428365)
es scheint so, als würde das Activate beim Fokussieren des PageControl auf dem Formular ausgelöst

Das deckt sich mit meinen Erkenntnissen:
Zitat:

Zitat von Uwe Raabe (Beitrag 1428330)
Dies geschieht in einer CM_ACTIVATE Message und diese wird an verschiedenen Stellen in einem Form ausgelöst: SetFocusedControl



Zitat:

Zitat von Bbommel (Beitrag 1428365)
in den aufrufenden Funktionen davor passiert irgendwas mit einer Umrechnung wegen DPI.

In dem Bereich gibt es allerdings gravierende Unterschiede zwischen Rio und Tokyo.

Bbommel 22. Mär 2019 14:53

AW: 10.3.1: OnActivate wird vor OnCreate ausgeführt
 
Zitat:

Zitat von hoika (Beitrag 1428372)
Zitat:

beim Fokussieren des PageControl auf dem Formular
Den Fokus sollte man frühestens im OnShow, besser aber im OnActivate setzen,
weil vorher das Fenster (das eigentliche Windows-Fenster) noch gar nicht erzeugt ist.

Ja, das sehe ich genauso. :-) Falls das missverständlich war: dieses SetFocus vom PageControl ist auch nichts, was ich selber mache, sondern das passiert halt innerhalb irgendwelcher VCL-Routinen. Wie geschrieben: wenn ich es einigermaßen eingegrenzt habe, dann passiert es in der Folge irgendwelcher DPI-Geschichten.

Zitat:

Zitat von hoika (Beitrag 1428375)
Zitat:

Es gibt meines Wissens keine Stelle, in der die VCL selbst ein WM_ACTIVATE absetzt.
Die VCL nicht, aber diverse Fremd-Komponenten, z.B. der TAdvDateTimePicker.
Der schickt ein WM_ACTIVATE an sein Parent beim CloseUp seines Auswahlfeldes.

An Fremdkomponenten habe ich nur pgDAC und VST. Beide kommen aber im Hauptformular, um das es hier geht, nicht vor, pgDAC nutze ich auch sonst nur im Code und nicht als Komponente.

Zitat:

Zitat von Uwe Raabe (Beitrag 1428381)
Zitat:

Zitat von Bbommel (Beitrag 1428365)
es scheint so, als würde das Activate beim Fokussieren des PageControl auf dem Formular ausgelöst

Das deckt sich mit meinen Erkenntnissen:

Jepp, so war es auch gemeint. :-)

Zitat:

Zitat von Uwe Raabe (Beitrag 1428381)
Zitat:

Zitat von Bbommel (Beitrag 1428365)
in den aufrufenden Funktionen davor passiert irgendwas mit einer Umrechnung wegen DPI.

In dem Bereich gibt es allerdings gravierende Unterschiede zwischen Rio und Tokyo.

Ich meinte, das auch im Hinterkopf gehabt zu haben - Danke für die Bestätigung. Vielleicht sind es ja dann tatsächlich ungewollte Nebeneffekte der Änderungen in dem Bereich.

hoika 22. Mär 2019 15:49

AW: 10.3.1: OnActivate wird vor OnCreate ausgeführt
 
Hallo,
das sind aber doch seeeehr gravierende Änderungen, oha.

Bbommel 22. Mär 2019 15:54

AW: 10.3.1: OnActivate wird vor OnCreate ausgeführt
 
*** Update: ich konnte das Problem mit einer neuen, leeren Anwendung reproduzieren ***

Vorgehen: neue, leere VCL-Anwendung erstellen. Dem Form1 den WindowsState Maximized zuweisen. Die beiden Events OnActivate und OnCreate werden mit folgendem Code versorgt:

Delphi-Quellcode:
procedure TForm1.FormActivate(Sender: TObject);
begin
  ShowMessage('activate');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowMessage('create');
end;
Die Anwendung starten.

Ergebnis unter Win 8.1 in der VM: activate läuft vor create.
Ergebnis unter Win 10 ohne VM: create läuft vor activate.

Das is'n Bug, oder? Denn die Doku gibt die Reihenfolge der Events ja eigentlich vor (siehe hier: http://docwiki.embarcadero.com/Libra...mForm.OnCreate)

Vielleicht haben wir ja zusammen die Chance, es weiter einzugrenzen, in welcher Konstellation der Fehler genau auftritt. Falls jemand z.B. ein Win 8.1 ohne VM hätte, könnte man es ja mal da testen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:50 Uhr.
Seite 2 von 8     12 34     Letzte »    

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