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 VCL: Wann ist ein Formular fertig gerendert? (https://www.delphipraxis.net/187109-vcl-wann-ist-ein-formular-fertig-gerendert.html)

Der schöne Günther 28. Okt 2015 10:56

VCL: Wann ist ein Formular fertig gerendert?
 
Ich habe mir für ein Programm einen Automatismus gebaut welcher alle für das Handbuch benötigten Screenshots selber anfertigt. Mein Problem: Man darf die Screenshots nicht zu früh machen da das Formular dann noch nicht fertig gezeichnet ist. Oder Windows spielt noch seine Einblende-Animation ab und das Fenster ist noch halb durchsichtig, solche Dinge halt.

Was kann man tun? Meine folgende Behelfslösung ist ja das unfeinste was man hätte tun können:
Delphi-Quellcode:
procedure TWinControlHelper.pauseForABit();
const
   loopCount = 50;
var
   loopNo: Integer;
begin
   Repaint();
   for loopNo := 0 to Pred(loopCount) do begin
      TThread.Sleep(10);
      Application.ProcessMessages();
      Application.ProcessMessages();
      Application.ProcessMessages();
   end;
end;
Auf meinem PC sind 20 Durchläufe meist schon zu wenig, aber solche Überlegungen sind ja Quatsch.
Wie macht man es richtig? Gibt es irgendeine schlaue Windows-Botschaft welche das Fenster erhält?

TiGü 28. Okt 2015 11:20

AW: VCL: Wann ist ein Formular fertig gerendert?
 
Würde es nicht ausreichen, wenn du dich ans TCustomForm.OnActivate hängst?
Die Aufrufreihenfolge ist ja FormCreate -> FormShow -> FormActivate.
Musst halt mal probieren, ob dein Formular dann schon steht.

Oder im FormActivate einen Timer (10 ms?) anstoßen, im OnTimer Screenshot machen und Timer deaktiveren?

Der schöne Günther 28. Okt 2015 11:23

AW: VCL: Wann ist ein Formular fertig gerendert?
 
Ich benutze leider schon das
Delphi-Quellcode:
OnActivate
. Etwas "späteres" kenne ich nicht.

Auf jedes Formular jetzt noch einen Timer zu packen, Events verdrahten und alles ist leider zu viel Aufwand. Bislang bin ich bei jedem Formular im OnActivate nur hingegangen und habe sage nur noch
Delphi-Quellcode:
macheScreenshot('Abb. 35')
. Und die 10ms sind im Endeffekt dann auch nur geraten.

(Höre mich evtl. undankbar an. Nicht meine Absicht, vielen Dank für die Hilfe!)

Lemmy 28. Okt 2015 11:26

AW: VCL: Wann ist ein Formular fertig gerendert?
 
Dann schick dir doch in OnActivate einfach eine Windows-Message und mach den Screenshot dort - damit hast Du dann quasi ein OnAfterActivate ;-)

Grüße

TiGü 28. Okt 2015 11:39

AW: VCL: Wann ist ein Formular fertig gerendert?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1319945)
Auf jedes Formular jetzt noch einen Timer zu packen, Events verdrahten und alles ist leider zu viel Aufwand. Bislang bin ich bei jedem Formular im OnActivate nur hingegangen und habe sage nur noch
Delphi-Quellcode:
macheScreenshot('Abb. 35')
. Und die 10ms sind im Endeffekt dann auch nur geraten.

Und wenn du es einfach im übergeordneten Formular machst?
Deine ganzen Formulare hast du ja sicherlich nicht von TForm abgeleitet sondern von TGünnisUrsprungAllerDingeForm, oder?

Dann könntest du ganz bequem das machen:

Delphi-Quellcode:
procedure TGünnisUrsprungAllerDingeForm.OnTimer(Sender: TObject);
begin
  if Sender is TTimer then
  begin
    TTimer(Sender).Enabled := False;
    ShowMessage('Mache Screenshot!');
//    Sender.Free; <- einkommentieren, wenn Owner vom Timer nil anstatt Self ist!
  end;
end;

procedure TGünnisUrsprungAllerDingeForm.FormActivate(Sender: TObject);
var
  LTimer: TTimer;
begin
  LTimer := TTimer.Create(Self);
  LTimer.OnTimer := OnTimer;
  LTimer.Interval := 2000;
  LTimer.Enabled := True;
end;
Oder alternativ das was Lemmy schrieb.

Sir Rufo 28. Okt 2015 11:56

AW: VCL: Wann ist ein Formular fertig gerendert?
 
Eine Form ist dann mit rendern fertig, wenn die Anwendung wieder im Idle-Modus ist (wenn wir Animationen jetzt mal aussen vor lassen, das wäre ein völlig anderes Thema).

In Delphi-Referenz durchsuchenTApplicationEvent.OnIdle könnte man dann nach der Action den Screenshot vornehmen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 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