Как открыть несколько экземпляров одной формы одновременно

Iks3
Дата: 12.02.2002 09:37:24
Подскажите, пожалуйста, можно ли открыть несколько экземпляров одной формы одновременно с разными данными?
....
Дата: 12.02.2002 17:18:35
Можно. Открывай их не через DoCmd.OpenForm, а через создание объектной переменной, т.е.
Dim frm As Form
Set frm = New Form_YourFormName

сколько таких переменных сделаешь - столько форм и получишь.
Iks3
Дата: 12.02.2002 20:16:38
То, что Вы предлагаете, я написала. А каким оператором открыть полученную форму, если не OpenForm?
Владимир Смирнов
Дата: 13.02.2002 08:35:58
OpenForm - это макрокоманда, упрощающая работу с формами. При выполнении OpenForm создаётся экземпляр формы с указанным именем и делается видимым и активным. Эта форма автоматически добавляется в семейство Forms.
Если в семействе Forms уже есть форма с таким именем, то новая форма не создаётся, а только становится видимой и активной (ну и обновляются данные).
Поэтому для открытия нескольких экземпляров одной формы нужно использовать другой способ.
Вам нужно создавать столько объектных переменных типа Form_YourFormName, сколько форм одновременно будет открыто. Учтите, что открываемая форма должна иметь модуль формы.
Чтобы форма стала видимой, установите Visible=true.
Iks3
Дата: 13.02.2002 12:27:54
После команды Visible=true форма появляется на экране и сразу пропадает. А как удержать ее на экране?
Владимир Смирнов
Дата: 13.02.2002 14:22:46
Пример модуля:

\nOption Compare Database
Option Explicit
Public MyForms As New Collection ' Создаем объект Collection, где будут храниться формы
' Формы существуют, пока живы объектные переменные - элементы коллекции

Public Sub CreateForm1() ' Создаёт экземпляр формы "Form1"
Dim Key As String
Dim frm As New Form_Form1 ' Временная переменная - форма (должна быть форма с именем "Form1")
Key = frm.Caption & str(MyForms.Count) ' Ключ - идентификатор формы в коллекции
frm.Caption = Key
frm.Visible = True
MyForms.Add frm, Key ' добавляется в коллекцию
Set frm = Nothing
End Sub

Public Sub CloseForm1(Key As String) ' Удаляет экземпляр формы из коллекции (она тут-же исчезает)
MyForms.Remove Key
End Sub

Public Sub TestCreate() ' Создаёт 5 экземпляров формы "Form1"
CreateForm1
CreateForm1
CreateForm1
CreateForm1
CreateForm1
End Sub

....
Дата: 14.02.2002 12:21:45
Исчезает, скорее всего, потому, что 1)переменная типа Form локальная 2) из функции выходишь 3) переменная становится nothing 4)при удалении последней ссылки объект самоуничтожается
Как с этим бороться.
Способ 1. Хранить ссылку на форму в глобальной переменной или коллекции (если их неизвестное заранее количество) - то что предложил Владимир Смирнов.
Способ 2. Хранить ссылку на форму в самой форме. Т.е. после создания формы вызвать ее метод, куда передать ее саму, и в этом методе сохранить переданный параметр в переменной на уровне модуля класса. На Unload'е формы (или на Close) нужно енту переменную очистить.
Второй способ более сложный, зато глобальная область не засирается. Да и прикольнее так - форма сама себя в памяти удерживает. Мюнхаузен блин.
Владимир Смирнов
Дата: 15.02.2002 06:17:43
>>Способ 2. Хранить ссылку на форму в самой форме.
Это конечно забавно, "прикольнее так", но я такие трюки не рекомендую.
При сохранении формы в глобальной переменной к ней (форме) можно обратиться из других модулей (форм) по имени переменной. Также, если экземпляры форм хранятся как элементы коллекции (а коллекцию - глобальная переменная), то обращение к этим формам возможно через элемент коллекции.
Например: MyForms(1).Visible - видимость формы с номером 1,
MyForms("Форма 3").Caption - подпись формы с ключом "Форма 3".
А при способе 2 придётся перебирать семейство Forms в поисках нужной формы.
....
Дата: 15.02.2002 11:37:15
Неправильно. Формы, открытые через создание переменной класса, НЕДОСТУПНЫ через коллекцию Forms. Это иногда хорошо, иногда плохо.
Такие трюки можно порекомендовать, если есть самодостаточная форма, к которой никогда не будет обращений извне, и вся работа, связанная с этой формой, делается в ее же модуле. Плюс такого подхода - защита от дурака-программиста при проектировании "системных" форм. Не имея доступа к форме дурак ничего и не порушит.
Владимир Смирнов
Дата: 18.02.2002 05:14:33
Вопрос к ....
Что Вы понимаете под словами "НЕДОСТУПНЫ через коллекцию Forms"?
И что под словами "защита от дурака-программиста".
Если "дурак-программист" - это тот, кто не знает как обратиться к форме через семейство Forms, ну тогда от него это защита. Хотя рассчитывать на ТАКУЮ защиту может только другой такой-же дурак-программист.