gpt4 book ai didi

Delphi:引用frame中thread的control

转载 作者:行者123 更新时间:2023-12-03 18:11:21 26 4
gpt4 key购买 nike

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

谢谢!

最佳答案

事实上,您根本不应该调用任何方法或修改 VCL 控件的任何属性,或任何对用户可见的内容(您的应用程序的用户界面,这意味着通常在 Delphi 中的 VCL 控件,无论是在框架中还是在不) 直接来自后台线程。

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

与其在线程对象中引用框架或控件,不如将包含框架或其他控件的窗体句柄传递给线程,并使用用户消息 ( WM_USER+10001) 喜欢 this.

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

你应该像这样调用同步:

  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;

关于Delphi:引用frame中thread的control,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6947395/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com