![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как «поймать» событие активизации формы.
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 формы А делал все, что мне нужно.