Проблема С Resize Событием

28.06.2012
19
0
#1
Код:
Unit Unit1;

Interface

Uses
.........

Type 
Tform1=class(tform)
Mainmenu1:tmainmenu;

Private

Public

End;


Var
Form1:tform1;

Implementation

Uses Unit2;


End.







Unit unit2;

Interface

Uses
........

Type

Tform2=class(tform)
Button1:tbutton;
Procedure formresize(sender:tobject);
Procedure button1click(sender:tobject);
Private

Public

End;

Var

Form2:Tform2;

Implementation

Procedure tform2.formresize(sender:tobject);

Begin

If self.windowstate=wsnormal then
Showmessage('maximized'+' '+ inttostr(self.top));

If self.windowstate=wsmaximized then 
Showmessage('normal'+' '+inttostr(self.top)); 

End;

Procedure tform2.button1click(sender:tobject);

Begin 

Showmessage(inttostr(self.top));

End;

End.
Здравствуйте у меня следующая проблема с resize event, у меня почемуто после того как я раскрываю форму 2(вернее я знаю почему это из за того что разместил меню на форме1) вызываются сразу два сообщения сначала maximized а потом normal , а мне нужно чтоб сообщение вызывалось один раз при раскрытие maximized а в обычном состояние normal. что не так ? Форма 1 родительская а форма2 дочка.
 

sinkopa

Well-known member
17.06.2009
344
4
#2
Здравствуйте у меня следующая проблема с resize event, у меня почемуто после того как я раскрываю форму 2(вернее я знаю почему это из за того что разместил меню на форме1) вызываются сразу два сообщения сначала maximized а потом normal , а мне нужно чтоб сообщение вызывалось один раз при раскрытие maximized а в обычном состояние normal. что не так ? Форма 1 родительская а форма2 дочка.
(1) Self.WindowState - это исходное состояние формы... оно меняется (или НЕ меняется) уже ПОСЛЕ того как завершится Ваш TForm2.FormResize. Т.е. внутри FormResize Вы никак не можете определить станет ли оно wsmaximized или по прежнему останется wsnormal на какое-то время.
(2) Событие FormResize наступает столько раз, скольно приходит (!от системы!) "указаний" на изменение размеров формы. Напимер если в настройках системы (Мой компьютер->Свойства->Дополнительно->Быстродействие) включены опции анимации окон, событие FormResize будет наступать столько раз, сколько потребуется для анимации. Если Вы изменяете размеры мышью (за уголок формы), количество FormResize будет зависеть от того насколько "резво" Вы будете дергать мышь... ;)
Уточните, какие именно "моменты жизни" формы Вы пытаетесь отлавливать, может я подскажу как правильно это организовать.
Только изъясняйтесь пожалуйста понятным языком... Согласитесь что
- "состояние формы, действие(я) пользователя, новое состояние, событие которое ловим"
и
- "состояние формы, действие(я) пользователя, событие которое ловим, новое состояние"
это несколько разные события...
 
28.06.2012
19
0
#3
Хорошо объясню на простом примере предположим у нас есть переменая expanded:boolean, мне нужно чтоб при раскрытие формы(т.е нажатие кнопки левее х) переменая expanded приняла знаяение true, а при возвращение в нормальное состояние expanded становилось false а у меня на деле происходит в нормальном состояние expanded становится true.
 

sinkopa

Well-known member
17.06.2009
344
4
#4
Хорошо объясню на простом примере предположим у нас есть переменая expanded:boolean, мне нужно чтоб при раскрытие формы(т.е нажатие кнопки левее х) переменая expanded приняла знаяение true, а при возвращение в нормальное состояние expanded становилось false а у меня на деле происходит в нормальном состояние expanded становится true.
Ну... если нужно просто переключать флаг, то
(1) Кладем на форму компонент ApplicationEvents (вкладка палитры компонентов Additional).
(2) В обработчике события OnIdle проверяем состояние формы и переключаем флаг (если требуется).
Код:
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, AppEvnts;

type
TForm2 = class(TForm)
ApplicationEvents1: TApplicationEvents;
procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;
expanded: Boolean = False;

implementation

{$R *.dfm}

procedure TForm2.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
var
b: Boolean;
begin
b := (Self.WindowState = wsmaximized);
if expanded <> b then
expanded := b;
end;

end.
 
28.06.2012
19
0
#5
Я сегодня протестировал ваш код, все работает это то что я ожидал, большое спасибо за помощь.