Выполнение действия во время простоя приложения - PullRequest
1 голос
/ 16 сентября 2010

У меня очень простое приложение с формой, рихедитом и меню. Я пытаюсь автоматически сохранить текст на richedit и выполнять другие задачи, но только , когда приложение бездействует - когда пользователь не пишет, или приложение теряет фокус или что-то еще.

Я пытался создать обработчик событий OnIdle из примеров кодов gazillion, найденных в Интернете, но он делает наоборот, он активируется, когда я am с помощью приложения. Эта ссылка является примером.

Я также пробежался по таймеру и проверил, когда в последний раз пользователь писал в ричедит, но я, по возможности, не использую таймер.

Кто-нибудь знает, как обнаружить, что приложение бездействует, и запустить какой-нибудь код, когда он есть? Я использую Delphi 7.

Ответы [ 3 ]

3 голосов
/ 16 сентября 2010

Я бы также порекомендовал таймер, но «сбросил бы» обратный отсчет (выключил, а затем снова включил) в ответ на любое событие клавиатуры, происходящее в пределах richedit.Таким образом, вы не сохраняете, пока пользователь пытается набрать.

Как указывал Андреас, вот как на самом деле реализовать это: Каждый раз, когда пользователь выполняет какое-либо действие, например, изменяет позицию кареткииз редактора, сделайте Timer1.Enabled: = false;Timer1.Enabled: = true.Это сбросит таймер.По сути, таймер никогда не сработает до тех пор, пока в течение последнего таймера не будет выполнено никаких действий пользователя. Интервал миллисекунд

1 голос
/ 16 сентября 2010

Лучше всего с таймером. OnIdle будет часто срабатывать. Я думаю, что это сообщение означает, что все сообщения в очереди обработаны. Таким образом, каждый раз, когда вы обрабатываете сообщения, когда это делается, запускается OnIdle.

Что вы могли бы сделать, это установить переменную на отметку времени после каждого события OnChange в расширенном редактировании. Затем, используя таймер, проверяйте каждые X секунд, чтобы узнать, не устарела ли эта отметка времени, скажем, 5 секунд. Если это так, делайте ваши спасения.

0 голосов
/ 23 сентября 2010
function GetIdleTime:DWORD;
var
  lastI : TLastInputInfo;
begin
  lastI.cbSize := SizeOf(lastI);
  GetLastInputInfo(lastI);
  Result := (gettickcount - lastI.dwTime) div 1000;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if GetIdleTime = 60 then Memo1.savetofile('C:\jgs.tmp');
end;

Используйте это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...