:: Visual Foxpro, Foxpro for DOS
не закрывается вызванное окно
danton1973

Сообщений: 143
Откуда: Пермь
Дата регистрации: 10.08.2020
Из меню вызывается форма
windowsType=0-Modeless
Из неё вызывается другая форма с изображениями
windowsType=1-Modal
FORM.Init()
LPARAMETERS tcFlag,tcTab,toform,tcG
THISFORM.VISIBLE=.T.
THISFORM.v_form=toform
THISFORM.lcFlag=m.tcFlag
....
Image.DblClick()
THISFORM.cmdOk.CLICK()
THISFORM.cmdOk.CLICK
....
THISFORM.RELEASE()
THISFORM.Unload
LOCAL lnlcFlag,lcFlag
m.lnlcFlag=THISFORM.n_rec
m.lcFlag=THISFORM.lcFlag
THISFORM.v_form.cflag=m.lcFlag
RETURN m.lnlcFlag
По идее эта форма перестаёт существовать, однако при закрытии программы выдаётся ошибка об отсутствии переменной v_form
отладчик останавливается на строчке функции THISFORM.Unload вродебы уже закрытой формы....
Ratings: 0 negative/0 positive
Re: не закрывается вызванное окно
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
danton1973
FORM.Init()
LPARAMETERS tcFlag,tcTab,toform,tcG
THISFORM.VISIBLE=.T.
Так делать не надо. Если форма вызывается через DO FORM, то она и так покажется когда нужно будет (если в команде явно не указана опция NOSHOW), если создаётся как объект, то там где её нужно показать, скажем сразу же после создания, стоит сделать loChildForm.Show(1)

danton1973
THISFORM.v_form=toform

Сохранить ссылку на вызывающую форму - это хорошо, но для надёжной работы стоит перед любым использованием этой ссылки проверить что она всё ещё ссылается на объект, может быть даже проверяя что у объекта есть некоторое свойство, типа type('Thisform.v_form.Name') = 'C'

Для целей взаимодействия между формами может быть достаточно передать в "дочернюю" не ссылку на вызывающую, а специальный "объект параметров" (типа oPar = CreateObject("Custom или Empty или некоторый свой класс")). Через AddProperty() можно насоздавать своих свойств (если не заморачиваться на описание собственного класса) через которые и передать то что надо, и принять назад то что выбрали/ввели/сделали в дочерней форме. При этом ссылка на собственно родительскую форму в дочерней не нужна, и никаких проблем не возникнет даже если родительская форма по какой-то причине будет закрыта раньше чем дочерняя (например аварийный выход из приложения) - т.к. этот объект независим, и то что обе формы на него ссылаются никак не связывает сами эти формы друг с другом.

danton1973
THISFORM.cmdOk.CLICK
....
THISFORM.RELEASE()

Если уж есть ссылка на вызывающую форму куда надо что-то вернуть, то именно в методе выбора/закрытия это и стоит делать. Не надо откладывать до Unload.
Красивый код будет делать это не в click кнопки (и тем более dblClick другого объекта не будет вызывать Click какой-то кнопки), а в отдельном методе формы, специально написанном для этой цели - скажем "SelectAndClose". Его уже и будут вызывать кнопки/KeyPress и т.п.

danton1973
По идее эта форма перестаёт существовать, однако при закрытии программы выдаётся ошибка об отсутствии переменной v_form
отладчик останавливается на строчке функции THISFORM.Unload вродебы уже закрытой формы....
Форма не перестанет сущестововать, если где-то остались ссылки на внутренние объекты этой формы. Есть варианты "принудительно" обнулить все подобные ссылки - используя немного странноватую команду
RELEASE This
- но всё же лучше найти кто/как/когда создал такие ссылки и явно их обнулить перед закрытием формы (это не всегда возможно), либо же вообще отказаться от такого рода ссылок.
Если рассматривать форму как "чёрный ящик", то никакой внешний код не должен знать ничего про её внутреннее устройство (какие на ней расположены кнопки/гриды/картинки и т.п.) - всё что знают использующие форму, это её публичный интерфейс - т.е. определённые свойства и методы самой формы. Через них и организуется всё взаимодействие с этой формой.


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 31 (Гостей: 31)

© 2000-2024 Fox Club 
Яндекс.Метрика