0

サードパーティ コンポーネント (TLMDSimplePanel) である大きなパネルを持つ TFrame の子孫があります。そのパネルのサイズ変更はうまく機能しますが、ユーザーがパネルのサイズを変更したときに、それが含まれているフレームのサイズを動的に変更したいと考えています。(パネルには、ユーザーがマウスでクリック アンド ドラッグするだけでサイズを調整できる小さなサム グリップがあります)。

このフレームのコードは次のとおりです。

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 = 外側の境界)。このサイクルを際限なく繰り返し、フレームを任意のサイズに拡大できますが、1 回のマウスの動きで流動的にはできません。これが私が望んでいることです。

この同じ問題を TForm の子孫に対してもテストしたところ、同じ症状が発生しました。

ここで何が欠けていますか?

あらゆる助けを前もって感謝します。:-)

4

1 に答える 1

4

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;
于 2009-04-15T19:35:23.120 に答える