代码之家  ›  专栏  ›  技术社区  ›  Jamo

Delphi中框架和窗体的动态调整

  •  0
  • Jamo  · 技术社区  · 16 年前

    我有一个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的后代进行了同样的测试,得到了同样的症状。

    我这里缺什么?

    提前感谢您的帮助。-)

    1 回复  |  直到 16 年前
        1
  •  4
  •   Francesca    16 年前

    是否尝试将框架设置为“自动调整大小”为“真”?
    或者在鼠标移动时需要调整帧的大小。这样,被包含的对象可以在保持在容器边界内的同时展开。

    更新:一些简单的代码,可以与常规的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;
    
    推荐文章