Доступ к формам из других форм
Модератор: Модераторы
- GAMER
- энтузиаст
- Сообщения: 627
- Зарегистрирован: 06.08.2008 13:41:07
- Откуда: Ужгород-Днепр, Украина
- Контактная информация:
Доступ к формам из других форм
Пример. Есть форма Frm0, которая создает форму через Application.CreateForm(TFrm1,Frm1);
Frm1 создано 2 штуки. Она же в свою очередь через Application.CreateForm(TFrm2,Frm2); создает форму Frm2.
Первый экземпляр Frm1 создал свою форму Frm2, а второй экземпляр - свою Frm2.
Как проще сделать, чтобы с первого экземпляра Frm2 получить доступ к своей Frm1 (например к Caption), а со второго экземпляра Frm2 к своей родительськой форме Frm1?
Если просто указать в форме Frm2 оператор Frm1.Caption:='test'; то заголовок меняется только в последней созданой формк Frm1.
Frm1 создано 2 штуки. Она же в свою очередь через Application.CreateForm(TFrm2,Frm2); создает форму Frm2.
Первый экземпляр Frm1 создал свою форму Frm2, а второй экземпляр - свою Frm2.
Как проще сделать, чтобы с первого экземпляра Frm2 получить доступ к своей Frm1 (например к Caption), а со второго экземпляра Frm2 к своей родительськой форме Frm1?
Если просто указать в форме Frm2 оператор Frm1.Caption:='test'; то заголовок меняется только в последней созданой формк Frm1.
Вот это дааа... Три раза читал - мало чего понял - что за чем следует... Мне показалось, каждый экземпляр формы использует одну и ту же глобальную переменную Frm1 (Frm2) для создания новых экземпляров. Я правильно понял? Если да, то естественно, что переменная хранит адрес только последней созданной формы (не важно кем).
- GAMER
- энтузиаст
- Сообщения: 627
- Зарегистрирован: 06.08.2008 13:41:07
- Откуда: Ужгород-Днепр, Украина
- Контактная информация:
2VirtUX Думаю, что Вы правильно поняли.
Попробую расшифровать.
Основная форма:
Она вызывает первую форму:
Перваю вызывает вторую форму:
При работе есть две одинаковые формы Frm1. Из них вызываются Frm2.
Хотелось бы с формы Frm2(a) написать заголовок в форме Frm1(a), а с формы Frm2(b) заголовок в форме Frm1(b).
Думаю, что нужно делать через handle формы, только не знаю как
Попробую расшифровать.
Основная форма:
Код: Выделить всё
Unit UFrm0;
type
{ TFrm0 }
TFrm0 = class(TForm)
.....
.....
var
Frm0: TFrm0;
procedure TFrm0.MenuItem6Click(Sender: TObject);
begin
Application.CreateForm(TFrm1,Frm1);
end;
Она вызывает первую форму:
Код: Выделить всё
Unit UFrm1;
type
{ TFrm1}
TFrm1 = class(TForm)
.....
.....
var
Frm1: TFrm1;
procedure TFrm1.MenuItem1Click(Sender: TObject);
begin
Application.CreateForm(TFrm2,Frm2);
end;
Перваю вызывает вторую форму:
Код: Выделить всё
Unit UFrm2;
type
{ TFrm2}
TFrm2 = class(TForm)
.....
.....
var
Frm2: TFrm2;
procedure TFrm2.Button1Click(Sender: TObject);
begin
Frm1.Caption:='Test';
end;
При работе есть две одинаковые формы Frm1. Из них вызываются Frm2.
Код: Выделить всё
Frm0
/ \
| |
Frm1 (a) Frm1 (b)
| |
Frm2(a) FRm2(b)Хотелось бы с формы Frm2(a) написать заголовок в форме Frm1(a), а с формы Frm2(b) заголовок в форме Frm1(b).
Думаю, что нужно делать через handle формы, только не знаю как
Последний раз редактировалось GAMER 07.09.2010 21:39:23, всего редактировалось 3 раза.
А вы сделайте проще. Добавьте в класс формы свойство типа TForm и при создании присваивайте ему указатель на того кто создал.
Код: Выделить всё
type
TFrm2 = TForm2
...
public
fCreator: TForm;
...
end;
....
Application.CreateForm(TFrm2,Frm2);
Frm2.fCreator:=Self;
....
procedure TFrm2.Button1Click(Sender: TObject);
begin
fCreator.Caption:='Test';
end;
...
- GAMER
- энтузиаст
- Сообщения: 627
- Зарегистрирован: 06.08.2008 13:41:07
- Откуда: Ужгород-Днепр, Украина
- Контактная информация:
Спасибо! Отличный вариант!
Теперь - продолжение. На Frm1 есть Edit1. Как обратиться к Edit1 на нужной форме?
Добавлено спустя 35 минут 41 секунду:
Решил:
Вместо TForm нужно TFrm1
Теперь - продолжение. На Frm1 есть Edit1. Как обратиться к Edit1 на нужной форме?
Добавлено спустя 35 минут 41 секунду:
Решил:
Код: Выделить всё
type
TFrm2 = TForm2
...
public
fCreator: TFrm1;
...
end;
....
Application.CreateForm(TFrm2,Frm2);
Frm2.fCreator:=Self;
....
procedure TFrm2.Button1Click(Sender: TObject);
begin
fCreator.Edit1.Text:='Test';
end;
... Вместо TForm нужно TFrm1
GAMER писал(а):Как обратиться к Edit1 на нужной форме?
Дык, по тому же принципу, который Вам предложил Mr.Smart, т.е. Вы присвоили указатель на нужную форму свойству родительской формы и через этот указатель обращайтесь к любому контролу порождённой формы.
GAMER писал(а):Пример работы обращения через указатель к любому контролу порожденной формы можно?
Вы же сами этот пример написали
Код: Выделить всё
fCreator.Edit1.Text:='Test';GAMER
Чтобы абстрагировать код лучше всё же TForm или вообще TCustomForm.
Чтобы абстрагировать код лучше всё же TForm или вообще TCustomForm.
Код: Выделить всё
TFrm2 = class(TForm2)
...
fCreator: TCustomForm;
...
end;
...
if fCreator is TFrm2 then
(fCreator as TFrm2).Edit1.Text:='Test'
else
...
-
SAK
- постоялец
- Сообщения: 158
- Зарегистрирован: 17.02.2006 23:45:14
- Откуда: Тим
- Контактная информация:
Mr.Smart писал(а):Код: Выделить всё
...
if fCreator is TFrm2 then
(fCreator as TFrm2).Edit1.Text:='Test'
else
...
Тут конечно нет ошибки, но зачем дважды проверять на соответсвие типа? Сначала проверяем через if/then, потом через as. Думаю будет достаточно какой-то одной проверки, например только через as.
Код: Выделить всё
...
(fCreator as TFrm2).Edit1.Text:='Test'
...SAK и получим ексцепшен если fCreator не является TFrm2 
as не является проверкой, а лишь указывает как работать с памятью по адресу. is - является проверкой на соответствие типа класса.
-
SAK
- постоялец
- Сообщения: 158
- Зарегистрирован: 17.02.2006 23:45:14
- Откуда: Тим
- Контактная информация:
Mr.Smart писал(а):SAK и получим ексцепшен если fCreator не является TFrm2
Естественно получим! Для этого и ставим as. Это ведь и нужно для выявления ошибки, а по else что делать будем? Тоже исключение генерить? Но я это к тому, что оптимальнее либо as, либо if/then и простое преобразование типа. Если мы уже проверили соответсвие типа, то as никогда уже не даст исключения, тогда зачем его ставить?
VirtUX писал(а):as не является проверкой, а лишь указывает как работать с памятью по адресу. is - является проверкой на соответствие типа класса.
as проверяет на соответствие типа и если тип не подходит генерирует исключение.
