比如我要开发一个时钟的控件类,派生自TGraphicControl,具体在其Paint里面画时钟,然后在这个类里添加了派生自TThread的多线程类,想要以线程来每秒重画时钟,大概如下
TimeThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure DoEverySecond;
end;
TClock = class(TGraphicControl)
private
FTimeThread: TimeThread;
procedure EverySecondDraw();
end;
procedure TimeThread.DoEverySecond;
begin
{如何在这里面调用TClock的函数EverySecondDraw}
end;
procedure TimeThread.Execute;
begin
FreeOnTerminate := True;
while not Terminated do
begin
Synchronize(DoEverySecond);
Sleep(1000);
end;
end;
不知道我上面的思路有没有错,但是我不懂怎么调用自定义的控件类TClock去重画时钟?
TimeThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure DoEverySecond;
end;
TClock = class(TGraphicControl)
private
FTimeThread: TimeThread;
procedure EverySecondDraw();
end;
procedure TimeThread.DoEverySecond;
begin
{如何在这里面调用TClock的函数EverySecondDraw}
end;
procedure TimeThread.Execute;
begin
FreeOnTerminate := True;
while not Terminated do
begin
Synchronize(DoEverySecond);
Sleep(1000);
end;
end;
不知道我上面的思路有没有错,但是我不懂怎么调用自定义的控件类TClock去重画时钟?
constructor TClock.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FTimeThread := TimeThread.Create(False);
end;
TimeThread = class(TThread)
private
FOnExecute: TNotifyEvent;
protected
procedure DoExecute;
procedure Execute; override;
public
property OnExecute: TNotifyEvent read FOnExecute write FOnExecute;
end;
实现
procedure TimeThread.DoExecute;
begin
if Assigned(FOnExecute) then
FOnExecute(Self);
end;procedure TimeThread.Execute;
begin
FreeOnTerminate := True;
while not Terminated do
begin
Synchronize(DoExecute);
Sleep(1000);
end;
end;
而组件类要使用这个线程的话,得先包含他的对象,然后赋事件给线程体。
TClock = class(TGraphicControl)
private
procedure EverySecondDraw(sender: TObject);
protected
procedure Paint; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{```````}
end;
创建时
constructor TClock.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FTimeThread := TimeThread.Create(True);
FTimeThread.OnExecute := EverySecondDraw;
FTimeThread.Resume;
end;