在父窗体中有个线程类,此类用SendMessage或Synchronize方式与窗体同步当有子类继承父类的时候,子类中如何实现窗体与线程的同步?代码说明吧(TStart,线程与VCL的Synchronize)procedure TStart.TalkToMainForm;
begin
with ParentForm do
begin
ssRange := lb_List.Items[i];
lb_List.Selected[i] := True;
edit2.Text := inttostr(i + 1) + '/' + inttostr(lb_list.Count);
end;
end;
ParentForm继承类中执行到这里的时候就出现异常请教各位达人有没有好办法解决
解决方案 »
- delphi数据库
- 如何将Dbgrid导成符合规范的xml文件?
- 关于SLEEP()函数的理解
- 文件操作
- 两个程序见怎么共享内存?急!谢谢!!!
- 请问Delphi7.0的序列号以及authorized number是什么?
- 请高手帮我分析我的代码为什么老是出错????
- 帮忙把C++builder翻译为delphi,保持其中的文字说明
- 关于DataSet返回当前行的问题
- 如何在库中查找重名的记录呢?请大家帮帮忙.............[20]
- 调用dll后出息'Invalid pointer operation'错误,如何解决????
- cxgrid问题,footer部的合计,属性format 导不出汉字
begin
with ParentForm do
begin
ssRange := lb_List.Items[i];
lb_List.Selected[i] := True;
edit2.Text := inttostr(i + 1) + '/' + inttostr(lb_list.Count);
end;
end;
试试线程创建时候将窗体做参数传递进去,再同步使用这个传递的窗体参数
你要訪問基類窗上面的vcl元件,就應該把ParentForm聲明為基類窗的類型。如果你把它聲明為Tform或者TCustomForm,那么訪問基類窗的元件,意味著創建一個基類窗的實例!
//線程類unit MyThread;interfaceuses
Classes, Forms, SysUtils, Windows, Messages, Base;
type
TSyncMain = class(TThread)
private
{ Private declarations }
FParentForm : TBaseForm;
procedure UpdateLabel;
protected
procedure Execute; override;
public
constructor CreateNew(CreateSuspended: Boolean; ParentForm:TBaseForm);
end;implementation{ TSyncMain }constructor TSyncMain.CreateNew(CreateSuspended: Boolean;
ParentForm: TBaseForm);
begin
Create(CreateSuspended);
FParentForm := ParentForm;
end;procedure TSyncMain.Execute;
var
myMsg : TMsg;
begin
{ Place thread code here }
PeekMessage(myMsg,0,0,0,PM_REMOVE);
while myMsg.message<>WM_Quit do
begin
Synchronize(UpdateLabel);
PeekMessage(myMsg,0,0,0,PM_REMOVE);
end;
Terminate;
end;procedure TSyncMain.UpdateLabel;
begin
with FParentForm do
begin
lbl1.Caption := DateTimeToStr(Now) ;
end;
end;end.type
TBaseForm = class(TForm)
lbl1: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
BaseForm: TBaseForm;implementation
uses MyThread;
{$R *.dfm}
var
FThread : TSyncMain;
procedure TBaseForm.FormCreate(Sender: TObject);
begin
FThread := TSyncMain.CreateNew(False,Self);
end;procedure TBaseForm.FormDestroy(Sender: TObject);
begin
PostThreadMessage(FThread.ThreadID,WM_QUIT,0,0);
inherited;
end;