2009-12-03 3 views
1

В середине приложения находится рамка. После изменения размера мне нужно переставить элементы управления на этой панели (выполнение этого в событии изменения размера слишком занято). Его более полезно, если это можно сделать один раз после изменения размера. Но как?Как реализовать событие OnResizeEnd для TFrame?

Спасибо за вашу помощь

ответ

0

Вы можете попробовать следующую реализацию.

-Выберите форму владельца формы для изменения размера, обработайте ее в своем фрейме и оставьте любой обработчик событий родителем OnResize Might.

type 
    TFrame2 = class(TFrame) 
    Label1: TLabel; 
    procedure FrameClick(Sender: TObject); 
    private 
    { Private declarations } 
    FOnResize: TNotifyEvent; 

    procedure OnFrameResize(Sender: TObject); 
    public 
    { Public declarations } 
    // custom Frame constructor 
    constructor Create(AOwner: TComponent); override; 
    end; 

implementation 

{$R *.dfm} 

{ TFrame2 } 

constructor TFrame2.Create(AOwner: TComponent); 
begin 
    inherited; 

    FOnResize := TForm(AOwner).OnResize; 
    TForm(AOwner).OnResize := OnFrameResize; 
end; 

procedure TFrame2.OnFrameResize(Sender: TObject); 
begin 
    Label1.Caption := 'resize fired'; 
    if @FOnResize <> nil then 
    FOnResize(Parent); 
end; 
+0

Я думаю, что он хочет отложить изменение размера («делать это в событии изменения размера слишком занято»). PS. Изменение размера также можно сделать, разместив панель на кадре со всеми компонентами. – BennyBechDk

+0

Событие OnResizeEnd сразу после вызова Paren'ts OnResize. Только там, где говорится «FOnResize (Parent)», вы можете вставить туда любой код для его обработки – zz1433

2

Хитрость заключается в том, чтобы вклиниться в обработке сообщений родительской формы (доказательство правильности концепции кода, тестирование с Delphi 2009, ошибка и угловой случай обработки нужно больше работать):

type 
    TFrame2 = class(TFrame) 
    strict private 
    fOnEnterSizeMove: TNotifyEvent; 
    fOnExitSizeMove: TNotifyEvent; 
    fSavedWndProc: TWndMethod; 
    procedure DoEnterSizeMove; 
    procedure DoExitSizeMove; 
    procedure ParentWindowProc(var AMessage: TMessage); 
    protected 
    procedure CreateWnd; override; 
    procedure DestroyWnd; override; 
    published 
    property OnEnterSizeMove: TNotifyEvent read fOnEnterSizeMove 
     write fOnEnterSizeMove; 
    property OnExitSizeMove: TNotifyEvent read fOnExitSizeMove 
     write fOnExitSizeMove; 
    end; 

{ TFrame2 } 

procedure TFrame2.CreateWnd; 
var 
    ParentForm: TCustomForm; 
begin 
    inherited; 
    ParentForm := GetParentForm(Self); 
    if ParentForm <> nil then begin 
    fSavedWndProc := ParentForm.WindowProc; 
    ParentForm.WindowProc := ParentWindowProc; 
    end; 
end; 

procedure TFrame2.DestroyWnd; 
var 
    ParentForm: TCustomForm; 
begin 
    ParentForm := GetParentForm(Self); 
    if ParentForm <> nil then 
    ParentForm.WindowProc := fSavedWndProc; 
    inherited; 
end; 

procedure TFrame2.DoEnterSizeMove; 
begin 
    if Assigned(fOnEnterSizeMove) then 
    fOnEnterSizeMove(Self); 
end; 

procedure TFrame2.DoExitSizeMove; 
begin 
    if Assigned(fOnExitSizeMove) then 
    fOnExitSizeMove(Self); 
end; 

procedure TFrame2.ParentWindowProc(var AMessage: TMessage); 
begin 
    fSavedWndProc(AMessage); 
    if AMessage.Msg = WM_ENTERSIZEMOVE then 
    DoEnterSizeMove; 
    if AMessage.Msg = WM_EXITSIZEMOVE then 
    DoExitSizeMove; 
end; 

Примечание что сообщения отправляются всякий раз, когда был запущен или оставлен вторичный цикл сообщений для перемещения/калибровки - нет способа различать перемещение и калибровку. Если вам нужно убедиться, что вы уловили только размер, вы должны сравнить старый и новый размер кадра в обработчике.

0

Я думаю, что это может быть сделано путем остановки события изменения размера (для сброса времени) и запуска таймера с тайм-аутом et (0,3 с). Затем изменение размера рамки будет сделано вскоре после остальной части изменения размера.

0

1) Отметьте свою раму специальным интерфейсом smth. например: INeedLayoutAfterResize :)

2) Напишите пользовательский потомок TForm, который будет захватывать события изменения размера (как показано в более ранних ответах), чем поиск его дочерних элементов и если какой-либо дочерний элемент помечен, чем повторная компоновка его содержимого.

Фактически я использую такой подход для сохранения и восстановления состояния управления. мой обычай от итерации по элементам управления детьми и поиск свойства Tag, если он меньше нуля, записать его состояние в ini-файл.