Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Frage zu FormCreate (https://www.delphipraxis.net/114271-frage-zu-formcreate.html)

S20000 22. Mai 2008 15:35


Frage zu FormCreate
 
Hallo zusammen,

ich habe eine Anfängerfrage.
Wenn ich folgenden Quelltext in Delphi
einbinde:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
showmessage('Hallo');
end;

end.
Dann wird mir zuerst die message angezeigt, und erst nachdem
ich auf ok geklickt habe wird das Hauptfenster
Form1 erzeugt. Wie kann ich den bewirken,
das erst das Hauptfenster und dann erst die message,
oder was auch immer dann folgt ausgeführt wird.

Gruß
Sebastian

Die Muhkuh 22. Mai 2008 15:36

Re: Frage zu FormCreate
 
Hi,

versuch mal OnShow, anstatt OnCreate.

S20000 22. Mai 2008 15:48

Re: Frage zu FormCreate
 
Hallo,

hat leider den gleichen Effekt, erst Message Box, dann die Form1

Die Muhkuh 22. Mai 2008 15:50

Re: Frage zu FormCreate
 
Dann versuch OnActivate :D

RavenIV 22. Mai 2008 15:51

Re: Frage zu FormCreate
 
Das wird so aber auch in OnShow nicht funktionieren.
Das ShowMessage hält die Verwarbeitung solange auf, bis der Button gedrückt wurde und das MessageFenster weg ist.
Also wird das Formular auch erst angezeigt, wenn die Message bestätigt wurde.

Die Muhkuh 22. Mai 2008 15:52

Re: Frage zu FormCreate
 
Also mit OnActivate seh ich die Form und die MessageBox. Sollte also klappen. Hab's eben getestet.

Apollonius 22. Mai 2008 15:52

Re: Frage zu FormCreate
 
Allerdings wird OnActivate bei jedem Hervorholen aufgerufen.

RavenIV 22. Mai 2008 15:53

Re: Frage zu FormCreate
 
Zitat:

Zitat von Apollonius
Allerdings wird OnActivate bei jedem Hervorholen aufgerufen.

Dann muss man sich halt merken, dass es das erste Mal war.

Die Muhkuh 22. Mai 2008 15:54

Re: Frage zu FormCreate
 
Das ist klar, aber mittels bool'scher Variable kann man das ja nur einmal aufrufen lassen. :zwinker:

HiWieGehts 22. Mai 2008 15:55

Re: Frage zu FormCreate
 
Hallo,

OnCreate und OnShow werden aufgerufen, bevor die Form angezeigt wird. Daher auch das von die beschriebene verhalten.
Mache aus deinem TForm1.FormCreate ein TForm1.InitShowMessage. Diese rufst du dann nachdem Show für Form1 auf.
Eine weitere, nicht sehr schöne Möglichkeit, ist die Verwendung eines Timers. Diesen startest du im OnCreate oder OnShow und im OnTimer mache dein ShowMessage.

LG, HiWieGehts

RavenIV 22. Mai 2008 16:00

Re: Frage zu FormCreate
 
Zitat:

Zitat von HiWieGehts
OnCreate und OnShow werden aufgerufen, bevor die Form angezeigt wird. Daher auch das von die beschriebene verhalten.
Mache aus deinem TForm1.FormCreate ein TForm1.InitShowMessage. Diese rufst du dann nachdem Show für Form1 auf.
Eine weitere, nicht sehr schöne Möglichkeit, ist die Verwendung eines Timers. Diesen startest du im OnCreate oder OnShow und im OnTimer mache dein ShowMessage.

Dann doch lieber OnActivate mit einem Merker.
Alles andere ist Murks.
Das hätten die Leute bei meinem alten Arbeitgeber so gemacht, weill sie Luschen sind und es nicht besser konnten.

HiWieGehts 22. Mai 2008 16:07

Re: Frage zu FormCreate
 
Zitat:

Zitat von RavenIV
Zitat:

Zitat von HiWieGehts
OnCreate und OnShow werden aufgerufen, bevor die Form angezeigt wird. Daher auch das von die beschriebene verhalten.
Mache aus deinem TForm1.FormCreate ein TForm1.InitShowMessage. Diese rufst du dann nachdem Show für Form1 auf.
Eine weitere, nicht sehr schöne Möglichkeit, ist die Verwendung eines Timers. Diesen startest du im OnCreate oder OnShow und im OnTimer mache dein ShowMessage.

Dann doch lieber OnActivate mit einem Merker.
Alles andere ist Murks.
Das hätten die Leute bei meinem alten Arbeitgeber so gemacht, weill sie Luschen sind und es nicht besser konnten.

So eine Antwort kann wohl nur jemand schreiben, der beim Lesen einer Zeile die vorhergehende schon wieder vergessen hat.

S20000 22. Mai 2008 16:08

Re: Frage zu FormCreate
 
Hi,

kannst du das etwas näher erklären?

Zitat:

Mache aus deinem TForm1.FormCreate ein TForm1.InitShowMessage. Diese rufst du dann nachdem Show für Form1 auf.

Die Muhkuh 22. Mai 2008 16:10

Re: Frage zu FormCreate
 
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    [...]
  private
    FFirstShow: Boolean;
  end;

implementation

procedure TForm1.Create(Sender: TObject);
begin
  FFirstShow := true;
end;

procedure TForm1.Activate(Sender: TObject);
begin
  if (FFirstShow) then
  begin
    ShowMessage('Hallo!');
    FFirstShow := false;
  end;
end;
Btw. stimme ich Raven zu, dass das mit dem Marker die eleganteste Lösung ist.

dominikkv 22. Mai 2008 16:13

Re: Frage zu FormCreate
 
oder du regelst das ganze gleich in der Projektdatei (Projekt -> Quelltext anzeigen)

Apollonius 22. Mai 2008 16:18

Re: Frage zu FormCreate
 
Das geht nicht. Die Formulare werden erst in Application.Run angezeigt, und das kehrt erst ganz am Ende zurück.

Die Muhkuh 22. Mai 2008 16:19

Re: Frage zu FormCreate
 
"Falsch", werden sie nicht. :zwinker:

Nutze in meinem Projekt folgendes:

Delphi-Quellcode:
begin
  Application.Initialize;

  flogin := Tflogin.Create(Application);
  if flogin.ShowModal = mrOK then
  begin
    Application.CreateForm(Tfmain, fmain);
    Application.Run;
  end;
end.
Geht ohne Probleme ;)

Apollonius 22. Mai 2008 16:22

Re: Frage zu FormCreate
 
Ja, ShowModal kann Application.Run ersetzen, wie man im VCL-Code sieht.

S20000 22. Mai 2008 16:25

Re: Frage zu FormCreate
 
Vielen Dank, die Idee mit dem Merker ist gut!

dominikkv 22. Mai 2008 16:26

Re: Frage zu FormCreate
 
Zitat:

Zitat von Apollonius
Das geht nicht. Die Formulare werden erst in Application.Run angezeigt, und das kehrt erst ganz am Ende zurück.

Delphi-Quellcode:
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);

  Form1.Show;
  Form1.Refresh;
  Form1.MyOwnCreate; // Eigene procedure, hier kannst du deine nachricht anzeigen lassen

  Application.Run;
end.

Apollonius 22. Mai 2008 16:27

Re: Frage zu FormCreate
 
Okay, ihr habt gewonnen. Nur zum Anzeigen braucht man ja keine Nachrichtenschleife.

HiWieGehts 22. Mai 2008 16:28

Re: Frage zu FormCreate
 
Zitat:

Zitat von S20000
Hi,

kannst du das etwas näher erklären?

Zitat:

Mache aus deinem TForm1.FormCreate ein TForm1.InitShowMessage. Diese rufst du dann nachdem Show für Form1 auf.

Procedure TForm1.InitShowMessage;
begin
ShowMessage('Hallo!');
end;

Procedure TFormMain.Irgendwas;
begin
..
..
Form1.Show;
Form1.InitShowMessage;
end;

Das funktioniert aber nur, wenn es sich bei Form1 nicht um die Hauptform des Programms handelt.

Wenn dein Ziel ein Splash Screens ist, solltest du mal danach suchen - dafür gibt es fertige Lösungsvorschläge.

LG, HiWieGehts

Die Muhkuh 22. Mai 2008 16:30

Re: Frage zu FormCreate
 
Warum so umständlich? Das mit bool'scher Variable und OnActivate funktioniert 1a.


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