Entwickler-Ecke

Visual Component Library (VCL) - Nach Programmstart und Anzeige automatische Routine starten


LigH - Mo 26.02.07 16:05
Titel: Nach Programmstart und Anzeige automatische Routine starten
Nach Programmstart und Anzeige automatische Routine starten

Sicherlich sind schon viele Leute darauf hereingefallen, irgend etwas im Form.OnCreate-Handler tun zu wollen, weil der nur einmal beim Programmstart aufgerufen wird, und dann festzustellen, dass zu diesem Zeitpunkt noch nicht das komplette Programm wirklich mit Inhalt existiert, insbesondere noch keine weiteren Fenster. Die Balance zu finden zwischen "nur beim Programmstart" und "erst wenn das Hauptfenster dargestellt wurde" ist nicht leicht ohne ausreichend Hintergrundwissen.

Ich habe mir mal ein paar Abläufe von Programmstarts protokollieren lassen und festgestellt, dass die wichtigsten Ereignisse von TForm und TApplicationEvents in der Reihenfolge

  1. Delphi-Quelltext
    1:
    TForm.OnCreate                    


  2. Delphi-Quelltext
    1:
    TForm.OnShow                    


  3. Delphi-Quelltext
    1:
    TForm.OnActivate                    


  4. Delphi-Quelltext
    1:
    TForm.OnPaint                    


  5. Delphi-Quelltext
    1:
    TApplicationEvents.OnIdle                    

gestartet werden, und daher folgender Ablauf im Allgemeinen zu funktionieren scheint:

Das könnte dann etwa so aussehen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
unit MainUnit; 

interface 

uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, ComCtrls, AppEvnts; 

type 
  TfmMain = class(TForm) 
    stbStatus: TStatusBar; 
    aeAppEvents: TApplicationEvents; 
    procedure FormCreate(Sender: TObject); 
    procedure aeAppEventsIdle(Sender: TObject; var Done: Boolean); 
  private 
    { Private-Deklarationen } 
    initializing: Boolean; 
    procedure AutoInit; 
  public 
    { Public-Deklarationen } 
  end

var 
  fmMain: TfmMain; 

implementation 

{$R *.dfm} 

{ TfmMain } 

procedure TfmMain.FormCreate(Sender: TObject); 
begin 
  initializing := true; 
end

procedure TfmMain.AutoInit; 
begin 
  stbStatus.SimpleText := 'Initialisierung'
end

procedure TfmMain.aeAppEventsIdle(Sender: TObject; var Done: Boolean); 
begin 
  if initializing then begin 
    initializing := false; 
    AutoInit; 
  end
  Done := true; 
end

end.


Alternativen dazu wären: