Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Как открыть несколько экземпляров одной формы одновременно  [new]
Iks3
Guest
Подскажите, пожалуйста, можно ли открыть несколько экземпляров одной формы одновременно с разными данными?
12 фев 02, 09:37    [497]     Ответить | Цитировать Сообщить модератору
 RE:Как открыть несколько экземпляров одной формы одновременно  [new]
....
Guest
Можно. Открывай их не через DoCmd.OpenForm, а через создание объектной переменной, т.е.
Dim frm As Form
Set frm = New Form_YourFormName

сколько таких переменных сделаешь - столько форм и получишь.
12 фев 02, 17:18    [498]     Ответить | Цитировать Сообщить модератору
 RE:Как открыть несколько экземпляров одной формы одновременно  [new]
Iks3
Guest
То, что Вы предлагаете, я написала. А каким оператором открыть полученную форму, если не OpenForm?
12 фев 02, 20:16    [499]     Ответить | Цитировать Сообщить модератору
 RE:Как открыть несколько экземпляров одной формы одновременно  [new]
Владимир Смирнов
Guest
OpenForm - это макрокоманда, упрощающая работу с формами. При выполнении OpenForm создаётся экземпляр формы с указанным именем и делается видимым и активным. Эта форма автоматически добавляется в семейство Forms.
Если в семействе Forms уже есть форма с таким именем, то новая форма не создаётся, а только становится видимой и активной (ну и обновляются данные).
Поэтому для открытия нескольких экземпляров одной формы нужно использовать другой способ.
Вам нужно создавать столько объектных переменных типа Form_YourFormName, сколько форм одновременно будет открыто. Учтите, что открываемая форма должна иметь модуль формы.
Чтобы форма стала видимой, установите Visible=true.
13 фев 02, 08:35    [500]     Ответить | Цитировать Сообщить модератору
 RE:Как открыть несколько экземпляров одной формы одновременно  [new]
Iks3
Guest
После команды Visible=true форма появляется на экране и сразу пропадает. А как удержать ее на экране?
13 фев 02, 12:27    [501]     Ответить | Цитировать Сообщить модератору
 RE:Как открыть несколько экземпляров одной формы одновременно  [new]
Владимир Смирнов
Guest
Пример модуля:

\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

13 фев 02, 14:22    [502]     Ответить | Цитировать Сообщить модератору
 RE:Как открыть несколько экземпляров одной формы одновременно  [new]
....
Guest
Исчезает, скорее всего, потому, что 1)переменная типа Form локальная 2) из функции выходишь 3) переменная становится nothing 4)при удалении последней ссылки объект самоуничтожается
Как с этим бороться.
Способ 1. Хранить ссылку на форму в глобальной переменной или коллекции (если их неизвестное заранее количество) - то что предложил Владимир Смирнов.
Способ 2. Хранить ссылку на форму в самой форме. Т.е. после создания формы вызвать ее метод, куда передать ее саму, и в этом методе сохранить переданный параметр в переменной на уровне модуля класса. На Unload'е формы (или на Close) нужно енту переменную очистить.
Второй способ более сложный, зато глобальная область не засирается. Да и прикольнее так - форма сама себя в памяти удерживает. Мюнхаузен блин.
14 фев 02, 12:21    [503]     Ответить | Цитировать Сообщить модератору
 RE:Как открыть несколько экземпляров одной формы одновременно  [new]
Владимир Смирнов
Guest
>>Способ 2. Хранить ссылку на форму в самой форме.
Это конечно забавно, "прикольнее так", но я такие трюки не рекомендую.
При сохранении формы в глобальной переменной к ней (форме) можно обратиться из других модулей (форм) по имени переменной. Также, если экземпляры форм хранятся как элементы коллекции (а коллекцию - глобальная переменная), то обращение к этим формам возможно через элемент коллекции.
Например: MyForms(1).Visible - видимость формы с номером 1,
MyForms("Форма 3").Caption - подпись формы с ключом "Форма 3".
А при способе 2 придётся перебирать семейство Forms в поисках нужной формы.
15 фев 02, 06:17    [504]     Ответить | Цитировать Сообщить модератору
 RE:Как открыть несколько экземпляров одной формы одновременно  [new]
....
Guest
Неправильно. Формы, открытые через создание переменной класса, НЕДОСТУПНЫ через коллекцию Forms. Это иногда хорошо, иногда плохо.
Такие трюки можно порекомендовать, если есть самодостаточная форма, к которой никогда не будет обращений извне, и вся работа, связанная с этой формой, делается в ее же модуле. Плюс такого подхода - защита от дурака-программиста при проектировании "системных" форм. Не имея доступа к форме дурак ничего и не порушит.
15 фев 02, 11:37    [505]     Ответить | Цитировать Сообщить модератору
 RE:Как открыть несколько экземпляров одной формы одновременно  [new]
Владимир Смирнов
Guest
Вопрос к ....
Что Вы понимаете под словами "НЕДОСТУПНЫ через коллекцию Forms"?
И что под словами "защита от дурака-программиста".
Если "дурак-программист" - это тот, кто не знает как обратиться к форме через семейство Forms, ну тогда от него это защита. Хотя рассчитывать на ТАКУЮ защиту может только другой такой-же дурак-программист.
18 фев 02, 05:14    [506]     Ответить | Цитировать Сообщить модератору
 RE:Как открыть несколько экземпляров одной формы одновременно  [new]
....
Guest
Да то и понимаю, что такие формы отсутствуют в коллекции Forms. Нет их там. Да и не может быть - обращение к элементам коллекции по ключу, для формы это имя, несколько форм с одинаковым именем в одну коллекцию Forms не запихнуть.
Формы, открытые через создание модуля класса доступны ТОЛЬКО через сохраненную внешнюю ссылку (переменную). Нет доступной ссылки - нет и доступа к форме. Это и подразумевается под "защитой от дурака". Умеет дурак пользоваться коллекцией Forms или нет - его личные проблемы.
19 фев 02, 12:43    [507]     Ответить | Цитировать Сообщить модератору
 RE:Как открыть несколько экземпляров одной формы одновременно  [new]
Владимир Смирнов
Guest
Вот выдержка из справочника MS Access (раздел "Семейство Forms") :

Семейство Forms содержит все формы, открытые в данный момент в базе данных Microsoft Access.

Дополнительные сведения

Семейство Forms используется в программах Visual Basic или в выражениях для ссылок на формы, открытые в данный момент. Например, для задания или возвращения значений свойств конкретных форм бывает удобно организовать перебор всех компонентов семейства Forms.

Совет. Компоненты семейства обычно перебираются с помощью инструкции For Each...Next.

Ну вот, мнения разошлись, Microsoft (видимо от незнания) полагает что "Forms содержит все формы, открытые в данный момент ".
А вот господин .... категорически уверен, что это не так (откуда такие познания?). Видимо, судя по его последней фразе, все, кроме него, дураки. Независимо от того, умеют пользоваться семейством Forms, или нет. Просто не знают тех великих откровений, известных только ему (даже писать с маленькой буквы неловко - надо бы ЕМУ).
20 фев 02, 05:09    [508]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить