Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.007 c
2-1259321774
Егорка
2009-11-27 14:36
2010.01.17
Размер окна


1-1233670260
Dot
2009-02-03 17:11
2010.01.17
Каким обр. оптимально реализовать межпрограммное взаимодействие?


15-1258032175
TUser
2009-11-12 16:22
2010.01.17
Президент послал про сверхпроводимость ...


2-1259046611
igor_m
2009-11-24 10:10
2010.01.17
Региональные стандарты


2-1259491214
Drowsy
2009-11-29 13:40
2010.01.17
BPL и ошибки компиляции.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский