gpt4 book ai didi

delphi - ManualFloat 不使用指定的 Rect

转载 作者:行者123 更新时间:2023-12-03 14:53:30 24 4
gpt4 key购买 nike

如果(在德尔福中)我愿意

Panel1.ManualFloat(Rect(500,500,600,600));

面板不是 float 在指定的矩形位置,而是 float 在某种 Windows 默认位置。如何让面板(或其他控件) float 在指定位置。然而,它似乎确实具有正确的形状。我是否需要设置其他一些属性才能使其正常工作?

编辑:只是为了让事情变得清楚。我希望上面的代码使面板成为一个 100x100 的正方形,位于相对于屏幕左上角的 (500x500) 处,但事实并非如此。形状正确,但位置不正确。如果后续控件是 float 的,它们会沿着屏幕向下层叠。

Edit2:这在 Delphi 7 中似乎不是问题,但在 Delphi 2007 到 XE2(可能更早)中是问题

最佳答案

别再看了:这是 VCL 中的一个错误。

ManualFloat 创建一个 float 窗口,并在 Top 中设置其 LeftTControl.CreateFloatingDockSite(Bounds: TRect) 值,随后设置其 ClientWidth

这是一个错误,因为这样做会强制创建 WindowHandle(它还没有句柄)

function TCustomForm.GetClientRect: TRect;
begin
if IsIconic(Handle) then // <===

这会调用窗口的默认定位(级联yadda yadda...)重置TopLeft

修复方法是在 ClientWidth 中设置 ClientHeightTop 属性之前设置 LeftTControl.CreateFloatingDockSite(Bounds: TRect)

更新:Controls.pas中的固定代码

function TControl.CreateFloatingDockSite(Bounds: TRect): TWinControl;
begin
Result := nil;
if (FloatingDockSiteClass <> nil) and
(FloatingDockSiteClass <> TWinControlClass(ClassType)) then
begin
Result := FloatingDockSiteClass.Create(Application);
with Bounds do
begin
// Setting Client area can create the window handle and reset Top and Left
Result.ClientWidth := Right - Left;
Result.ClientHeight := Bottom - Top;
// It is now safe to position the window where asked
Result.Top := Top;
Result.Left := Left;
end;
end;
end;

关于delphi - ManualFloat 不使用指定的 Rect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10003858/

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