AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

10.3.1: OnActivate wird vor OnCreate ausgeführt

Ein Thema von Bbommel · begonnen am 21. Mär 2019 · letzter Beitrag vom 26. Mär 2019
Antwort Antwort
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
989 Beiträge
 
Delphi 6 Professional
 
#1

AW: 10.3.1: OnActivate wird vor OnCreate ausgeführt

  Alt 23. Mär 2019, 23:42
Hmm..

Also, wenn ich meine D6 Applikation minimiere und dann wieder hochhole wird bei mir nur OnPaint aufgerufen, jedoch kein OnShow und somit kein AfterShow.
(Windows 8.1 64Bit auf Notebook)

Ich dachte es geht um OnActivate VOR OnShow?
Es sollte doch in der VM falsch sein...

Teste mal mit meinem Tool, ob auch dort AfterShow vor OnCreate kommt...
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#2

AW: 10.3.1: OnActivate wird vor OnCreate ausgeführt

  Alt 23. Mär 2019, 23:57
Zitat:
Es sollte doch in der VM falsch sein...
In zwei VMs konnte ich das nicht richtig nachvollziehen. Getestet aber leider nur unter Windows XP und 7.
Ich habe dort dieselben Ergebnisse bekommen wie unter dem Windows 10 Host.

Zitat:
Teste mal mit meinem Tool, ob auch dort AfterShow vor OnCreate kommt...
Windows 10 Host, Windows XP und 7 Gast alles wie es sein soll. Vielleicht doch ein Delphi-Problem (was es bei D6 noch nicht gab) und weniger Windows?

Zum Minimieren:
ich meine zum Systemtray, also komplett weg aus der Taskleiste und nur noch ein kleines Icon im Statusbereich.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.752 Beiträge
 
Delphi 12 Athens
 
#3

AW: 10.3.1: OnActivate wird vor OnCreate ausgeführt

  Alt 24. Mär 2019, 10:27
Vielleicht doch ein Delphi-Problem (was es bei D6 noch nicht gab) und weniger Windows?
Spielt eigentlich keine Rolle. Wenn es wirklich an der Windows-Version (und vermutlich einem Haufen anderer Bedingungen für das System) liegt, dann kann man das ja in Delphi abfangen und passend lösen. Dazu müsste man es aber halt schon reproduzieren können. Leider genügte keine der bisherigen Beschreibungen dieser Anforderung.

Der Hinweis auf das SetFocusControl und die DPI Umrechnung ist ja durchaus hilfreich. Ohne einen reproduzierbaren Testfall ist es aber nahezu unmöglich den Fehler zu lokalisieren und zu beheben.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Bbommel
Online

Registriert seit: 27. Jun 2007
Ort: Köln
672 Beiträge
 
Delphi 12 Athens
 
#4

AW: 10.3.1: OnActivate wird vor OnCreate ausgeführt

  Alt 25. Mär 2019, 07:57
Der Hinweis auf das SetFocusControl und die DPI Umrechnung ist ja durchaus hilfreich. Ohne einen reproduzierbaren Testfall ist es aber nahezu unmöglich den Fehler zu lokalisieren und zu beheben.
Jepp, das sehe ich ähnlich, daher habe ich auch noch nichts bei Emba gemeldet bisher. Da es in einem anderen Thread (nicht von mir) Thema war, bei dem es auch um die Kombination Rio+Win8.1 ging, hier noch der Hinweis, dass es der VMware Workstation Player in der Version 12 ist. Windows ist die Version 6.3 Build 9600.

Weitere Tests, die ich gerade noch gemacht habe: ändere ich in der VM die Skalierung von den aktuell 125% auf 150%, dann tritt der Effekt ebenfalls auf. Ändere ich die Skalierung auf 100%, dann tritt der Effekt nicht auf.

Ändere ich im Form das Scaled auf "false" (Danke an Edelfix für den Querverweis), dann tritt das Problem nicht mehr auf.

Und die Codestelle, die, wenn das Problem auftritt, letztlich verantwortlich ist, ist die folgende Funktion in VCL.Forms:

Delphi-Quellcode:
procedure TCustomForm.ScaleNormalSize(M, D: Integer);
var
  WindowPlacement: TWindowPlacement;
begin
  if WindowState = wsMaximized then
  begin
    WindowPlacement.length := SizeOf(WindowPlacement);
    if GetWindowPlacement(Handle, @WindowPlacement) then
    begin
      WindowPlacement.rcNormalPosition.Right := WindowPlacement.rcNormalPosition.Left
        + MulDiv(WindowPlacement.rcNormalPosition.Width, M, D);
      WindowPlacement.rcNormalPosition.Bottom := WindowPlacement.rcNormalPosition.Top
        + MulDiv(WindowPlacement.rcNormalPosition.Height, M, D);
      SetWindowPlacement(Handle, @WindowPlacement);
    end;
  end;
end;
Die letzte Zeile, also das SetWindowPlacement, ist ein WinAPI-Aufruf, durch den dann letztlich das vorzeitige Activate vom Formular ausgelöst wird.

Soweit mein Stand der Forschung.
  Mit Zitat antworten Zitat
DenkDirNix

Registriert seit: 13. Dez 2018
76 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: 10.3.1: OnActivate wird vor OnCreate ausgeführt

  Alt 25. Mär 2019, 10:25
Zur grundlegenden Frage "welches Ereignis kommt wann" hatte ich mal ein kleines Tool geschrieben das zu Fragen dieser Art vielleicht interessant ist.

Es werden alle in den WindowProcs() der vorhandenen Kompoonenten sowie in Application.OnMessage() ankommenden Botschaften decodiert und auf CodeSite ausgegeben, außerdem "einige" VCL-Ereignisse. Die Schachtelung wird ggf durch das Einrücken angezeigt.
Mit den CheckBoxen der rechten Hälfte kann man etwas Selektieren, es kommt sonst sehr viel!

Werde das Ganze bei Gelegenheit noch etwas aufhübschen und mit Quellen hier posten.
Wie oben schon gesagt: CodeSite wird benötigt.
Angehängte Dateien
Dateityp: zip WinMessages.zip (3,61 MB, 4x aufgerufen)
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
778 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: 10.3.1: OnActivate wird vor OnCreate ausgeführt

  Alt 25. Mär 2019, 10:36
Bei meinem Windows (10.0.17763 Build 17763) und Delphi (10.3 Version 26.0.33219.4899) gleich.

Ich benötige auch nur - wie weiter oben beschrieben wird - 2 Formulare und nur 1 Monitor für Activate vor Create.

Erstes Formular: nix ändern
Zweites Formular: WindowsState=wsMaximized

Wenn ich das nun mit Anzeigeeinstellung >100% laufen lasse, dann werden beide Formulare angezeigt. Beim ersten Formular wie erwartet: Create vor Activate. Beim zweiten Formular: Wider Erwarten wird es angezeigt und Activate vor Create. Formular 2 lässt sich nicht schliessen. (Create 1 -> Activate 2 -> Create 2 -> Activate 1)

Wenn ich Anzeigeeinstellung 100% wähle, dann wird wie erwartet nur Formular 1 angezeigt.

Wenn ich für Formular 2 Scaled=FALSE setze, dann funktioniert's unabhängig von der Anzeigeeinstellung wie erwartet.
Michael Gasser

Geändert von Michael II (25. Mär 2019 um 10:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.752 Beiträge
 
Delphi 12 Athens
 
#7

AW: 10.3.1: OnActivate wird vor OnCreate ausgeführt

  Alt 25. Mär 2019, 10:56
Delphi-Quellcode:
procedure TCustomForm.ScaleNormalSize(M, D: Integer);
var
  WindowPlacement: TWindowPlacement;
begin
  if WindowState = wsMaximized then
  begin

Da fehlt eine Abfrage auf HandleAllocated . Das müsste so lauten:
Delphi-Quellcode:
  if (WindowState = wsMaximized) and HandleAllocated then
  begin
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Bbommel
Online

Registriert seit: 27. Jun 2007
Ort: Köln
672 Beiträge
 
Delphi 12 Athens
 
#8

AW: 10.3.1: OnActivate wird vor OnCreate ausgeführt

  Alt 25. Mär 2019, 11:04
Da fehlt eine Abfrage auf HandleAllocated .
Danke! Das heißt, das könnte man dann so mit dem Lösungsvorschlag bei Emba melden, oder?
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
778 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: 10.3.1: OnActivate wird vor OnCreate ausgeführt

  Alt 25. Mär 2019, 11:19
Genau... Uwe war schneller..
Es reicht natürlich auch nur ein Formular und ein Monitor und windowstate=wsmaximized für Activate vor Create. Wenn skaliert wird, dann biegt man hier ab:

Delphi-Quellcode:
procedure TCustomForm.ScaleForCurrentDpi;

    if ShouldScale(self) then
und landet da:

Delphi-Quellcode:
procedure TCustomForm.ScaleNormalSize(M, D: Integer);
var
  WindowPlacement: TWindowPlacement;
begin
  if WindowState = wsMaximized then

   SetWindowPlacement(Handle, @WindowPlacement); // => OnActivate
Aber da ist das Formular noch im state fsCreating.
Michael Gasser
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz