Динамическое изменение размеров фреймов и форм в Delphi - PullRequest
0 голосов
/ 15 апреля 2009

У меня есть потомок 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 Ответ

4 голосов
/ 15 апреля 2009

Вы пытались установить для 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;
...