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

  • Автор темы programmer8329
  • Дата начала
P

programmer8329

Код:
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 дочка.
 
S

sinkopa

Здравствуйте у меня следующая проблема с resize event, у меня почемуто после того как я раскрываю форму 2(вернее я знаю почему это из за того что разместил меню на форме1) вызываются сразу два сообщения сначала maximized а потом normal , а мне нужно чтоб сообщение вызывалось один раз при раскрытие maximized а в обычном состояние normal. что не так ? Форма 1 родительская а форма2 дочка.
(1) Self.WindowState - это исходное состояние формы... оно меняется (или НЕ меняется) уже ПОСЛЕ того как завершится Ваш TForm2.FormResize. Т.е. внутри FormResize Вы никак не можете определить станет ли оно wsmaximized или по прежнему останется wsnormal на какое-то время.
(2) Событие FormResize наступает столько раз, скольно приходит (!от системы!) "указаний" на изменение размеров формы. Напимер если в настройках системы (Мой компьютер->Свойства->Дополнительно->Быстродействие) включены опции анимации окон, событие FormResize будет наступать столько раз, сколько потребуется для анимации. Если Вы изменяете размеры мышью (за уголок формы), количество FormResize будет зависеть от того насколько "резво" Вы будете дергать мышь... ;)
Уточните, какие именно "моменты жизни" формы Вы пытаетесь отлавливать, может я подскажу как правильно это организовать.
Только изъясняйтесь пожалуйста понятным языком... Согласитесь что
- "состояние формы, действие(я) пользователя, новое состояние, событие которое ловим"
и
- "состояние формы, действие(я) пользователя, событие которое ловим, новое состояние"
это несколько разные события...
 
P

programmer8329

Хорошо объясню на простом примере предположим у нас есть переменая expanded:boolean, мне нужно чтоб при раскрытие формы(т.е нажатие кнопки левее х) переменая expanded приняла знаяение true, а при возвращение в нормальное состояние expanded становилось false а у меня на деле происходит в нормальном состояние expanded становится true.
 
S

sinkopa

Хорошо объясню на простом примере предположим у нас есть переменая 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.
 
P

programmer8329

Я сегодня протестировал ваш код, все работает это то что я ожидал, большое спасибо за помощь.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!