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

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

Проверка создания формы [D7, XP]


lewka_s ©   (2014-04-24 09:15:00) 

Привет мастера. подскажите вот в каком вопросе:
Есть родительская форма и много дочерних форм, которые создаются по мере их использования (создаю так fmAdd_ls:=TfmAdd_ls.Create(Application);).
Есть форма поиска, она тоже дочерняя, которая передает результаты поиска на форму, с которой она вызвалась. Соответственно при передаче результатов поиска нужно знать с какой формы ее открыли.
Подскажите как это сделать?


turbouser   (2014-04-24 21:35:00) [1]

В одном из проектов сделал через сообщения - т.е. форма, из которой открывается общая для всех форм форма (тавтология, да :)) отправляет этой самой общей форме сообщение тот же SendMessage (собственное сообщение, передаю handle и набор специфических флагов), мол, вызвали тебя из меня. При активации отправляется то же самое сообщение.


lewka_s   (2014-04-24 21:02:00) [2]


> Это костыль.

Почему?


Ega23   (2014-04-24 20:45:00) [3]


> нашел способ попроще


Это костыль.


lewka_s   (2014-04-24 20:30:00) [4]

нашел способ попроще: в событии On Close  у форм fmOrders и fmedit_orders поставил freeandNil(имя формы). вроде работает ОК.
всем спасибо


junglecat   (2014-04-24 12:32:00) [5]

> т.е открыли например fmOrders поделали в ней что-то и закрыли

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


lewka_s   (2014-04-24 12:04:00) [6]

Я то проверяю вот так

procedure TfmSp_ls.btn1Click(Sender: TObject);
begin
if Assigned(fmedit_orders) then
begin
 ---
end;
if Assigned(fmOrders) then
begin
---
end;
end;

работает вроде норм, но если в течении работы пользовались обеими формами (fmOrders и fmedit_orders), т.е открыли например fmOrders поделали в ней что-то и закрыли. и потом начали работать на fmedit_orders, то все равно попадает в условие Assigned(fmOrders)


Ega23   (2014-04-24 10:55:00) [7]

Вариант 1.

TChildForm = class (TForm)
public
 procedure Execute(aOwnerForm: TOwnerForm);
end;

procedure TChildForm.Execute(aOwnerForm: TOwnerForm);
begin
 /////

 aOwnerForm.NotifyResults(...)  ;
end;

TOwnerForm = class (TForm)
public
 procedure Foo;
 procedure NotifyResults(....);
end;

procedure TOwnerForm.Foo;
begin
 with TChildForm.Create(Application) do
   try
      Execute(Self);
   finally
      Free;
   end;  
end;



Вариант 2.

type
 
 TOnSearchResultEvent = procedure (SearchResult: TSomeSearchResult) of object;

TChildForm = class (TForm)
private
 FOnSearchResult: TOnSearchResultEvent;
public
 property OnSearchResult: TOnSearchResultEvent read FOnSearchResult write FOnSearchResult;
 procedure Execute;
end;

procedure TChildForm.Execute;
var
 SearchResult: TSomeSearchResult;
begin
 .....

 if Assigned(FOnSearchResult) then
     FOnSearchResult(SearchResult);
end;

TOwnerForm = class (TForm)
private
 procedure OnSearchResults(SearchResult: TSomeSearchResult);
public
 procedure CreateChildForm;
end;

procedure TOwnerForm.CreateChildForm;
var
 fm: TChildForm;
begin
 fm := TChildForm.Create(...);
 fm.OnSearchResult := OnSearchResults;
 fm.Execute;

 .....
end;


Вариант 3
Через интерфейс, но писать тупо уже лень


Наверх

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