Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
3-1157344772
sias
2006-09-04 08:39
2006.10.29
Хранение почты eml в базе mssql


2-1160632579
Wolfram
2006-10-12 09:56
2006.10.29
Как объявить константный массив структур?


15-1160299892
Id
2006-10-08 13:31
2006.10.29
Печатается не русский шрифт


2-1160717393
031178
2006-10-13 09:29
2006.10.29
FastReport


2-1160640883
LeonQ
2006-10-12 12:14
2006.10.29
TFormShaper - установка





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский