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

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

  1. programmer8329

    Регистрация:
    28 июн 2012
    Сообщения:
    19
    Симпатии:
    0
    Код (Text):
    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

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

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

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Ну... если нужно просто переключать флаг, то
    (1) Кладем на форму компонент ApplicationEvents (вкладка палитры компонентов Additional).
    (2) В обработчике события OnIdle проверяем состояние формы и переключаем флаг (если требуется).
    Код (Delphi):
    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

    Регистрация:
    28 июн 2012
    Сообщения:
    19
    Симпатии:
    0
    Я сегодня протестировал ваш код, все работает это то что я ожидал, большое спасибо за помощь.
     
Загрузка...
Похожие Темы - Проблема Resize Событием
  1. Zloikaktus
    Ответов:
    0
    Просмотров:
    0
  2. c0de3r
    Ответов:
    5
    Просмотров:
    127
  3. DobermannTT
    Ответов:
    10
    Просмотров:
    136
  4. SoulPaladin
    Ответов:
    4
    Просмотров:
    133
  5. Artael
    Ответов:
    1
    Просмотров:
    110

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