AGB  ·  Datenschutz  ·  Impressum  







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

VCL: Wann ist ein Formular fertig gerendert?

Ein Thema von Der schöne Günther · begonnen am 28. Okt 2015 · letzter Beitrag vom 28. Okt 2015
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

VCL: Wann ist ein Formular fertig gerendert?

  Alt 28. Okt 2015, 10:56
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?
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: VCL: Wann ist ein Formular fertig gerendert?

  Alt 28. Okt 2015, 11:20
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?
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: VCL: Wann ist ein Formular fertig gerendert?

  Alt 28. Okt 2015, 11:23
Ich benutze leider schon das 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 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!)
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.366 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: VCL: Wann ist ein Formular fertig gerendert?

  Alt 28. Okt 2015, 11:26
Dann schick dir doch in OnActivate einfach eine Windows-Message und mach den Screenshot dort - damit hast Du dann quasi ein OnAfterActivate

Grüße
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: VCL: Wann ist ein Formular fertig gerendert?

  Alt 28. Okt 2015, 11:39
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 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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: VCL: Wann ist ein Formular fertig gerendert?

  Alt 28. Okt 2015, 11:56
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  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 15:39 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