Autor |
Beitrag |
GuaAck
      
Beiträge: 378
Erhaltene Danke: 32
Windows 8.1
Delphi 10.4 Comm. Edition
|
Verfasst: Mi 13.02.13 00:24
Hallo,
ich möchte mein eher allgemeines Problem mit einem aktuelle Beispiel anfragen: Mit einem kleinen Programm pinge ich nach einer festen Liste mein Netzwerk durch und sehe, was lebend ist. Dazu habe ich in Mainform einen Button, der die Ping-Umfrage startet, und ein TMemo, in das ich das Ergebnis jedes Pings zeilenweise schreibe. Mit Klick auf Button sehe ich im TMemo live was passiert, bei nicht vorhandenen IPs verzögert sich die Zeile entsprechend des Ping-Timeouts etwas. Bestens.
Nun zur Frage: Ich möchte, dass der Vorgang schon bei Start des Programms gemacht wird, ich also nicht extra meinen Button anklicken muss. Habe viele Dinge versucht, aber es ist immer so, dass zunächst bei unsichtbarem Form die Ping-Reihe abläuft und dann mit einem Schlag das Form mit dem ausgefüllten Memo erscheint.
"OnShow","Visible", "OnCreate" usw. habe ich probiert. Sicher würde ein Timer funktionieren, aber das wäre doch Pfusch (musste ich leider in der Vergangenheit gelegentlich machen, damit eine Lösung da war).
Hat jemand eine Idee wie man die Aktion starten kann, nachdem (!!) das Form auf dem Bildschirm wirklich sichtbar ist?
Gruß GuaAck
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 13.02.13 00:59
Moin!
Poste dir im FormCreate eine eigene Message, in deren Handler rufst du dann den Button-Handler auf.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
Für diesen Beitrag haben gedankt: GuaAck
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Mi 13.02.13 02:25
GuaAck hat folgendes geschrieben : | Hat jemand eine Idee wie man die Aktion starten kann, nachdem (!!) das Form auf dem Bildschirm wirklich sichtbar ist? |
Ich würde den Code im Ereignis OnActivate des Formulars ausführen.
Zwei Punkte sind dabei zu beachten:
1. Beim Wechsel von einer anderen Anwendung zu Deinem Programm wird OnActivate von TApplication ausgelöst, nicht vom jeweiligen Formular.
2. Wird innerhalb Deiner Anwendung von einem anderen Formular auf das Formular mit dem OnActivate-Ereignis gewechselt, wird das Ereignis OnActivate des Formulars ausgelöst.
Punkt 2 ist sicherlich nicht erwünscht. Man kann das aber abfangen. Beispiel:
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:
| var Mainform : TMainform; Aktiviert : boolean;
implementation
uses Unit1;
{$R *.dfm}
procedure TMainform.Button1Click(Sender: TObject); begin Form1.Show; end;
procedure TMainform.FormActivate(Sender: TObject); begin if not Aktiviert then ShowMessage('Erstmalige Aktivierung'); Aktiviert := true; end;
procedure TMainform.FormCreate(Sender: TObject); begin ReportMemoryLeaksOnShutdown := true; end;
initialization Aktiviert := false;
end. |
Oder man schreibt die Anwendung so, daß alle anderen Formulare in einer speziellen Komponente des Hauptformulars angezeigt werden, also innerhalb des Hauptformulars integriert sind. Siehe z. B. TLMDFormDisplay der LMD-Tools. Dann wird OnActivate auch nur einmal ausgelöst.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 13.02.13 08:38
Die Lösung von Narses ist da aber deutlich besser, denn bei der muss man nicht tricksen. Zudem ist man dann nicht mehr in einem Eventhandler drin.
Für diesen Beitrag haben gedankt: GuaAck
|
|
colaka
      
Beiträge: 200
Erhaltene Danke: 4
Win XP, W7
Delphi 2005 Prof.
|
Verfasst: Mi 13.02.13 08:44
Hallo,
mich würde mal interessieren, warum die Lösung mit dem Timer Pfusch ist.
_________________ Mit 2 Stunden Ausprobieren kann man sich oft 5 Minuten Nachdenken ersparen
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 13.02.13 10:10
Ein Timer basiert intern doch auch nur darauf, dass der Windows-Zeitgeber dir eine Nachricht WM_TIMER schickt. Der Overhead ist aber viel größer, denn du hast ein Timer-Objekt, das sich bei Windows registriert, dort muss geprüft werden, wann die Nachricht rausgeht, bei dir muss die Nachricht verarbeitet und dem richtigen Timer zugestellt werden, ...
Wozu das ganze? Da kannst du dir auch selbst eine Nachricht schicken, da hängt sonst nix dran, zudem bekommst du diese auch auf jeden Fall sobald die Nachrichtenwarteschlange von deinem Programm abgearbeitet wurde. Bei einem Timer ist das zwar meistens so, bei viel Systemlast aber nicht immer, d.h. es kann sein, dass der Timer auch mal erst etwas später losgeht (meistens nur einen Bruchteil einer Sekunde, aber auch eine halbe Sekunde ist für den Benutzer schon deutlich sichtbar).
|
|
GuaAck 
      
Beiträge: 378
Erhaltene Danke: 32
Windows 8.1
Delphi 10.4 Comm. Edition
|
Verfasst: Mi 13.02.13 16:15
Danke allen,
das mit postmessage (Narses) ist super einfach und geht bestens!
Zu Timer: Mich stört, dass die zeit ja mehr oder weniger willkürlich ist. Wenn die CPU mal viel zu tun hat, dann reicht sie evtl nicht und ansonsten ist sie vielleicht viel zu lang.
Gruß
GuaAck
|
|
|