Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Welches Event nach Formshow?


motion - Di 08.05.07 16:55
Titel: Welches Event nach Formshow?
Welches Event im Leben eines Formulars feuert nach Formshow?
Ich muß eine Aktion starten (Abfrage eines Wertes per Modalem Eingabedialog), sobald das Fenster sichtbar ist.
Mache ich den Aufruf im FormShow Eventhandler, ist leider das eigentliche unter dem Eingabedialog liegende Fenster noch nicht zu sehen.


jakobwenzel - Di 08.05.07 16:56

Kannst du nicht beim aufrufen zuerst das alte Formular verstecken und dann das neue Zeigen?


BenBE - Di 08.05.07 17:03

Du kannst das ganze mit OnActivate des Formulars machen, musst dann aber als erstes in der Behandlung den Event-Handler für OnActivate auf Nil setzen, bevor Du die eigentliche Aufgabe ausführst.


Lannes - Di 08.05.07 19:03

Hallo,

oder mit PostMessage und WM_AFTER_SHOW , poste mal eine komplette Beispiel-Unit, ist ja nicht viel:

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:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
const
  WM_AFTER_SHOW = WM_USER + 300// custom message
type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    procedure WmAfterShow(var Msg: TMessage); message WM_AFTER_SHOW;
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WmAfterShow(var Msg: TMessage);
begin
  ShowMessage('Hallo');
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  PostMessage(Self.Handle, WM_AFTER_SHOW, 00);
end;

end.


motion - Di 08.05.07 19:13

@jakobwenzel:
Nein, weil das aufrufende Fenster unabhängig im Hintergrund bleibt. Also
Form_Lagerverwaltung -> Form_"schnell-Inventur" -> EingabeDialog Buchungstext (modal)

Form_schnell-Inventur wird per SHOW, nicht showmodal, aufgerufen, so das die Lagerverwaltung parallel weiter genutzt werden kann. Die Schnell-inventur soll also sichtbar werden und dann als erstes gleich der Modale Eingabedialog erscheinen. Der Aufruf des Eingabe-Dialogs ist hier die Frage.

@BenBE: ich hab's mal versucht:
ErsterAufruf:Boolean

im Formcreate: ErsterAufruf:=True;


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm_Assi_Inventur.FormActivate(Sender: TObject);
begin
  inherited;
  If ErsterAufruf then
    Begin
      ErsterAufruf:=False;
      AbfrageString(Titel,'Bitte geben Sie den Buchungstext ein, der in der'+CRLF+'Artikelhistorie erscheinen soll','Buchungstext',self,Buchungstext,TBvO_edit,False);
      AnzeigeBuchungstext.Caption:=Buchungstext;
    End;
end;


Funktioniert leider nicht. Der Eingabedialog wird angezeigt, aber das aufrufende Form ist noch nicht zu sehen.
Habe ich da noch was übersehen?


Lannes - Do 10.05.07 11:22

Hallo,

user profile iconmotion hat folgendes geschrieben:
...
Habe ich da noch was übersehen?

eventuell meinen Beitrag :wink:

hab entsprechend Deiner Vorgabe das nochmal getestet:

-> Form_Lagerverwaltung
-> Form_schnell-Inventur.Show <--- in der Unit mein Code-Vorschlag
-> EingabeDialog.ShowModal

Es funktioniert, der EingabeDialog wird zusammen mit Form_schnell-Inventur angezeigt.


motion - Do 10.05.07 11:38

@Lannes:
In der Tat, Deinen Beitrag (10 Min. vor meiner Antwort) habe ich nicht gesehen.
Hatte wohl eine Antwort begonnen, BEVOR Du geantwortest hast und dann NACH Deiner gepostet.
Wie dem auch sei:
Sehr gute und elegante Lösung!
Das ich mit Form-Vererbung arbeite, nehme ich diese Erweiterung in meinem Basis-Form vor und kann es dann in allen abgeleiteten Fenstern verwenden.

Vielen Dank