これ以上調べないでください: VCL のバグです。
ManualFloat
はフローティング ウィンドウを作成しTop
、Left
値を に設定しTControl.CreateFloatingDockSite(Bounds: TRect)
、後で を設定しClientWidth
ます。
これを行うと、WindowHandle の作成が強制されるため (まだハンドルがありません)、これは間違いです。
function TCustomForm.GetClientRect: TRect;
begin
if IsIconic(Handle) then // <===
そして、それはウィンドウのデフォルトの位置を呼び出します(カスケードヤッダヤッダ...)とをリセットしTop
ますLeft
修正は、 andプロパティを設定する前にClientWidth
andを設定することですClientHeight
Top
Left
TControl.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;