Динамическое изменение размеров фреймов и форм в Delphi

У меня есть потомок 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 и получил те же симптомы.

Что мне здесь не хватает?

Заранее спасибо за любую помощь. :-)


person Jamo    schedule 15.04.2009    source источник


Ответы (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;
person Francesca    schedule 15.04.2009
comment
Да, я пробовал это. Я обнаружил, что во время изменения размера панели функция авторазмера рамки не срабатывала (возможно, она ждала завершения изменения размера панели), поэтому она не работала. Кроме того, мне нужна граница буфера вокруг панели; не вровень с ним. - person Jamo; 16.04.2009
comment
Попробуйте мой пример кода, он работает с обычной TPanel. Однако вам, возможно, придется изменить компонент TLMDSimplePanel. - person Francesca; 16.04.2009
comment
Кроме того, для границы буфера вы можете поиграть со свойством заполнения рамки или полей панели... - person Francesca; 16.04.2009
comment
Согласованный. Заполнение — это намного лучший способ создать буферы вокруг элементов управления, чем окружать их другими элементами управления в качестве прокладок. Это может стать очень уродливым очень быстро. - person Mason Wheeler; 16.04.2009