Форум: "Начинающим";
Текущий архив: 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