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

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

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

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

Сообщение GAMER »

А как Вы без as к Edit обратитесь?
Код делает не только проверку, но и само обращение к объекту на нужной форме.
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

as делает проверку на соответствие типа и затем приведение типа, но не обращение к объекту. А приведение типа можно сделать и стандартным способом без проверки.

Код: Выделить всё

...
  if fCreator is TFrm2 then
    TFrm2(fCreator).Edit1.Text:='Test'
  else
...
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

2 SAK
Я правильно понимаю, что Ваш код оптимальней?
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

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

Сообщение GAMER »

Подниму опять эту тему.

Код: Выделить всё

...
  if fCreator is TFrm2 then
    TFrm2(fCreator).Edit1.Text:='Test'
  else
...


Если форма TFrm2 закрыта, то получаю ошибку в строке if fCreator is TFrm2 then.
То есть указатель ненулевой, но формы там уже нет.
Как узнать, что формы уже нет?
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Код: Выделить всё

if Assigned(fCreator) And (fCreator is TFrm2) then
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Не помогло.
Ошибка в обработке (fCreator is TFrm2)
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

а fCreator какого типа? 0.o И текст ошибки, если можно ^_^
Аватара пользователя
evd
новенький
Сообщения: 21
Зарегистрирован: 13.09.2009 09:42:28
Откуда: Вологда
Контактная информация:

Сообщение evd »

GAMER
Используйте код от Brainenjii плюс обнуляйте указатель fCreator при закрытии формы TFrm2.
Либо на OnDestroy fCreator:=nil;
Либо если вручную уничтожаете, то уничтожайте через FreeAndNil(fCreator)
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

У меня названия другие, скопирую, как у меня, может я где-то ошибся.

Код: Выделить всё

unit UFrmComment;  
..........
 public
    { public declarations }
    ParentForm: TCustomForm;   
.................


Вызов даной формы проходит так:

Код: Выделить всё

procedure TFrmAnkklient.SpeedButtonCommentClick(Sender: TObject);
begin
 Application.CreateForm(TFrmComment,FrmComment);
 FrmComment.ParentForm:=self;
 FrmComment.UnSprava:=UnSprava;
 FrmComment.SetFormStatus;
end;


Ошибка в при закрытии.

Код: Выделить всё

  if Assigned(ParentForm) And (ParentForm is TFrmAnkklient) then
  ShowMessage('test');


Ошибка на скриншоте:

Добавлено спустя 16 минут 22 секунды:
evd писал(а):GAMER
Используйте код от Brainenjii плюс обнуляйте указатель fCreator при закрытии формы TFrm2.
Либо на OnDestroy fCreator:=nil;
Либо если вручную уничтожаете, то уничтожайте через FreeAndNil(fCreator)

Если с родительской формы вызывается несколько форм, то как обнулить нужный указатель?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
stikriz
энтузиаст
Сообщения: 612
Зарегистрирован: 15.03.2006 08:37:47

Сообщение stikriz »

В Delphi я бы написал так:

Код: Выделить всё

...
  if fCreator is TFrm2 then
   TFrm2(fCreator).Edit1.Text:='Test'
  else
...



FreePascal не пробовал, а "необоснованые" сомнения есть, т.к.

Код: Выделить всё


IMyInterface = interface
...
end;

TMyClass = class(TInterfaceObject, IMyInterface)
...
end;

var I: IMyInterface;
begin
 I:=TMyClass.Create as IMyInterface;
...
 TMyClass(I).чего-то там...
end;

И это ошибка. В Delphi вполне законное обращение.


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

Сообщение GAMER »

Вот непонятно. Либо так нельзя делать либо это глюк.
Аватара пользователя
stikriz
энтузиаст
Сообщения: 612
Зарегистрирован: 15.03.2006 08:37:47

Сообщение stikriz »

GAMER писал(а):Если форма TFrm2 закрыта, то получаю ошибку в строке if fCreator is TFrm2 then.
То есть указатель ненулевой, но формы там уже нет.
Как узнать, что формы уже нет?


Есть такой патерн, что если кто создает объект, то создаваемый не должен ничего знать о создателе, и не должен к нему обращаться.
Но, это теория. В жизни можно и нарушить. Например, форма хранит список всех компонентов, которые на ней стоят. Вам тоже не мешает создать такой список и при закрытии формы посылать им всем сообщение, что форма закрывается.
При уничтожении формы указатель в другой сам не обнулиться...
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Возможно я не верно реализовал задачу?
При нажатии на SpeedButton на родительской форме создается дочерная. При этом спидбаттон нажат. Хотелось, при закрытии дочерной формы отжать спидбаттон на главной. А если главная закрыта, то и отжимать ничего не надо.
Аватара пользователя
stikriz
энтузиаст
Сообщения: 612
Зарегистрирован: 15.03.2006 08:37:47

Сообщение stikriz »

А зачем нажат сидбатон? Пользователь же видит ворму и так. Чем лучше, когда он нажатым остается?
Ответить