AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OnIdle wird immer wieder ausgeführt

Ein Thema von RavenIV · begonnen am 30. Jun 2005 · letzter Beitrag vom 5. Jul 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#1

OnIdle wird immer wieder ausgeführt

  Alt 30. Jun 2005, 11:00
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
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Benutzerbild von Steve
Steve

Registriert seit: 2. Mär 2004
Ort: Würzburg
730 Beiträge
 
Delphi 2006 Personal
 
#2

Re: OnIdle wird immer wieder ausgeführt

  Alt 30. Jun 2005, 11:03
Hi,

eine Möglichkeit sollte z.B. diese sein:
Delphi-Quellcode:
//...in myIdleHandler():
begin
  Application.OnIdle := NIL;
  // Dein Code
end;

Gruß
Stephan
Stephan B.
Wer andern eine Grube gräbt ist Bauarbeiter!
Wer im Glashaus sitzt, sollte sich lieber im Dunkeln ausziehen!
Außerdem dieser Satz kein Verb...
  Mit Zitat antworten Zitat
Stefan Dieler
(Gast)

n/a Beiträge
 
#3

Re: OnIdle wird immer wieder ausgeführt

  Alt 30. Jun 2005, 11:05
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.
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: OnIdle wird immer wieder ausgeführt

  Alt 30. Jun 2005, 11:40
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
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Stefan Dieler
(Gast)

n/a Beiträge
 
#5

Re: OnIdle wird immer wieder ausgeführt

  Alt 30. Jun 2005, 11:46
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.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: OnIdle wird immer wieder ausgeführt

  Alt 30. Jun 2005, 12:09
Zitat von RavenIV:
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?
Alle Windows-Messages, die dein Programm erhält, können über Application.OnMessage abgefangen werden.
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:
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;
In OnIdle kannst du dann überprüfen, ob die letzte relevante Message mehr als 10s in der
Vergangenheit liegt und dann deine Aktion starten.
Andreas
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#7

Re: OnIdle wird immer wieder ausgeführt

  Alt 4. Jul 2005, 14:36
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.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: OnIdle wird immer wieder ausgeführt

  Alt 4. Jul 2005, 15:52
@Sidorion:
danke für den Tip, aber der OnIdle wird trotz Done := True immerwieder aufgerufen.

hier ein Auszug aus meinen Sourcen:
Delphi-Quellcode:
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;
wo liegt mein Denkfehler?
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#9

Re: OnIdle wird immer wieder ausgeführt

  Alt 4. Jul 2005, 16:22
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.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: OnIdle wird immer wieder ausgeführt

  Alt 4. Jul 2005, 16:30
Zitat von Sidorion:
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.
jupp, zum testen hab ich da einen breakpoint gesetzt.

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
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:53 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