Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];

Вниз

про таймер   Найти похожие ветки 

 
vladimirg88   (2006-08-09 11:47) [0]

как сделать паузу в св-ве таймер, а ч/з некоторое время продожить счетчик


 
Ega23 ©   (2006-08-09 11:48) [1]

Timer.Enabled:=False;
.....
Timer.Enabled:=True;


 
Сергей М. ©   (2006-08-09 11:50) [2]

Чего-чего ?
Вразумительно можешь пояснить, что за свойство, у какого объекта оно, что такое "счетчик", что значит "продолжить" его ?


 
vladimirg88   (2006-08-09 11:51) [3]

Ega23, а как указать время простоя?


 
Ega23 ©   (2006-08-09 11:58) [4]

Sleep(N)

Только, ИМХО, дурь ты какую-то затеял...


 
Ega23 ©   (2006-08-09 12:01) [5]


> Ega23, а как указать время простоя?
>


Кстати, можно ещё круче изголиться - создать трёхзвенную архитектуру из трёх самозапускающихся таймеров:
1. первый работает как обычно.
2. Второй приостанавливает действие первого на интервал, равный своему.
3. Третий с периодичностью в минуту меняет интервал простоя второго таймера.

Аргументы в пользу подхода:
1. Хардкорно.
2. Тот, кто будет разбирать твой код - повесится.
3. см. п 1 и 2.


 
clickmaker ©   (2006-08-09 12:01) [6]


> как указать время простоя?

поставить другой таймер )


 
Ega23 ©   (2006-08-09 12:04) [7]


> Ega23 ©   (09.08.06 12:01) [5]


Ещё один аргумент в пользу:
При желании количество таймеров может быть увеличено.
В качестве развития такой системы, весто линейного поочерёдного запуска таймеров можно предложить граф с N таймерами, некоторый из которых запускают-останавливают некоторое количество других.


 
Ega23 ©   (2006-08-09 12:05) [8]

Всё, капец.
Самому интересно стало.
Пошёл писать.


 
Шпиён   (2006-08-09 12:40) [9]


> Ega23 ©   (09.08.06 12:05) [8]

А почему бы просто не сделать у одного TTimer два разных обработчика и не переключать их?
Примитиваная иллюстрация "идеи":

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, StdCtrls;
type
 TForm1 = class(TForm)
   Timer1: TTimer;
   Label1: TLabel;
   Label2: TLabel;
   procedure Timer1Timer(Sender: TObject);
   procedure Timer2Timer(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
var
 Form1: TForm1;
 Counter1:integer;
 Counter2:integer;
implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Counter1 < 9 then inc(Counter1) else Counter1:=0;
   Label1.Caption:="T1="+IntToStr(Counter1);
if Counter1=9 then
   Timer1.OnTimer:=Timer2Timer;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
if Counter2 < 4 then inc(Counter2) else Counter2:=0;
   Label2.Caption:="T2="+IntToStr(Counter2);
if Counter2=4 then
   Timer1.OnTimer:=Timer1Timer;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   Timer1.OnTimer:=Timer1Timer;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   Timer1.OnTimer:=Timer2Timer;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   Timer1.OnTimer:=Timer1Timer;
end;

end.



 
Шпиён   (2006-08-09 12:42) [10]

Sorry, вот этот кусок лишний, убрать забыл:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.OnTimer:=Timer1Timer;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Timer1.OnTimer:=Timer2Timer;
end;



 
Ega23 ©   (2006-08-09 12:49) [11]

Удалено модератором


 
Пусик ©   (2006-08-09 13:14) [12]

Удалено модератором


 
vamp_avp   (2006-08-09 13:19) [13]

Привет всем!
не знаю для чего тебе задерживать таймер
я обычно пользуюсь
{******************************************************************************}
//процедура задержки времени
procedure Delay(ms : longint);
var
TheTime : LongInt;
begin
TheTime := GetTickCount + ms;
while GetTickCount < TheTime do
Application.ProcessMessages;
end;
{******************************************************************************}
использовать: Delay(1000)
т.е. задержка на 1 секунду


 
Ega23 ©   (2006-08-09 13:41) [14]

Удалено модератором


 
Zeqfreed ©   (2006-08-09 13:57) [15]

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 if (Tag > 0) then begin
  Timer1.Interval := Tag;
  Tag := 0;
 end else
  DoWhateverYouWant;
end;

procedure TForm1.PauseTimer(const DelayTime : Word);
begin
 Timer1.Tag := Timer1.Interval;
 Timer1.Interval := DelayTime;
end;


 
Eraser ©   (2006-08-09 13:59) [16]

мой вариант :)
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls, Spin;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Label1: TLabel;
   Timer1: TTimer;
   SpinEdit1: TSpinEdit;
   procedure Timer1Timer(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
   FCounter, FPauseInterval: Integer;
 public
   { Public declarations }
   procedure Pause(APauseInterval: Integer);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 Pause(SpinEdit1.Value);
end;

procedure TForm1.Pause(APauseInterval: Integer);
begin
 FPauseInterval := APauseInterval;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Dec(FPauseInterval);
 if FPauseInterval > 0 then
   Exit;
 Inc(FCounter);
 Label1.Caption := IntToStr(FCounter);
end;

end.


 
ANB ©   (2006-08-09 14:00) [17]


> vamp_avp   (09.08.06 13:19) [13]

Еще бы sleep впихнуть в тело цикла - цены бы твоей функции не было. На загрузку проца при ms = 60000 проверял ?


 
medved_68 ©   (2006-08-09 21:56) [18]


> Аргументы в пользу подхода:
> 1. Хардкорно.
> 2. Тот, кто будет разбирать твой код - повесится.

А если еще напрячь мультимедийный таймер, чтобы он каждую миллисекунду переключал события основного (совет ШПИЕНА) скажем по кругу из 10 событий :))) Повесится мало, еще и утопится, и ап стэну галавай бидца :))) Даже не просто хардкордно, а и еще и пневматично :))) А если еще выбирать события по случаю....хм что то я запи...базарился однако, фантазия разыгралась все пойду как сказал:

> Ega23 ©   (09.08.06 12:05) [8]
> Всё, капец.
> Самому интересно стало.
> Пошёл писать.

:))))


 
Пусик ©   (2006-08-10 01:34) [19]

type

 TTimer=class
 private
   FWnd: THandle;
   FTimer: THandle;
   FInterval: DWORD;
   FPause: DWORD;
   FTimerProc: TNotifyEvent;
   procedure Kill;
   procedure NewTimer;
   procedure SetInterval(const Value: DWORD);
   procedure WndProc(var Msg: TMessage);
 public
   constructor Create(aInterval: DWORD; TmProc: TNotifyEvent);
   destructor Destroy; override;
   procedure Pause(PauseTime: DWORD);
   procedure Stop;
   procedure Start;
   property Interval: DWORD read FInterval write SetInterval;
   property OnTimer: TNotifyEvent read FTimerProc write FTimerProc;
 end;

implementation

{ TTimer }

constructor TTimer.Create(aInterval: DWORD; TmProc: TNotifyEvent);
begin
{$WARN SYMBOL_DEPRECATED OFF}
 FWnd := AllocateHWnd(WndProc);
{$WARN SYMBOL_DEPRECATED ON}
 FInterval := aInterval;
 FTimer := 0;
 FPause := 0;
 FTimerProc := TMProc;
end;

destructor TTimer.Destroy;
begin
{$WARN SYMBOL_DEPRECATED OFF}
 DeallocateHWnd(FWnd);
{$WARN SYMBOL_DEPRECATED ON}
 if FTimer<>0 then Kill;
 inherited;
end;

procedure TTimer.WndProc(var Msg: TMessage);
begin
 with Msg do
   if Msg = WM_TIMER then
     try
       if FPause<>0 then
       begin
         FPause := 0;
         Kill;
         if Assigned(FTimerProc) then FTimerProc(Self);
         NewTimer;
         Exit;
       end;
       if Assigned(FTimerProc) then FTimerProc(Self);
     except
       Application.HandleException(Self);
     end
   else
   Result := DefWindowProc(FWnd, Msg, wParam, lParam);
end;

procedure TTimer.Kill;
begin
 if FTimer<>0 then KillTimer(FWnd,FTImer);
 FTimer := 0;
end;

procedure TTimer.NewTimer;
var
 FTmpInterval: DWORD;
begin
 if FPause<>0 then FTmpInterval := FPause else FTmpInterval := FInterval;
 FTimer := SetTimer(FWnd,0,FTmpInterval,nil);
end;

procedure TTimer.Pause(PauseTime: DWORD);
begin
 if FTimer=0 then Exit;
 Kill;
 FPause := PauseTime;
 Start;
end;

procedure TTimer.SetInterval(const Value: DWORD);
begin
 Kill;
 FInterval := Value;
 NewTimer;
end;

procedure TTimer.Start;
begin
 NewTimer;
end;

procedure TTimer.Stop;
begin
 Kill;
end;


 
Сергей М. ©   (2006-08-10 08:30) [20]


> Пусик ©   (10.08.06 01:34) [19]


> constructor TTimer.Create(aInterval: DWORD; TmProc: TNotifyEvent);
> begin
> ..
>  FTimer := 0; //это
>  FPause := 0;//и это лишнее
> ..
> end;



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.042 c
2-1154865648
Sele
2006-08-06 16:00
2006.08.27
открытие файла на 1 копии программы


3-1150961470
worldmen
2006-06-22 11:31
2006.08.27
Узнать номер строки в TDBGridе или SQLе


15-1153978624
palva
2006-07-27 09:37
2006.08.27
Статья Н. Елмановой в Компьютер-пресс


1-1152541631
LeXaXaXa
2006-07-10 18:27
2006.08.27
Как перехватить сообщение закрытия окна?


15-1154461397
AntiUser
2006-08-01 23:43
2006.08.27
В Израиле обнаружен изолированный "Затерянный Мир"





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский