2006. október 21., szombat

Implement an OnEndResize event for a TForm


Problem/Question/Abstract:

Any idea how to implement an OnEndResize event for TForm? Obviously, it should be fired when the user finishes resizing the form.

Answer:

You'll need to handle WM_SYSCOMMAND and WM_EXITSIZEMOVE. Here's a framework to get you started:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
  private
    { Private declarations }
    FSizing: Boolean;
    procedure WMEnterSizeMove(var AMessage: TMessage); message WM_ENTERSIZEMOVE;
    procedure WMExitSizeMove(var AMessage: TMessage); message WM_EXITSIZEMOVE;
    { procedure WMSize(var AMessage: TMessage); message WM_SIZE; }
    procedure WMSysCommand(var AMessage: TMessage); message WM_SYSCOMMAND;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WMSysCommand(var AMessage: TMessage);
begin
  if (AMessage.WParam and $FFF0) = SC_SIZE then
  begin
    FSizing := true;
    ListBox1.Items.Add(Format('SysCommand called - message: %d:%d',
      [AMessage.WParam, AMessage.LParam]));
  end;
  inherited; {Note: inherited after testing for SC_SIZE}
end;

procedure TForm1.WMExitSizeMove(var AMessage: TMessage);
begin
  inherited;
  ListBox1.Items.Add(Format('ExitSizeMove called - message: %d:%d',
    [AMessage.WParam, AMessage.LParam]));
  if FSizing then
  begin
    {Do your stuff here}
    FSizing := false;
  end;
end;

procedure TForm1.WMEnterSizeMove(var AMessage: TMessage);
begin
  inherited;
  ListBox1.Items.Add(Format('EnterSizeMove called - message: %d:%d',
    [AMessage.WParam, AMessage.LParam]));
end;

{
procedure TForm1.WMSize(var AMessage: TMessage);
begin
  inherited;
  ListBox1.Items.Add(Format('Size called - message: %d:%d', [AMessage.WParam,
                                      AMessage.LParam]));
  FSizing := true;
end;
}

end.

Nincsenek megjegyzések:

Megjegyzés küldése