![]() |
OnIdle wird immer wieder ausgeführt
Hallo
ich möchte, dass mein MainForm bei dem Ereignis Application.OnIdle ins SystemTray minimiert wird. Dazu benutze ich CoolTrayIcon. Um die Sache zu testen, lasse ich in myIdleHandler einen TTimer loslaufen und bei Ablauf des Timer eine Application.MessageBox anzeigen. Jedoch kommt diese MessageBox immer wieder. Wie kann ich es nun anstellen, dass die MainForm das Ereignis OnIdle nur einmal bekommt und sich dann minimiert ins SystemTray (mit CoolTrayIcon)? gruessle |
Re: OnIdle wird immer wieder ausgeführt
Hi,
eine Möglichkeit sollte z.B. diese sein:
Delphi-Quellcode:
//...in myIdleHandler():
begin Application.OnIdle := NIL; // Dein Code end; Gruß Stephan :dance: |
Re: OnIdle wird immer wieder ausgeführt
Hallo RavenIV,
wenn ich dich richtig verstanden habe, dann schalte doch beim Minimieren in die Tray-Leiste das OnIdle-Event ab, bzw. frag innerhalb dieses Events ab, ob die Anwendung minimiert ist, oder nicht. Wenn die Anwendung maximiert wird, dann kannst du das Event ja wieder anschalten bzw. abarbeiten. |
Re: OnIdle wird immer wieder ausgeführt
nun habe ich das Problem, dass das Form auch nach der Timer-Zeit minimiert wird, obwohl ich dort Eingaben gemacht habe.
Eigentlich möchte ich erreichen, dass das Form nur minimiert wird, wenn der benutzer n Sekunden lang keine Eingabe macht oder keinen Button drückt oder sonst irgendwas (verschieben, Grösse ändern,...) mit dem Fenster macht. Bibt's dazu denn nicht irgendwas fertiges oder wenigstens einen Schubser in die richtige Richtung? gruessle |
Re: OnIdle wird immer wieder ausgeführt
Hallo,
vielleicht funktioniert es, wenn du im Formular KeyPreview aus True setzt und dann bei OnKeyPress nach Tastendruck deinen Timer neu starten lässt. Bei OnMouseMove dann das gleiche. Weiß aber nicht, wie sich das auf die Performance auswirkt. |
Re: OnIdle wird immer wieder ausgeführt
Zitat:
Nur bestimmte Messages sind für dich ein Zeichen, dass der User noch mit deinem Prog arbeitet. (Mausbewegungen gehören z.B. nicht dazu) Du merkst dir einfach den Zeitpunkt der letzten Message.
Delphi-Quellcode:
In OnIdle kannst du dann überprüfen, ob die letzte relevante Message mehr als 10s in der
var
lastMsgTime : DWORD; procedure TFormMain.HandleOnMessage(var Msg: TMsg; var Handled: Boolean); begin case Msg.message of WM_MOUSEWHEEL: WM_CHAR: lastMsgTime := Msg.time; end; end; Vergangenheit liegt und dann deine Aktion starten. |
Re: OnIdle wird immer wieder ausgeführt
Also:
1. OnIdle Event der Applikation mit nem Handler versehen. 2. Im OnIdle Handler die variable Done auf true setzen, das verhindert, daß OnIdle immer wieder aufgerufen wird. 3. im OnIdle deinen Timer neu starten (Timer.Enabled:=False; Timer.Enabled:=True) .. dann fängt er neu an zu zählen. 4. Im OnTimer event des Timers dann die MainForm minimieren und den Timer disablen. Jetzt sollte eigentlich nach jeder Aktion des Nutzers die OnIdle gerufen werden und nur wenn er zwischendurch nix macht wird die OnIdle dann nicht mehr gerufen (weil immer nur einmal gerufen wird durch das Done:=True). Wenn jetzt dein Timer losschlägt wird die Form minimiert, aber nur einmal, da er danach ausgeschaltet ist. Durch das reinitialisieren des Timers im OnIdle wird verhindert, daß er ständig losschlägt, sondern nur, wenn OnIdle länger als das eingestellte Intervall nicht aufgerufen wurde. |
Re: OnIdle wird immer wieder ausgeführt
@Sidorion:
danke für den Tip, aber der OnIdle wird trotz Done := True immerwieder aufgerufen. hier ein Auszug aus meinen Sourcen:
Delphi-Quellcode:
wo liegt mein Denkfehler?
procedure TFoTrayIcon.FormCreate(Sender: TObject);
begin Application.OnIdle := FoTrayIcon.MyIdleHandler; ... ... end; procedure TFoTrayIcon.MyIdleHandler(Sender: TObject; var Done: Boolean); begin Done := True; TiIdleTimer.Enabled := False; TiIdleTimer.Enabled := True; end; procedure TFoTrayIcon.TiIdleTimerTimer(Sender: TObject); begin FoTrayIcon.Hide; TiIdleTimer.Enabled := False; end; |
Re: OnIdle wird immer wieder ausgeführt
Das ist putzig, weil OnIdle eigentlich immer dann aufgerufen wird, wenn die Applikation idle geht, d.h. immer wenn ein Event fertig abgearbeitet wurde. Hast du eventuell noch andere timer laufen oder schickst du von aussen Nachrichten? Oder hast du evtl in der OnIdle procedure einen unterbrechungspunkt? .. daran kanns auch liegen, weil die Applikation ja durch das Unterbrechen an dieser Stelle den Fokus verliert und anschließend wiederkriegt, was natürlich zu einem neuen Aufruf von OnIdle führt.
|
Re: OnIdle wird immer wieder ausgeführt
Zitat:
und wenn ich im OnTimer eine MsgBox anzeigen lasse, bekomme ich aus diesem Grund auch immer den Event? => MsgBox bekommt den Fokus, klick auf MsgBox->OK, Applikation bekommt wieder den Fokus, dann wieder Idle-Event? gruessle |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:07 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