Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как «поймать» событие активизации формы.


Kolan ©   (2008-10-14 18:03:00) 

Здравствуйте!

Проблема вот в чем:
Есть проект в котором есть две формы Аи Б. На форме Аесть кнопка и лэйбл. Еще есть контроллер К. Форма Аглавная.

При нажатии на кнопку в форме Авызывается метод контроллера К, в котором создаётся и показывается модально форма Б.
А--->K---создание--->Б

Бпоказывается так, что форму Ане видно, хотя это не важно.

Когда форма Бзакроется, то снова станет видна форма А. В этот момент нужно изменить текст лэйбла, лежащего на форме А.

Проблемазаключается в том, что, как я понял, подходящего события формы не существует.

Возможно вы предложите как-то уведомлять форму Апри закрытии Б. Этот вариант плох тем, что во-первых контроллеру очень не удобно «добираться» до формы (надо хронить ссылку и т. д.), а, во-вторых, при наличии нескольких форм типа Бполучается дублирование кода.

Как же поймать это событие активизацииформы А?


  (2009-02-02 09:53:00) [1]

Удалено модератором


Leonid Troyanovsky   (2008-10-23 18:49:00) [2]


> Malex ©   (23.10.08 11:34) [17]

> Используйте для создания модальной формы функцию обертку.

Использовать надо не функцию, а шаблон.
См. также
http://podgoretsky.com/OtherParts/DM/BadTips.aspx?#06

--
Regards, LVT.


Плохиш   (2008-10-23 11:47:00) [3]


> Использование функции хорошо тем, что при создании формы
> в нее можно передать пользовательские параметры, а после
> завершения работы с формой можно вернуть необходимую информацию.

Следует это понимать так, что в противном случае в создаваемую форму нельзя передать " пользовательские параметры" и вернуть из неё " необходимую информацию"?


Malex   (2008-10-23 11:34:00) [4]

Используйте для создания модальной формы функцию обертку.
Пример:

 TMyForm= class(TForm)
   ...
 private      { Private declarations }
 public       { Public declarations }
  procedure SetParameters(...);
 end;

function AName(...): AType;  // AType - любой произвольный тип
var
 MyForm: TMyForm;  // !!! Переменная формы объявляется внутри функции
begin
 MyForm := TMyForm.Create;
 try
   SetParameters(...);
   ...
 finally
   MyForm.Free;
 end;
end;

Использование функции хорошо тем, что при создании формы в нее можно передать пользовательские параметры, а после завершения работы с формой можно вернуть необходимую информацию.
-----
Используя информацию, которую возвратила функция-обертка можете принимать решение: что и как сделать.


PingPong   (2008-10-22 23:37:00) [5]

Screen.OnActiveFormChange()

WM_NCACTIVATE


Slym   (2008-10-22 12:36:00) [6]

Kolan ©   (15.10.08 16:53) [11]
Помоему, в данном контексте, это единственное "верное" место...
О каком дублирование идет речЪ? Label.Caption:='OK';?


Vlad Oshin   (2008-10-22 11:02:00) [7]

как вариант

type
 TForm1 = class(TForm)
   Button1: TButton;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private      { Private declarations }
 public       { Public declarations }
   procedure onActivFCh(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
form2.show;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Screen.OnActiveFormChange:=onActivFCh
end;

procedure TForm1.onActivFCh(Sender: TObject);
begin
 if not Application.Terminated
   then form1.memo1.Lines.Add('Curent activ form is: '+Screen.ActiveForm.Caption)
end;


TStas   (2008-10-15 20:14:00) [8]

А нельзя просто сделать, чтобы модальная форма в OnShow посылала сообщение, куда следует, а при закрытии - другое сообщение? Ну и реагировать на эти сообщения уже. И дублирования кода не будет.


Anatoly Podgoretsky   (2008-10-15 17:22:00) [9]

> Kolan  (15.10.2008 16:18:06)  [6]

ружнче событие - ты меня поставил в тупик, мне тоже ничего в голову не приходит.
Теперь по теме

--> фокус передается в Б (активируется Б).
Б уничтожается
--> фокус передается в А (активируется А).
А уничтожается.
--> фокус передается в X (активируется X).

Никаких событий OnActivate не происходит, поскольку нет деактивации, поскольку нельзя перейти из Б в А или Х без закрытия Б. Поэтому и событии не нужны, процедура Активации, закрытие предыдущего модального диалога/формы.


Kolan   (2008-10-15 16:53:00) [10]

Да, действительно — это еще одно место. Оно, наверное, самое подходящее из всех, правда дублирование кода все равно будет. Тем не менее, это неплохое решение, до которого я не додумался. Благодарю.


KSergey   (2008-10-15 16:40:00) [11]

Ну как же к чему?
Значит вот оно место где надо обновить лейблу - по возврату из метода контроллера, создающего Б!
Так я понимаю.


Kolan   (2008-10-15 16:28:00) [12]

Нет не возвращается. К чему ты клонишь?


KSergey   (2008-10-15 16:27:00) [13]

вернее так: после того как форма А вызвала у контроллера метод создания Б - она тут же получила управление (в том же самом методе) или только после показа/закрытия Б?


KSergey   (2008-10-15 16:26:00) [14]

> Kolan ©   (15.10.08 16:18) [6]
> Не понял, что такое асинхронное создание модальных форм.

Я вот на что намекаю: успавление в форму А возвращается до выхода из формы Б?


Kolan   (2008-10-15 16:18:00) [15]

Не понял, что такое асинхронное создание модальных форм...

Грубо говоря, форма Бсоздаётся по команде из формы А.

Логически происходит примерно так:

Создать и показать модально А.
  А командует контроллеру создать и показать модально Б.
 Создать Б.
 ...
 Б уничтожается.
А уничтожается.


Схема выше упрощена, на самом деле, при создании, формы требуют интерфейсы и работают через них же.

Анатолий, я не знаю что такое ружнчесобытие. Ручное, ржачное... вроде все не подходит.


KSergey   (2008-10-15 16:01:00) [16]

> Kolan ©   (14.10.08 18:03)  
> При нажатии на кнопку в форме А вызывается метод контроллера
> К, в котором создаётся и показывается модально форма Б.
> А--->K---создание--->Б

Мне вот что любопытно в этой цепочке: а что, модальнаяформа Б создается контроллером асинхронно? После выхода из метода формы А?


Anatoly Podgoretsky   (2008-10-15 14:39:00) [17]

Так никакой деактивации формы не происходит и ружнче событие это следующая строка за CalibrationScreen.Free;


Kolan   (2008-10-15 14:28:00) [18]

Игорь, вариант я понял, но он не очень подходит. И форма Аи форма Бсоздаются и умирают внутри методов:

procedure TSystemController.ShowCalibration(ACalibration: TCalibration);
var
 CalibrationScreen: TCalibrationScreen;
begin
...
   CalibrationScreen := TCalibrationScreen.Create(nil);
   try
     ...
   finally
     CalibrationScreen.Free;
   end;
...
end;

Так что назначать форме Бвладельцем форму Ане удобно.

Плохиш, OnActivateне возникает в описанном случае (хотя я думаю, что это было бы логично). Событие, которое, если я правильно понял, должно вручную вызываться из контроллера при закрытии формы Брешает проблему связи контроллера и формы, но все равно приведёт к дублирующемуся коду (хотя это будет всего одна строка), которого я бы хотел избежать.

По идеи форма должна изменять текст когда она становится активной. Если бы такое событие имелось, то код был бы только в одном месте и, кроме того, не пришлось бы связывать контроллер с формой (Сейчас такой связи нет. Только форма обращается к контроллеру, да и то через интерфейс).

Может есть еще какой нибудь способ?


Плохиш   (2008-10-15 11:14:00) [19]


> Когда форма Б закроется, то снова станет видна форма А.
> В этот момент нужно изменить текст лэйбла, лежащего на форме
> А.
>
> Проблема заключается в том, что, как я понял, подходящего
> события формы не существует.

OnActivate не помогает?
> Возможно вы предложите как-то уведомлять форму А при закрытии
> Б. Этот вариант плох тем, что во-первых контроллеру очень
> не удобно «добираться» до формы (надо хронить ссылку и т.
>  д.), а, во-вторых, при наличии нескольких форм типа Б получается
> дублирование кода.

У контроллера создаётся событие и в форме A присваивается обработчик этому событию и ни о каких формах A контроллер ничего не знает.


Игорь Шевченко   (2008-10-14 20:28:00) [20]


> Когда форма Б закроется, то снова станет видна форма А.
> В этот момент нужно изменить текст лэйбла, лежащего на форме
> А.


Мне кажется, что тебе надо ловить не событие активации формы A, а событие закрытия формы Б. Через свой же контроллер.

Хотя я в таких случаях поступал проще - у формы А перекрывал метод Notification, создавал форму Б, указывая ей в качестве Onwer-а форму А, тогда при уничтожении (связанном с закрытием) формы Б в перекрытом методе Notification формы А делал все, что мне нужно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо