Форум: "Основная";
Текущий архив: 2010.01.17;
Скачать: [xml.tar.bz2];
ВнизКак «поймать» событие активизации формы. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.008 c