Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.27;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.06 c
2-1154729045
Петюха
2006-08-05 02:04
2006.08.27
Отправка писем


15-1153485865
McSimm
2006-07-21 16:44
2006.08.27
Продолжение ветки "Для любителей коммунизъъма (TUser)"


2-1155048317
Ega23
2006-08-08 18:45
2006.08.27
TBitmap to TIcon


15-1154320087
vajo
2006-07-31 08:28
2006.08.27
Заблокировалась учетная запись Win XP.


8-1139865032
QwertyKz
2006-02-14 00:10
2006.08.27
Глубина цвета