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

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

Как узнать из какой формы вызвана форма ? [D7]


Монг ©   (2006-10-10 12:12:00) 

Допустим есть 3 формы на двух из них есть кнопочки которые могут вызвать третью форму. Как узнать из какой именно формы вызвана форма ?


RASkov   (2006-10-12 19:37:00) [1]

> TForm3.Create( Self).Show;

А мы тут голову ломали... свойства какието придумывали:)

function GetCalledForm: TForm;
begin
 Result:=TForm(Owner);
end;

ну и ченить на nil проверку вставить.


Loginov Dmitry   (2006-10-12 08:03:00) [2]

Монг   (10.10.06 12:12)
Как узнать из какой именно формы вызвана форма


// Так вызываешь 3-ю форму
procedure TForm1.Bitton1Click();
begin
 TForm3.Create(Self).Show;
end;

// Так проверяешь из какой формы была вызвана:
procedure TForm3.Bitton1Click();
begin
 if Owner.ClassName = 'TForm1' then
    ShowMessage('Из первой!')
 else
    ShowMessage('Не из первой :(');
end;


KSergey   (2006-10-12 07:24:00) [3]

Подозреваю, что автора интересует не столько из какой формы вызвано, сколько изменить поведение создаваемой формы в зависимости от контекста создания 3-й формы (я понятно написал?).
А потому, уверен, лучше в форме 3 собдать соотв. свойство с осмысленным названием и его устанавливать при создании фотмы в осмысленное значение.

Например, условия такие: при вызове из фотмы 1 хотим отобразить доп. справочник деталей фирмы X на форме3, а при вызове из формы2 - аналогичный стпавочник, но фирмы Y. (Разумеется, это можно сделать совершенно иначе, передавая имя таблицы или еще как-то, но это уже отдельная тема.)

TReferEnum = (reFirmaX, reFirmaY);

TForrm3 = class
private
  FreferList: TReferEnum;
  procedure SetreferList(val: TReferEnum);
....
public
  property referList: TReferEnum read FreferList write SetreferList;
...

// в обработчике формы 1
with TForrm3.Create(self) do
try
  referList := reFirmaX;
  ShowModal;
finally
  Free;
end;

// в обработчике формы 2
with TForrm3.Create(self) do
try
  referList := reFirmaY;
  ShowModal;
finally
  Free;
end;


(В синтаксисе могу приврать, сорри.)
Ну а уже в методе Set от проперти выполнить необходимую работу по перенастройке формы 3.


Leonid Troyanovsky   (2006-10-11 21:55:00) [4]


> RASkov   (11.10.06 20:48) [13]

> Да, но после она потеряется:) если не заносить ее в переменную.
>  В вопросе не было сказано когда и сколько раз нужно "узнавать"


Пусть вопрошающий и уточняет.
А переменные - они тоже не даром даются.

--
Regards, LVT.


RASkov   (2006-10-11 20:48:00) [5]

> Screen.ActiveForm -
> это и будет форма, имеющая фокус

Да, но после она потеряется:) если не заносить ее в переменную. В вопросе не было сказано когда и сколько раз нужно "узнавать" вызвашую форму. Без дополнительных переменных Ваш вариант только на OnShow и будет знать. А с "дополнительной переменной" - можно совместить Ваш способ со свойством [9],[10] или завести переменную.
Т.е. на OnShow присваивать CalledForm:=Screen.ActiveForm;


Leonid Troyanovsky   (2006-10-10 21:12:00) [6]


> Монг   (10.10.06 12:12)  

> могут вызвать третью форму. Как узнать из какой именно формы
> вызвана форма ?


В OnShow вызываемой формы можно запросить Screen.ActiveForm -
это и будет форма, имеющая фокус в момент вызова Show.

--
Regards, LVT.


DataFlower   (2006-10-10 17:59:00) [7]


> constructor Create(AOwner: Tcomponent; ACalledForm : TForm);
>  reintroduce;


возможно, правильнее
constructor Create(AOwner: Tcomponent; ACalledForm : TForm);reintroduce;virtual;


DataFlower   (2006-10-10 17:56:00) [8]

TMyForm = class (TForm)
  FCalledForm: TForm;
public
  property CalledForm: TForm read FCalledForm;
  constructor Create(AOwner: Tcomponent; ACalledForm : TForm); reintroduce;
end;

constructor TMyForm.Create(AOwner: Tcomponent; ACalledForm : TForm);
begin
 inherited Create(AOwner);
 FCalledForm:=ACalledForm;
end;
.....

извините за возможные обшибки

procedure TForm1.ButtonClick(Sender: TObject);
var frm : TMyForm;
begin
 frm := TMyForm.Create(Application, Self);
....
end;


RASkov   (2006-10-10 16:24:00) [9]

Т.е. в каждой форме завести переменную CalledForm: TForm;(var F:TForm; выше) или еще лучше наследовать форму от TForm так
TMyForm = class (TForm)
   FCalledForm: TForm;
 public
   property CalledForm: TForm read FCalledForm write FCalledForm (SetCalledForm);
 end;
//и свои формы от TMyForm;
TForm1 = class (TMyForm)
....
end;

.....

procedure TForm1(2..n).ButtonClick(Sender: TObject);
begin
Form3(n).CalledForm:=Self;
Form3(n).Show;
end;

Предлогаю как вариант.


RASkov   (2006-10-10 16:06:00) [10]

Не совсем дословно(докодно) ну помоему можно что то типа так:

procedure TForm1(2..n).ButtonClick(Sender: TObject);
begin
 Form3(n).Tag:=Integer(Self);
 Form3(n).Show;
end;


в Form3(n) получить вызвавшую форму:
var F: TForm;
...
if Tag<>0 then F:=TForm(Tag);
....


при закрытии формы Tag:=0;


clickmaker   (2006-10-10 14:09:00) [11]


>  [4] Монг   (10.10.06 14:01)

смотря, чего требует логика программы.
Если у тебя эти формы унаследованы от одной, метод (свойство) которой может вызываться в 3-й, то удобней передать указатель.
Т.е. у тебя есть некая TMyCustomForm = class(TForm), TMyForm1 = class(TMyCustomForm), TMyForm2 = class(TMyCustomForm)
передаешь (ACaller: TMyCustomForm)

а если там что-то типа case, то лучше тэг
(ACallerID: integer)
case ACallerID of
 1: // форма1
 2: // форма2


regdown   (2006-10-10 14:07:00) [12]

тоесть
вар
и:интегер
бегин
форма3.и.:=1;
форма3.шоу;
энд
и с другой также


regdown   (2006-10-10 14:05:00) [13]

можешь сделать просто через параметры, конечно это не выход, тоже криво, но легко, просто на форму отправляешь в парметр номер другой формы, которая и вызывала окошко


Монг   (2006-10-10 14:01:00) [14]

А если использовать свойвство tag у формы, в зависимости от того какая кнопка нажата ? Не кривой ли мой вариант решения проблемы ?
Я почему спрашиваю, потому что хочу научиться правильно писать програмы, а не криво .


ЮЮ   (2006-10-10 12:35:00) [15]

Лучше этого не знать? Ибо вызвать её с 4 формы уже нельзя будет, ибо в  коде не прописано. Какая разница кто и откуда вызвал. Главное, прописать форме что или с чем ей иметь дело, если её поведение может быть разным.


Elen   (2006-10-10 12:21:00) [16]


> Монг

Попробуй обратиться к Parent Sendera, который передается в обработчик кнопки по клику. или Parent Parenta если кнопки на форме в контейнере каком нибудь...


clickmaker   (2006-10-10 12:19:00) [17]

передать указатель на форму как параметр в третью


Наверх

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