Ereignis für Startprozedur

Rund um die LCL und andere Komponenten
Antworten
Kegel
Beiträge: 3
Registriert: Mo 9. Nov 2009, 16:29

Ereignis für Startprozedur

Beitrag von Kegel »

Hallo,
kann mir jemand das Ereignis nennen welches man benutzen muss um nach dem Start einer Anwendung sofort etwas laufen zu lassen.
Dabei sollte das Hauptfenster schon voll aufgebaut auf dem Bildschirm zu sehen sein.
Bei "OnPaint" ist das Hauptfenster noch nicht vollständig.
Bei "OnCreate", "OnShow", "OnActivate", .. ist das Fenster noch nicht zu sehen und erscheint erst nach Ablauf der Startprozedur.

Hartmut

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6837
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Ereignis für Startprozedur

Beitrag von af0815 »

Bsp: In OnActivate einen Timer starten (und gegen nochmaliges Aufrufen verriegeln) und dann in der Timerprozedure das was man will starten.

OnActivate ist deshalb gut, weil es unmittelbar vor jedem aktivwerden des Fensters kommt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Ereignis für Startprozedur

Beitrag von theo »

Ich würde es so machen:

Code: Alles auswählen

procedure TForm1.Async(Data: PtrInt);
begin
  ShowMessage('test');
end;      
 
procedure TForm1.FormShow(Sender: TObject);
begin
  Application.QueueAsyncCall(@Async,0);
end;

lrlr
Beiträge: 127
Registriert: Di 3. Nov 2009, 09:48

Re: Ereignis für Startprozedur

Beitrag von lrlr »

mit PostMessage eine message schicken.. an form.handle

oder einen normalen timer (der ist auch message basiert) mit 0ms verwenden (im formShow aktivieren) und beim execute wieder deaktivieren)

edit: QueueAsyncCall schaut eleganter aus, gibt es aber unter delphi nicht (falls da ein kriterium wäre...)

Kegel
Beiträge: 3
Registriert: Mo 9. Nov 2009, 16:29

Re: Ereignis für Startprozedur

Beitrag von Kegel »

theo hat geschrieben:Ich würde es so machen:

Code: Alles auswählen

procedure TForm1.Async(Data: PtrInt);
begin
  ShowMessage('test');
end;      
 
procedure TForm1.FormShow(Sender: TObject);
begin
  Application.QueueAsyncCall(@Async,0);
end;
Hallo theo und die anderen,
vielen Dank für die schnellen Anworten.
Welche von den Prozeduren muss ich an "OnActivate" hängen?
Vielen Dank Hartmut

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Ereignis für Startprozedur

Beitrag von theo »

Kegel hat geschrieben: Welche von den Prozeduren muss ich an "OnActivate" hängen?
Wie meinst du das?

OnShow -> procedure TForm1.FormShow(Sender: TObject);

Kegel
Beiträge: 3
Registriert: Mo 9. Nov 2009, 16:29

Re: Ereignis für Startprozedur

Beitrag von Kegel »

theo hat geschrieben:
Kegel hat geschrieben: Welche von den Prozeduren muss ich an "OnActivate" hängen?
Wie meinst du das?

OnShow -> procedure TForm1.FormShow(Sender: TObject);
Hallo theo,
jetzt funktioniert es - vielen Dank - habe die (meine) FormShow an "OnShow" (in der IDE) hinterlegt.
Beim Compilieren komm zwar "Hint Parameter Data not used" aber das ist egal.
Und so ricthig verstehen tu ich es auch noch nicht.
Vielen Dank Hartmut

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Ereignis für Startprozedur

Beitrag von pluto »

Du kannst meines Wissens durch Komplierschalter auch die Ausgabe von Hinweisen verhindern.

@Theo
Wie wäre es, deinen Tipp in die "Wissens-DB" einzubringen ? Das ist zwar keine Standard Frage, aber dafür gibt es ja bereits andere Foren. Ich meine diesen hier "http://www.lazarusforum.de/viewtopic.php?f=21&t=1043&view=unread#unread"
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Ereignis für Startprozedur

Beitrag von theo »

pluto hat geschrieben: Wie wäre es, deinen Tipp in die "Wissens-DB" einzubringen ?
Da gibt's schon was im Wiki:
http://wiki.lazarus.freepascal.org/Asynchronous_Calls" onclick="window.open(this.href);return false;

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Ereignis für Startprozedur

Beitrag von Scotty »

Noch eine Variante: Ich verbinde Application.OnIdle in OnCreate und innerhalb der DoIdle()-Methode setze ich dann Application.OnIdle auf nil.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Ereignis für Startprozedur

Beitrag von Socke »

Es gibt auch einen Event-Handler, der nur beim ersten Aufruf eines Formulars ausgeführt wird. OnFromShow wird bei jedem Anzeigen ausgeführt (minimieren, verstecken, etc.).
Dazu braucht man nur eine Funktion vom Typ TNotifyEvent und man muss diese Funktion manuell (in OnCreate oder im Constructor) registrieren:

Code: Alles auswählen

procedure TForm1.FirstShow(Sender: TObject);
begin
  // was getan werden muss
end;
procedure TForm1.OnCreate(Sender: TObject); // muss mit OnCreate verknüpft sein
begin
  Self.AddHandlerFirstShow(@FirstShow);
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Ereignis für Startprozedur

Beitrag von pluto »

Ich hätte ja einfach eine Boolean Variable genommen und sie unter z.b. onActivate gepackt und dort auf True gestellt. bei OnCrete würde ich sie mit False belegen.
MFG
Michael Springwald

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Ereignis für Startprozedur

Beitrag von Socke »

Wie wir sehen, führen viele Wege nach Rom und einige sogar zu einem Segmentation Fault (also die Klippe runter oder so) :P
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Ereignis für Startprozedur

Beitrag von theo »

Socke hat geschrieben:OnFromShow wird bei jedem Anzeigen ausgeführt (minimieren, verstecken, etc.).
Meines Wissens wird FormShow nur beim ersten Anzeigen und bei Show(); bzw. Visible:=true; aufgerufen.
Andere Fälle sind mir nicht bekannt.
Für ein Hauptfenster also normalerweise nur beim Start.
Ist also unbedenklich für Hauptfenster, wenn man es nicht hidet, was eigentlich nie der Fall sein sollte.

Antworten