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

Тема в разделе "Delphi - Компоненты", создана пользователем programmer8329, 4 мар 2013.

  1. programmer8329

    Репутация:
    0
    Регистрация:
    28 июн 2012
    Сообщения:
    19
    Симпатии:
    0
    Код:
    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 дочка.
     
  2. sinkopa

    sinkopa Well-Known Member

    Репутация:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    (1) Self.WindowState - это исходное состояние формы... оно меняется (или НЕ меняется) уже ПОСЛЕ того как завершится Ваш TForm2.FormResize. Т.е. внутри FormResize Вы никак не можете определить станет ли оно wsmaximized или по прежнему останется wsnormal на какое-то время.
    (2) Событие FormResize наступает столько раз, скольно приходит (!от системы!) "указаний" на изменение размеров формы. Напимер если в настройках системы (Мой компьютер->Свойства->Дополнительно->Быстродействие) включены опции анимации окон, событие FormResize будет наступать столько раз, сколько потребуется для анимации. Если Вы изменяете размеры мышью (за уголок формы), количество FormResize будет зависеть от того насколько "резво" Вы будете дергать мышь... ;)
    Уточните, какие именно "моменты жизни" формы Вы пытаетесь отлавливать, может я подскажу как правильно это организовать.
    Только изъясняйтесь пожалуйста понятным языком... Согласитесь что
    - "состояние формы, действие(я) пользователя, новое состояние, событие которое ловим"
    и
    - "состояние формы, действие(я) пользователя, событие которое ловим, новое состояние"
    это несколько разные события...
     
  3. programmer8329

    Репутация:
    0
    Регистрация:
    28 июн 2012
    Сообщения:
    19
    Симпатии:
    0
    Хорошо объясню на простом примере предположим у нас есть переменая expanded:boolean, мне нужно чтоб при раскрытие формы(т.е нажатие кнопки левее х) переменая expanded приняла знаяение true, а при возвращение в нормальное состояние expanded становилось false а у меня на деле происходит в нормальном состояние expanded становится true.
     
  4. sinkopa

    sinkopa Well-Known Member

    Репутация:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Ну... если нужно просто переключать флаг, то
    (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.
     
  5. programmer8329

    Репутация:
    0
    Регистрация:
    28 июн 2012
    Сообщения:
    19
    Симпатии:
    0
    Я сегодня протестировал ваш код, все работает это то что я ожидал, большое спасибо за помощь.
     
Загрузка...
Похожие Темы - Проблема Resize Событием
  1. pack
    Ответов:
    5
    Просмотров:
    61
  2. Alex1994
    Ответов:
    7
    Просмотров:
    119
  3. PingvinPingvin
    Ответов:
    10
    Просмотров:
    126
  4. Free2playman
    Ответов:
    14
    Просмотров:
    151
  5. Дмитрий17
    Ответов:
    10
    Просмотров:
    204

Поделиться этой страницей