Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.29;
Скачать: CL | DM;

Вниз

Как узнать из какой формы вызвана форма ?   Найти похожие ветки 

 
Монг   (2006-10-10 12:12) [0]

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


 
clickmaker ©   (2006-10-10 12:19) [1]

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


 
Elen ©   (2006-10-10 12:21) [2]


> Монг

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


 
ЮЮ ©   (2006-10-10 12:35) [3]

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


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

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


 
regdown   (2006-10-10 14:05) [5]

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


 
regdown   (2006-10-10 14:07) [6]

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


 
clickmaker ©   (2006-10-10 14:09) [7]


>  [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


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

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

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;


 
RASkov   (2006-10-10 16:24) [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;

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


 
DataFlower ©   (2006-10-10 17:56) [10]

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;


 
DataFlower ©   (2006-10-10 17:59) [11]


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


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


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


> Монг   (10.10.06 12:12)  

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


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

--
Regards, LVT.


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

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

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


 
Leonid Troyanovsky ©   (2006-10-11 21:55) [14]


> RASkov   (11.10.06 20:48) [13]

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


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

--
Regards, LVT.


 
KSergey ©   (2006-10-12 07:24) [15]

Подозреваю, что автора интересует не столько из какой формы вызвано, сколько изменить поведение создаваемой формы в зависимости от контекста создания 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.


 
Loginov Dmitry ©   (2006-10-12 08:03) [16]

Монг   (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;


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

> TForm3.Create(Self).Show;

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2006.10.29;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.031 c
2-1160666423
i-am-vladko
2006-10-12 19:20
2006.10.29
потоки...


11-1132569120
Reset
2005-11-21 13:32
2006.10.29
Подсказка-"шарик" у иконки трея


2-1160394334
NetRaven
2006-10-09 15:45
2006.10.29
StringGrid


15-1160393864
лор
2006-10-09 15:37
2006.10.29
радиовещание


2-1161019593
DROWSY
2006-10-16 21:26
2006.10.29
SQL?