Dim frm As New Form2
Private Sub Command1_Click()
frm.Show
End Sub
Dim frm As Form2
Private Sub Command1_Click()
If frm Is Nothing Then
Set frm = New Form2
End If
frm.Show
End Sub
Здесь в обоих вариантах после закрытия Form2 она удаляется из коллекции Forms, однако само значение не обнуляется и объект не освобождается. Это видно, если с запущенной Form2 попытаться закрыть Form1. Form1 скрывается, а программа не завершается. Form2 всегда стартуют с начальными значениями, т.е. измененные контролы не сохраняются.
Тут есть завязка на Создание объекта|Удаление объекта, Load|Unload и Show|Hide состояниях. Где-то я видел описание соотношений между ними, точно не скажу, но похоже на картинку:
Создание объекта
Load
Show ' Доступ к свойствам
Hide
Unload
...
Load
Show ' Доступ к свойствам
Hide
Unload
Удаление объекта
Здравствуйте Lemon, Вы писали:
L>По событию вызывается фрагмент кода:
L>Dim Refs As New frmRefs() L>Refs.Show()
L>где frmRefs — класс формы.
L>Как оргранизовать проверку, чтобы форма не загружалась L>дважды, при повторном возникновении события?
Можно просто создать глобальную коллекцию открытых форм и перед загрузкой формы просто проверять — есть ли она в этой коллекции. Если есть — просто активировать ее. Если нет — создать снова (записав в коллекцию)
Здравствуйте Lemon, Вы писали:
L>По событию вызывается фрагмент кода: L>Dim Refs As New frmRefs() L>Refs.Show() L>где frmRefs — класс формы. Как оргранизовать проверку, чтобы форма не загружалась дважды, при повторном возникновении события?
В твоем варианте программы-обработчика события никак. Таково свойство New.
Нужно вынести объявление переменной в глобальную секцию, т.е. из программы-обработчика события в область имен.
Здравствуйте Vi2, Вы писали:
Vi2>В твоем варианте программы-обработчика события никак. Таково свойство New. Vi2>Нужно вынести объявление переменной в глобальную секцию, т.е. из программы-обработчика события в область имен.
Но ведь в этом случае, при закрытии загруженной формы, она удаляется из памяти.
А при повторной попытке Refs.Show() возникает ошибка — объекта уже нет
Здравствуйте Lemon, Вы писали:
L>Но ведь в этом случае, при закрытии загруженной формы, она удаляется из памяти. L>А при повторной попытке Refs.Show() возникает ошибка — объекта уже нет
Для какой системы и на каком языке все это делается?
Здравствуйте Lemon, Вы писали:
L>По событию вызывается фрагмент кода:
L>Dim Refs As New frmRefs() L>Refs.Show()
L>где frmRefs — класс формы.
L>Как оргранизовать проверку, чтобы форма не загружалась L>дважды, при повторном возникновении события?
Если есть коллекция Forms (по крайней мере в VB6), то можно использовать ее для поиска твоей известной формы.
Здравствуйте Vi2, Вы писали:
Vi2>Если есть коллекция Forms (по крайней мере в VB6), то можно использовать ее для поиска твоей известной формы.
И еще много чего Вы писали
Большое спасибо за столь оперативный отклик, но мне надо время, чтобы поподробнее разобраться. Доки все на английском — скорость усвоения не очень высокая.
Re[2]: Загружена ли форма?
От:
Аноним
Дата:
27.04.02 10:57
Оценка:
AV>Можно просто создать глобальную коллекцию открытых форм и перед загрузкой формы просто проверять — есть ли она в этой коллекции. Если есть — просто активировать ее. Если нет — создать снова (записав в коллекцию)
А если форма только одна, достаточно хранить ссылку на нее в глобальое переменной. что то-типа
dim a as myForm
...
if (a = Nothing) then
a = new myForm()
end if
a.Show()
другой вариант — объявить в форме какую-нибудь shared переменную, и использовать ее в качестве, наример, счетчика