【问题标题】:Dynamic resizing of frames and forms in Delphi在 Delphi 中动态调整框架和表单的大小
【发布时间】:2009-04-15 18:47:59
【问题描述】:

我有一个 TFrame 后代,上面有一个相当大的面板,它是一个第三方组件 (TLMDSimplePanel)。该面板上的大小效果很好,但我希望它包含的框架在用户更改面板大小时动态调整大小。 (面板上有一个小拇指握把,用户可以用鼠标点击和拖动)。

这个框架的代码如下:

unit SizeableFrame;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, TcmBaseFrameFrame, LMDCustomControl, LMDCustomPanel, LMDCustomBevelPanel,
  LMDSimplePanel, StdCtrls;

type
  TcmSizeableFrame = class(TcmBaseFrame)
    LMDSimplePanel1: TLMDSimplePanel;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure LMDSimplePanel1Resize(Sender: TObject);
    procedure FrameCanResize(Sender: TObject; var NewWidth, NewHeight: Integer;
      var Resize: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  cmSizeableFrame: TcmSizeableFrame;

implementation

{$R *.dfm}

procedure TcmSizeableFrame.FrameCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
begin
  inherited;
  Resize := True;
end;

procedure TcmSizeableFrame.LMDSimplePanel1Resize(Sender: TObject);
const
  ExpandByPixels = 60;
var
  MyFrame : TFrame;        
begin
  inherited;
  Self.Height := LMDSimplePanel1.Height + ExpandByPixels;
  Self.Width := LMDSimplePanel1.Width  +  ExpandByPixels;
end;

end.

效果非常好,如果用户缩小框架的大小,但如果他们试图将其拉伸得比原来的范围更大,他们只能将其扩大到出现的程度 为其原始尺寸 + ExpandByPixels,之后用户无法继续流畅地将其拖动到更大的尺寸。

如果他们停下来,然后再次单击并拖动尺寸夹点,他们可以将其拖动到更大的尺寸,但这同样受到同样的限制(当前尺寸 + ExpandByPixels = 外部边界)。他们可以无休止地重复这个循环,将框架扩展到任何大小,但不能在一次鼠标移动中流畅地进行,这正是我想要的。

我也针对 TForm 后代测试了同样的问题,并且得到了相同的症状。

我在这里错过了什么?

在此先感谢您的任何帮助。 :-)

【问题讨论】:

    标签: delphi forms frames


    【解决方案1】:

    您是否尝试将 Frame.Autosize 设置为 true?
    或者您需要在鼠标移动时调整框架的大小。这样包含的对象可以在保持在容器边界内的同时扩展。

    更新:一些与常规 TPanel 一起使用以水平调整大小的简单代码...

    type
      TFrame5 = class(TFrame)
        Panel1: TPanel;
        procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
        procedure Panel1Resize(Sender: TObject);
      end;
    
    implementation
    
    {$R *.dfm}
    
    procedure TFrame5.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    begin
      with Sender as TPanel do
      if ssLeft in Shift then
      begin
        Width := X;
      end;
    end;
    
    procedure TFrame5.Panel1Resize(Sender: TObject);
    begin
      with Sender as TPanel do
      begin
        (Parent as TFrame).Width := Width + 2*Left;
      end;
    end;
    

    【讨论】:

    • 是的,我确实尝试过。我发现,当面板调整大小时,框架的自动调整大小功能不会启动(可能是等到面板调整大小完成),所以它不起作用。另外,虽然,我需要在面板周围有一个“缓冲边框”;不要与它齐平。
    • 试试我的示例代码,它适用于常规的 TPanel。不过,您可能必须修改 TLMDSimplePanel 组件。
    • 另外对于“缓冲区边框”,您可以使用 Frame 的 padding 属性或 Panel 的 Margins...
    • 同意。填充是在控件周围做缓冲区的一种非常的更好的方法,而不是用其他控件作为间隔来围绕它。那会很快变得非常丑陋。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 2014-07-26
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多