在父窗体中有个线程类,此类用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继承类中执行到这里的时候就出现异常请教各位达人有没有好办法解决

解决方案 »

  1.   

    procedure TStart.TalkToMainForm(ParentForm:TForm); 
    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; 
    试试线程创建时候将窗体做参数传递进去,再同步使用这个传递的窗体参数
      

  2.   

    問題是出在你的 ParentForm類型上面!!
    你要訪問基類窗上面的vcl元件,就應該把ParentForm聲明為基類窗的類型。如果你把它聲明為Tform或者TCustomForm,那么訪問基類窗的元件,意味著創建一個基類窗的實例!
      

  3.   

    續上,代碼演示:
    //線程類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;
      

  4.   

     Avan_Lau  太感谢了,如此详尽的解释和说明,还有代码