Timer wird Blockiert
Guten Morgen,
Ich habe zwei VclFormulare : frmMain , frmProgress frmProgress hat einen Timer, frmMain muss warten bis der Timer abgelaufen ist und erst dann das frmProgress auf Hide setzen. Mein Problem ist das das Timer-Event nicht ausgelöst wird. Meine überlegung ist im frmMain mit einer While-Schleife zu warten bis das Timer-Event ausgelöst wir. Leider funktioniert das nicht. Er bleibt bei der While-Schleife stecken. Wie kann man auf einen Timer "warten" ? Ein Timer läuft doch im Hintergrund warum läuft dieser in der While-Schleife nicht weiter ?
Delphi-Quellcode:
//frmMain
while FormFtpprogress.canHide = false do begin if FormFtpprogress.canHide = true then FormFtpprogress.Hide; end;
Delphi-Quellcode:
Gruss Int3g3r
//frmProgress
procedure TFormFtpprogress.FormShow(Sender: TObject); begin canHide := false; progressTimer.Enabled := true; end; procedure TFormFtpprogress.progressTimerTimer(Sender: TObject); begin progressTimer.Enabled := false; canHide := true; end; |
AW: Timer wird Blockiert
Ein Timer "läuft" überhaupt nicht. Zu einem Zeitpunkt X wird der Timer ausgelöst ...
... aber
|
AW: Timer wird Blockiert
Zitat:
Ein
Delphi-Quellcode:
bewirkt genau das geliche wie eine
Sleep()
Delphi-Quellcode:
Schleife also kann ich diesen Befehl auch nicht benutzen.
while
|
AW: Timer wird Blockiert
Wenn ich das richtig verstehe, dann soll die Progressform nach einer gewissen Zeit geschlossen werden, wenn eine Aktion im MainForm beendet ist. Aber nicht sofort nach Ende, sondern z.B. nach 2 Sekunden, um dem User noch Zeit zu geben, eine Nachricht "Fertig" zu lesen? Oder so ähnlich?
Das würde ich dann so machen:
Delphi-Quellcode:
TfrmMain.DoSomething;
begin // ... // ... operation finished ... FormFtpprogress.progressTimer.Enabled := True; end; procedure TFormFtpprogress.progressTimerTimer(Sender: TObject); begin progressTimer.Enabled := false; Close; // ProgressForm schließen end; |
AW: Timer wird Blockiert
Warum startest du den Timer nicht im "neuen" Form, dann kannst du dieses auch direkt darüber verstecken.
grml Gausi war schneller :P |
AW: Timer wird Blockiert
Zitat:
Wenn möglich möchte ich aber eine Timer-Interaktion im DoSomething vermeiden. Der Timer soll starten wenn das FormProgress angezeigt wird. Daher möchte ich den Timer auch im FormProgress plazieren. Alle Timer-Interaktionen sollten auch auf dem FormProgress stattfinden. Im Prinzip möchte ich im DoSomething nur warten bis das FormProgress geschlossen/auf Hide gesetzt wurde. Danach den DoSomehting weiter ausführen. Wie kann ich im DoSomething überprüfen ob frmProgress auf hide oder show gesetzt ist ? Danke für die Hilfe. |
AW: Timer wird Blockiert
Zitat:
Delphi-Quellcode:
//Nur als Beispiel!!
procedure TForm1.Button2Click(Sender: TObject); begin Form2.show; Timer1.Enabled := True; end; procedure TForm1.Timer1Timer(Sender: TObject); begin if not Form2.Visible then begin //Es wurde geschlossen oder ausgeblendet Timer1.Enabled := False; end; end; |
AW: Timer wird Blockiert
Wenn die Ausführung der Aktion der MainForm unterbrochen werden soll/muss, bis der Timer abgelaufen ist bzw. die Progressform geschlossen wurde, dann könnte das mit ShowModal gehen.
Also so:
Delphi-Quellcode:
Alternativ in der Schleife in deinem ersten Posting ein Application.ProcessMessages einbauen. Aber dann wird es unter Umständen hakelig mit der GUI. Denn dann musst du sicherstellen, dass der User zwischendurch nichts "gefährliches" anklicken darf.
// in MainForm
procedure DoSomething; begin foo; // machwas ProgressForm.ShowModal; // Anzeige der ProgressForm und warten bar; // mach noch was end; // ProgressForm procedure TFormFtpprogress.FormShow(Sender: TObject); begin progressTimer.Enabled := true; end; procedure TFormFtpprogress.progressTimerTimer(Sender: TObject); begin progressTimer.Enabled := false; // ggf. ModalResult := ... zur Rückgabe eines Wertes an MainForm Close; // ProgressForm schließen end; |
AW: Timer wird Blockiert
Hallo,
was du nutzen könntest, ist semimodales Verhalten. Such mal hier im Forum nach dem Wort. Ich hatte da vor ein paar Jahren was dazu geschrieben. Ansonsten verstehe die Frage nicht. Wenn du willst, dass dein Programm erst nach einer gewissen Zeit schließt, nimm ein modales Progressfenster (wie du schon geschrieben hattest), dann deinen Timer und fange das Close in OnCloseQuery ab. In der OnTimerTimer-Methode machst du dann deine ganzen Arbeiten. |
AW: Timer wird Blockiert
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz