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

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

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

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

Сообщение GAMER » 10.09.2010 11:32:19

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

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

Сообщение SAK » 10.09.2010 12:59:38

as делает проверку на соответствие типа и затем приведение типа, но не обращение к объекту. А приведение типа можно сделать и стандартным способом без проверки.
Код: Выделить всё
...
  if fCreator is TFrm2 then
    TFrm2(fCreator).Edit1.Text:='Test'
  else
...
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

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

Сообщение GAMER » 13.09.2010 21:35:00

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

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

Сообщение SAK » 17.09.2010 21:52:47

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

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

Сообщение GAMER » 04.11.2010 01:15:54

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

Код: Выделить всё
...
  if fCreator is TFrm2 then
    TFrm2(fCreator).Edit1.Text:='Test'
  else
...


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

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

Сообщение Brainenjii » 04.11.2010 08:57:41

Код: Выделить всё
if Assigned(fCreator) And (fCreator is TFrm2) then
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

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

Сообщение GAMER » 04.11.2010 11:33:07

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

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

Сообщение Brainenjii » 04.11.2010 11:59:31

а fCreator какого типа? 0.o И текст ошибки, если можно ^_^
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

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

Сообщение evd » 04.11.2010 12:26:16

GAMER
Используйте код от Brainenjii плюс обнуляйте указатель fCreator при закрытии формы TFrm2.
Либо на OnDestroy fCreator:=nil;
Либо если вручную уничтожаете, то уничтожайте через FreeAndNil(fCreator)
Аватара пользователя
evd
новенький
 
Сообщения: 21
Зарегистрирован: 13.09.2009 09:42:28
Откуда: Вологда

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

Сообщение GAMER » 04.11.2010 13:42:46

У меня названия другие, скопирую, как у меня, может я где-то ошибся.
Код: Выделить всё
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)

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

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

Сообщение stikriz » 04.11.2010 14:00:46

В 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...
Аватара пользователя
stikriz
энтузиаст
 
Сообщения: 612
Зарегистрирован: 15.03.2006 09:37:47

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

Сообщение GAMER » 04.11.2010 14:05:44

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

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

Сообщение stikriz » 04.11.2010 14:07:40

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


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

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

Сообщение GAMER » 04.11.2010 14:12:34

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

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

Сообщение stikriz » 04.11.2010 15:30:31

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

Пред.След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: Google [Bot] и гости: 22

Рейтинг@Mail.ru