10.11.2006, 13:45
общий
это ответ
Здравствуйте, Yujin!
Я бы на вашем месте восползовался мултимедийном таймером и рисование делал в отдельном потоке в цыкле. Модуль MMSystem нужен для API функций работы с мултимедийном таймером
Приложение:
unit unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls,MMSystem;TTimerThread = class(TThread) private FCanvas:TCanvas; FTime:integer; tmEvent:THandle; StopEvent:THandle; IDTimer:UINT; Fx:integer; Fxx:integer; Fy:integer; public constructor Create(aTime:integer; //интервал времени aCanvas:TCanvas) //канвас на котором рисуют procedure Execute;override; destructor Destroy;override; end;implementationconstructor TTimerThread.Create(aTime:integer;aCanvas:TCanvas);begin inherited Create(TRUE); FreeOnTerminate:=FALSE; FCanvas:=aCanvas; FTime := aTime // Cсоздаем событие которое таймера tmEvent := CreateEvent(nil,FALSE,FALSE,Nil); Priority := tpHigher; Resume; // Создаем мултимедийный таймер IDTimer := timeSetEvent(aTime,0,Pointer(tmEvent),0, TIME_PERIODIC or TIME_CALLBACK_EVENT_SET); // Запускаем мултимедийный таймер timeBeginPeriod(aTime);end;procedure TTimerThread.Execute;var i:integer; DCmem:HDC; hBmp:HBITMAP; aEvents:array [0..1] of THandle; Event:DWORD;begin aEvents[0]:=tmEvent; while(true) begin Event:=WaitForMultipleObjects(1,@aEvents,FALSE,INFINITE)-WAIT_OBJECT_0; //Блокируем рисование в основном потоке программы fCanvas.Lock; try canvas[x,y]:=rgb(0,0,0); canvas[xx,y]:=rgb(0,0,255); x:=xx; inc(xx); finally fCanvas.Unlock; end; end;end;destructor TTimerThread.Destroy;begin// Остановка таймера timeEndPeriod(FTime);//Удаление таймера timeKillEvent(IDTimer);//Уничтожение события CloseHandle(tmEvent); inherited;end;