Форум: "Начинающим";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];
ВнизКак узнать из какой формы вызвана форма ? Найти похожие ветки
← →
Монг (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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.038 c