7

もし(Delphiで)私がそうするなら

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

パネルは、指定された Rect の場所ではなく、ウィンドウの既定の場所のような場所にフローティングされます。パネル (またはその他のコントロール) を特定の位置にフロートさせるにはどうすればよいですか? しかし、それは正しい形状を持っているようです。正しく機能させるために設定する必要がある他のプロパティはありますか?

編集:物事を明確にするためだけに。上記のコードは、パネルを画面の左上隅から (500x500) の位置にある 100x100 の正方形にすることを期待していますが、そうではありません。形は正しいが位置が違う。後続のコントロールがフロートされている場合、それらは画面の下にカスケードされます。

Edit2:これは Delphi 7 では問題ではないようですが、Delphi 2007 から XE2 まで (そしておそらくそれ以前) にあります。

4

2 に答える 2

5

これ以上調べないでください: VCL のバグです。

ManualFloatはフローティング ウィンドウを作成しTopLeft値を に設定しTControl.CreateFloatingDockSite(Bounds: TRect)、後で を設定しClientWidthます。

これを行うと、WindowHandle の作成が強制されるため (まだハンドルがありません)、これは間違いです。

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

そして、それはウィンドウのデフォルトの位置を呼び出します(カスケードヤッダヤッダ...)とをリセットしTopますLeft

修正は、 andプロパティを設定する前にClientWidthandを設定することですClientHeightTopLeftTControl.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;
于 2012-04-04T19:12:17.280 に答える