Доступ к формам из других форм
Модератор: Модераторы
-
SAK
- постоялец
- Сообщения: 158
- Зарегистрирован: 17.02.2006 23:45:14
- Откуда: Тим
- Контактная информация:
as делает проверку на соответствие типа и затем приведение типа, но не обращение к объекту. А приведение типа можно сделать и стандартным способом без проверки.
Код: Выделить всё
...
if fCreator is TFrm2 then
TFrm2(fCreator).Edit1.Text:='Test'
else
...- GAMER
- энтузиаст
- Сообщения: 627
- Зарегистрирован: 06.08.2008 13:41:07
- Откуда: Ужгород-Днепр, Украина
- Контактная информация:
Подниму опять эту тему.
Если форма TFrm2 закрыта, то получаю ошибку в строке if fCreator is TFrm2 then.
То есть указатель ненулевой, но формы там уже нет.
Как узнать, что формы уже нет?
Код: Выделить всё
...
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
Код: Выделить всё
if Assigned(fCreator) And (fCreator is TFrm2) then
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
а fCreator какого типа? 0.o И текст ошибки, если можно ^_^
- evd
- новенький
- Сообщения: 21
- Зарегистрирован: 13.09.2009 09:42:28
- Откуда: Вологда
- Контактная информация:
GAMER
Используйте код от Brainenjii плюс обнуляйте указатель fCreator при закрытии формы TFrm2.
Либо на OnDestroy fCreator:=nil;
Либо если вручную уничтожаете, то уничтожайте через FreeAndNil(fCreator)
Используйте код от Brainenjii плюс обнуляйте указатель fCreator при закрытии формы TFrm2.
Либо на OnDestroy fCreator:=nil;
Либо если вручную уничтожаете, то уничтожайте через FreeAndNil(fCreator)
- GAMER
- энтузиаст
- Сообщения: 627
- Зарегистрирован: 06.08.2008 13:41:07
- Откуда: Ужгород-Днепр, Украина
- Контактная информация:
У меня названия другие, скопирую, как у меня, может я где-то ошибся.
Вызов даной формы проходит так:
Ошибка в при закрытии.
Ошибка на скриншоте:
Добавлено спустя 16 минут 22 секунды:
Если с родительской формы вызывается несколько форм, то как обнулить нужный указатель?
Код: Выделить всё
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)
Если с родительской формы вызывается несколько форм, то как обнулить нужный указатель?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
В Delphi я бы написал так:
FreePascal не пробовал, а "необоснованые" сомнения есть, т.к.
А вообще, лучше проперти сделать на Edit1.Text...
Код: Выделить всё
...
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 писал(а):Если форма TFrm2 закрыта, то получаю ошибку в строке if fCreator is TFrm2 then.
То есть указатель ненулевой, но формы там уже нет.
Как узнать, что формы уже нет?
Есть такой патерн, что если кто создает объект, то создаваемый не должен ничего знать о создателе, и не должен к нему обращаться.
Но, это теория. В жизни можно и нарушить. Например, форма хранит список всех компонентов, которые на ней стоят. Вам тоже не мешает создать такой список и при закрытии формы посылать им всем сообщение, что форма закрывается.
При уничтожении формы указатель в другой сам не обнулиться...
- GAMER
- энтузиаст
- Сообщения: 627
- Зарегистрирован: 06.08.2008 13:41:07
- Откуда: Ужгород-Днепр, Украина
- Контактная информация:
Возможно я не верно реализовал задачу?
При нажатии на SpeedButton на родительской форме создается дочерная. При этом спидбаттон нажат. Хотелось, при закрытии дочерной формы отжать спидбаттон на главной. А если главная закрыта, то и отжимать ничего не надо.
При нажатии на SpeedButton на родительской форме создается дочерная. При этом спидбаттон нажат. Хотелось, при закрытии дочерной формы отжать спидбаттон на главной. А если главная закрыта, то и отжимать ничего не надо.
А зачем нажат сидбатон? Пользователь же видит ворму и так. Чем лучше, когда он нажатым остается?
