![]() |
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:
Auf meinem PC sind 20 Durchläufe meist schon zu wenig, aber solche Überlegungen sind ja Quatsch.
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; Wie macht man es richtig? Gibt es irgendeine schlaue Windows-Botschaft welche das Fenster erhält? |
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? |
AW: VCL: Wann ist ein Formular fertig gerendert?
Ich benutze leider schon das
Delphi-Quellcode:
. Etwas "späteres" kenne ich nicht.
OnActivate
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:
. Und die 10ms sind im Endeffekt dann auch nur geraten.
macheScreenshot('Abb. 35')
(Höre mich evtl. undankbar an. Nicht meine Absicht, vielen Dank für die Hilfe!) |
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 |
AW: VCL: Wann ist ein Formular fertig gerendert?
Zitat:
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:
Oder alternativ das was Lemmy schrieb.
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; |
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 ![]() |
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