Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.01.17;
Скачать: CL | DM;

Вниз

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

 
Kolan ©   (2008-10-14 18:03) [0]

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

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

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

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

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

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

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

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


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


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


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

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


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


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

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

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


 
Kolan ©   (2008-10-15 14:28) [3]

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

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

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

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

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

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


 
Anatoly Podgoretsky ©   (2008-10-15 14:39) [4]

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


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

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

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


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

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

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

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

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


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

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


 
KSergey ©   (2008-10-15 16:26) [7]

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

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


 
KSergey ©   (2008-10-15 16:27) [8]

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


 
Kolan ©   (2008-10-15 16:28) [9]

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


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

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


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

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


 
Anatoly Podgoretsky ©   (2008-10-15 17:22) [12]

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

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

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

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


 
TStas ©   (2008-10-15 20:14) [13]

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


 
Vlad Oshin ©   (2008-10-22 11:02) [14]

как вариант

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;


 
Slym ©   (2008-10-22 12:36) [15]

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


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

Screen.OnActiveFormChange()

WM_NCACTIVATE


 
Malex ©   (2008-10-23 11:34) [17]

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

 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;

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


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


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

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


 
Leonid Troyanovsky ©   (2008-10-23 18:49) [19]


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

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

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

--
Regards, LVT.


 
имя   (2009-02-02 09:53) [20]

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



Страницы: 1 вся ветка

Текущий архив: 2010.01.17;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.016 c
15-1258023746
stas
2009-11-12 14:02
2010.01.17
Альтернатива TWebBrowser


15-1258483044
0x00FF00
2009-11-17 21:37
2010.01.17
Excel, массив длины N из одного элемента


2-1259247302
recop
2009-11-26 17:55
2010.01.17
Удаление узла TreeView по абсолютному индексу


2-1259002119
kyran29
2009-11-23 21:48
2010.01.17
отразить процесс закачки файла


1-1223992986
Kolan
2008-10-14 18:03
2010.01.17
Как «поймать» событие активизации формы.