Доступ к формам из других форм

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Доступ к формам из других форм

Сообщение GAMER » 07.09.2010 13:51:57

Пример. Есть форма 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.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Доступ к формам из других форм

Сообщение VirtUX » 07.09.2010 15:20:25

Вот это дааа... Три раза читал - мало чего понял - что за чем следует... Мне показалось, каждый экземпляр формы использует одну и ту же глобальную переменную Frm1 (Frm2) для создания новых экземпляров. Я правильно понял? Если да, то естественно, что переменная хранит адрес только последней созданной формы (не важно кем).
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Доступ к формам из других форм

Сообщение GAMER » 07.09.2010 15:39:52

2VirtUX Думаю, что Вы правильно поняли.

Попробую расшифровать.

Основная форма:

Код: Выделить всё
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 формы, только не знаю как :oops:
Последний раз редактировалось GAMER 07.09.2010 21:39:23, всего редактировалось 3 раз(а).
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Доступ к формам из других форм

Сообщение Mr.Smart » 07.09.2010 16:47:31

А вы сделайте проще. Добавьте в класс формы свойство типа 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;     
...   
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Доступ к формам из других форм

Сообщение GAMER » 07.09.2010 21:37:27

Спасибо! Отличный вариант!
Теперь - продолжение. На 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
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Доступ к формам из других форм

Сообщение Vadim » 08.09.2010 04:31:01

GAMER писал(а):Как обратиться к Edit1 на нужной форме?

Дык, по тому же принципу, который Вам предложил Mr.Smart, т.е. Вы присвоили указатель на нужную форму свойству родительской формы и через этот указатель обращайтесь к любому контролу порождённой формы.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Доступ к формам из других форм

Сообщение GAMER » 08.09.2010 09:37:24

Пример работы обращения через указатель к любому контролу порожденной формы можно?
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Доступ к формам из других форм

Сообщение VirtUX » 08.09.2010 10:06:00

GAMER писал(а):Пример работы обращения через указатель к любому контролу порожденной формы можно?

Вы же сами этот пример написали
Код: Выделить всё
fCreator.Edit1.Text:='Test';
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Доступ к формам из других форм

Сообщение Mr.Smart » 08.09.2010 10:26:22

GAMER
Чтобы абстрагировать код лучше всё же TForm или вообще TCustomForm.
Код: Выделить всё
TFrm2 = class(TForm2)
...
   fCreator: TCustomForm;
...
  end;
...
  if fCreator is TFrm2 then
   (fCreator as TFrm2).Edit1.Text:='Test'
  else
...
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Доступ к формам из других форм

Сообщение GAMER » 08.09.2010 10:27:28

2 Mr.Smart. Спасибо. Это более универсально.
2 VirtUX. Имелось в виду, более универсально, не указывая конкретную форму в описании типа свойства.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Доступ к формам из других форм

Сообщение SAK » 09.09.2010 09:10:49

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
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Re: Доступ к формам из других форм

Сообщение Mr.Smart » 09.09.2010 12:32:38

SAK и получим ексцепшен если fCreator не является TFrm2 :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Доступ к формам из других форм

Сообщение GAMER » 09.09.2010 14:30:00

Я бы не считал as нормальной проверкой.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Доступ к формам из других форм

Сообщение VirtUX » 09.09.2010 16:56:31

as не является проверкой, а лишь указывает как работать с памятью по адресу. is - является проверкой на соответствие типа класса.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Доступ к формам из других форм

Сообщение SAK » 10.09.2010 11:22:55

Mr.Smart писал(а):SAK и получим ексцепшен если fCreator не является TFrm2 :wink:

Естественно получим! Для этого и ставим as. Это ведь и нужно для выявления ошибки, а по else что делать будем? Тоже исключение генерить? Но я это к тому, что оптимальнее либо as, либо if/then и простое преобразование типа. Если мы уже проверили соответсвие типа, то as никогда уже не даст исключения, тогда зачем его ставить?

VirtUX писал(а):as не является проверкой, а лишь указывает как работать с памятью по адресу. is - является проверкой на соответствие типа класса.

as проверяет на соответствие типа и если тип не подходит генерирует исключение.
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

Рейтинг@Mail.ru