gpt4 book ai didi

delphi - 对于在OnShow事件中具有AutoSize = true的面板,高度不会更改

转载 作者:行者123 更新时间:2023-12-03 19:41:01 26 4
gpt4 key购买 nike

我有一个面板,其AutoSize为true。



procedure TfrmIntDetails.FormCreate(Sender: TObject);
begin
MyPanel.AutoSize:= true;
end;


它的内容以OnShow事件形式动态显示或隐藏。因此其高度已更改。

procedure TfrmIntDetails.FormShow(Sender: TObject);
begin
Button1InsideMyPanel.visible:= true;
Button2InsideMyPanel.visible:= false;

//MyPanel height is changed but Height property does not updated
PanelHeight:= MyPanel.Height;
end;


表单完全加载后,我可以得到新的高度(如下所示),但问题是它的高度在OnShow事件中没有改变。

procedure TfrmIntDetails.Button1Click(Sender: TObject);
begin
PanelHeight:= MyPanel.Height;
end;


问:我需要一种方法来强制MyPanel根据OnShow事件中的内容(例如发布消息)来更新其高度。

最佳答案

要在OnShow事件中发布消息,可以使用@MasonWheeler的delayedAction实现。

它引用一个匿名过程,并通过PostMessage调用将其放入Windows消息队列中。

例:

DelayExec( // Puts an anonymous procedure on the message queue
procedure
begin
PanelHeight := MyPanel.Height;
end
);


幕后是一个将消息发布到的Windows句柄,以及用于删除对匿名过程的额外引用的逻辑。

更新资料

您提到建议的解决方案不起作用。
如果表单上有待处理的绘画操作,最好在更新 PanelHeight属性之前等待它们完成。

这是做什么的:

DelayExec( // Puts an anonymous procedure on the message queue
procedure
var
Msg: TMsg;
begin
// Make sure all pending paint messages are executed
while PeekMessage(Msg, 0, WM_PAINT, WM_PAINT, PM_REMOVE) do
DispatchMessage(Msg);

PanelHeight := MyPanel.Height;
end
);

关于delphi - 对于在OnShow事件中具有AutoSize = true的面板,高度不会更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24103256/

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