Delphi:从框架中引用线程控制

max*_*fax 2 delphi pointers refer tframe

FRAME(不是表格)和线程.如何从线程中引用Frame的控件?例如,我想从线程中禁用一个按钮.但我没有指向按钮的指针,框架中没有全局变量.

谢谢!

War*_* P 7

你不应该事实上,调用任何方法或修改在所有的VCL控制的任何财产或任何可见的用户(应用程序的用户界面,这意味着VCL在Delphi中通常控制,无论是在一帧或不能)直接从后台线程.

但是,您可以使用PostMessageTThread.Synchronize或向主线程发送事件或通知TThread.Queue.

最好不要将包含框架或其他控件的窗体的句柄传递给线程,并使用用户消息(WM_USER + 10001),而不是在线程对象中引用框架或控件. )像这样.

我更喜欢PostMessage到TTHread.Synchronize或Queue,因为它非常简单并且效果很好.它不是一个跨平台友好的技术,因为它与Win32 API相关联.

你应该像这样调用synchronize:

  TMyThread = class(TThread)
  private
    FFrame: TFrame;
    ...
  public
    constructor Create(AFrame: TFrame); 
    ...
  end;

  constructor TMyThread.Create(AFrame: TFrame);
  begin
    FFrame := AFrame;
    inherited Create;
  end;

  // do not call directly, only using Synchronize
  procedure TMyThread.AMethodWithNoParameters; 
  begin
     FFrame.Button1.Enabled := not FBusy;
  end;

  procedure TMyThread.DoWork; // called from Execute.
  begin
    FBusy := true; 
    Synchronize(AMethodWithNoParameters);
    Sleep(100); //dummy;
    FBusy := false; 
    Synchronize(AMethodWithNoParameters);
  end;
Run Code Online (Sandbox Code Playgroud)