Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Создание на лету переменной класса формы с типом взятым из значение другой переменной / 25 сообщений из 28, страница 1 из 2
15.02.2019, 12:28
    #39774383
Stanislav P
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
Имеется неизвестное количество форм, отображающих каждая свои данные. Управление ими одинаково и стандартизовано, и сделано через класс, в котором объявляется переменная:
Код: vbnet
1.
Private WithEvents myForm As Form


Фактическое создание формы происходит через:
Код: vbnet
1.
Set myForm = New Form_Someform1


Писать руками Н-нное количество SELECT...CASE для каждой формы и не забывать добавлять туда новые или удалять не нужные нет никакого желания.
Поэтому возникла мысль делать это налету:
Код: vbnet
1.
2.
3.
4.
Private WithEvents myForm As Form
Public Sub ClassInit(FormName As Sting)
Set myForm = New FormName
End Sub


Но конструкция: Set myForm = New FormName не является корректной и необходимо какое-то решение, чтобы создавать нужные формы не плодя SELECT...CASE или управляющий класс под каждую форму.
...
Рейтинг: 0 / 0
15.02.2019, 12:36
    #39774389
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
А нужно именно через New создавать многочисленные инстансы одной формы? Если так, то, боюсь, невозможно.
...
Рейтинг: 0 / 0
15.02.2019, 12:53
    #39774405
ROI
ROI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
Stanislav PИмеется неизвестное количество форм, отображающих каждая свои данные. Управление ими одинаково и стандартизовано, и сделано через класс, в котором объявляется переменная:
Код: vbnet
1.
Private WithEvents myForm As Form



Фактическое создание формы происходит через:
Код: vbnet
1.
Set myForm = New Form_Someform1



Писать руками Н-нное количество SELECT...CASE для каждой формы и не забывать добавлять туда новые или удалять не нужные нет никакого желания.
Поэтому возникла мысль делать это налету:
Код: vbnet
1.
2.
3.
4.
Private WithEvents myForm As Form
Public Sub ClassInit(FormName As Sting)
Set myForm = New FormName
End Sub



Но конструкция: Set myForm = New FormName не является корректной и необходимо какое-то решение, чтобы создавать нужные формы не плодя SELECT...CASE или управляющий класс под каждую форму.
у формы есть свойство Tag
туда и пиши свои Select
а у формы на событие "Open" считывай свой Select.
...
Рейтинг: 0 / 0
15.02.2019, 12:58
    #39774409
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
ROIтуда и пиши свои Select
Имеется в виду, насколько я понимаю, не SQL select, а VBA Select Case для выбора какой именно класс использовать для создания инстанса
...
Рейтинг: 0 / 0
15.02.2019, 13:04
    #39774414
Benny Blanco
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
MrShin,

Eval не прокатит?
...
Рейтинг: 0 / 0
15.02.2019, 13:04
    #39774416
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
Stanislav P,

Вот тут наткнулся на интересный вариант решения, можно попробовать. Только инстанс потом придется искать для получения управления.
...
Рейтинг: 0 / 0
15.02.2019, 13:08
    #39774423
Stanislav P
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
Нет, это не одна форма, это разные формы, каждая со своей структурой и данными. Пример, чтобы было наглядно: - Контакт, Задача, Контрагент, Товар. Все формы отображают свои данные, управление каждой формой идёт из одного класса: открыть, закрыть, сохранить данные из формы, загрузить данные в форму.
Создаваемое приложение является MDI (юзер может открыть несколько окон одного типа с разными данными или нескольких типов и работать поочередно в каждом).
Создание переменной для формы происходит внутри этого класса.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
'Управляющий класс FormControl
Private WithEvents myForm As Form
Public Sub ClassInit(Type As String)
'Здесь надо реализовать создание формы нужного типа без кучи SELECT...CASE.
End Sub
Public Sub ShowForm()
myform.Show()
End Sub


Соответственно, для каждой формы со разными данными создаётся своя переменная управляющего класса:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
'Где-то в модулях
'Процедура создаёт очередное окно 
Sub CreateItem()
 Dim ContactItem As FormControl
 Set ContactItem = New FormControl 
 ContactItem.Init(ContactType)
 ContactItem.LoadData()
 ContactItem.Show
End Sub
...
Рейтинг: 0 / 0
15.02.2019, 13:10
    #39774426
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
Benny BlancoEval не прокатит?
Нет, такой фокус не пройдет
...
Рейтинг: 0 / 0
15.02.2019, 13:13
    #39774431
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
Stanislav Pюзер может открыть несколько окон одного типа
Да, именно это я имел в виду под инстансами одной формы.
...
Рейтинг: 0 / 0
15.02.2019, 13:15
    #39774437
Benny Blanco
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
Benny Blanco,

Можно через VBE сделать. При запуске апликуха будет брать из таблицы список всех форм и через VBE генерить класс со свойствами, возвращающими new xForm1..new xFormN.
CallByName этих свойств сэмулирует подобие eval.
...
Рейтинг: 0 / 0
15.02.2019, 13:17
    #39774439
Создание на лету переменной класса формы с типом взятым из значение другой переменной
Stanislav PИмеется неизвестное количество форм, отображающих каждая свои данные. Вы не объяснили, это разные формы или разные экземпляры одной формы.
Если формы разные, то что мешает открыть нужную форму методом DoCmd.OpenForm FormName, а затем Set myForm = Forms(FormName).
На Terminate класса закрывать форму.
...
Рейтинг: 0 / 0
15.02.2019, 13:17
    #39774440
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
ContactItem можно объявить как Form, а инстанс создавать уже конкретного класса, тут уже по Select Case или попробовать вариант с SelectObject из ответа по ссылке
...
Рейтинг: 0 / 0
15.02.2019, 13:32
    #39774454
ROI
ROI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
Stanislav P,

Создайте свой класс коллекция и "пихайте" туда
ну и читайте (Гетц так советует)
...
Рейтинг: 0 / 0
15.02.2019, 13:45
    #39774465
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
ROIСоздайте свой класс коллекция и "пихайте" туда
Так прежде чем пихать, нужно создать форму по имени, этом проблема.

Попробовал
DoCmd.SelectObject <acObjectType>, <YourObjectsName>, True
DoCmd.RunCommand acCmdNewObjectForm

Не работает - ошибка NewObjectForm недоступно :(
...
Рейтинг: 0 / 0
15.02.2019, 14:21
    #39774497
Stanislav P
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
Кривцов АнатолийЕсли формы разные, то что мешает открыть нужную форму методом DoCmd.OpenForm FormName, а затем Set myForm = Forms(FormName).
На Terminate класса закрывать форму.
Формы разные (Контакт, Задача, Товар) пользователь может открыть несколько форм с контактами, каждая такая форма будет содержать свои данные (Петрова, Иванов, Боль-буль оглы). То же самое и с формой для товара.
В VBA формы можно открыть через Docmd.OpenForm, но тогда это будет только одна форма с контактом, другую уже не откроешь.
Можно формы открыть через:
Код: vbnet
1.
2.
Dim myForm As Form_ContactForm
Set myForm = New Form_ContactForm


В этом случае можно открывать сколько хочешь форм одного типа, но с разными данными, вопрос хранения таких форм оставим за рамками обсуждения.
Писать для каждого типа, что такое: Set myForm = New Form_XXXTypeItem когда у тебя таких типов с десяток очень не хочется, потому что это нудно и при появлении новой типа формы или удалении старого, придётся переписывать код.
...
Рейтинг: 0 / 0
15.02.2019, 14:35
    #39774517
Predeclared
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
Stanislav P... Писать для каждого типа, что такое: Set myForm = New Form_XXXTypeItem когда у тебя таких типов с десяток очень не хочется, ...
Для других (не форм) описаний классов хочется, а для форм не хочется?
За что вы их (описания форм) так не любите? :)
...
Рейтинг: 0 / 0
15.02.2019, 14:38
    #39774519
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
Stanislav Pкогда у тебя таких типов с десяток
Ну десяток это не так много, ничего страшного, если будет 20 строк select case в одном месте. Да и при добавлении новой формы зарегистрировать ее в классе инициализации секундное дело.

В общем, коряво, конечно, но у VBA свои недостатки, я не вижу реальных способов обойтись без select case
...
Рейтинг: 0 / 0
15.02.2019, 14:41
    #39774522
Predeclared
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
MrShin... я не вижу реальных способов обойтись без select case
Мне известен один изворот, но с select case значительно проще.
...
Рейтинг: 0 / 0
15.02.2019, 14:43
    #39774523
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
PredeclaredМне известен один изворот
Какой? Интересно в академических целях :)
...
Рейтинг: 0 / 0
15.02.2019, 14:54
    #39774533
Predeclared
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
На этом форуме предлагали, ссылку сейчас не нашел.
Если вкратце:
В описании бэк модуля каждой формы добавляется свойство, возвращающее New Instans этого описания.
При необходимости получить New Instans по имени формы, штатным docmd поднимается стандартный экземляр,
считываем значение добавленного свойства в ссылочку и стандартный экземляр закрываем штатным docmd.
...
Рейтинг: 0 / 0
15.02.2019, 15:01
    #39774544
Stanislav P
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
MrShinНу десяток это не так много, ничего страшного, если будет 20 строк select case в одном месте. Да и при добавлении новой формы зарегистрировать ее в классе инициализации секундное дело.

В общем, коряво, конечно, но у VBA свои недостатки, я не вижу реальных способов обойтись без select case
Когда дошёл до десятка, то решил найти способ отличный от select...case. :)
...
Рейтинг: 0 / 0
15.02.2019, 15:02
    #39774545
ЦЦа
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
Всё украдено до нас: Создание экземпляра формы .
...
Рейтинг: 0 / 0
15.02.2019, 15:04
    #39774549
ROI
ROI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
Stanislav P,
Разработка настольных приложений в Access 2002.Для профессионалов.Литвин.Гетц.2002г. т.01
стр. 447
"...Если вы собираетесь работать с несколькими экземплярами формы...
...способом может быть хранение ссылок на объекты формы в пользовательской коллекции..."
...
Рейтинг: 0 / 0
15.02.2019, 15:09
    #39774555
Stanislav P
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
ROIStanislav P,
Разработка настольных приложений в Access 2002.Для профессионалов.Литвин.Гетц.2002г. т.01
стр. 447
"...Если вы собираетесь работать с несколькими экземплярами формы...
...способом может быть хранение ссылок на объекты формы в пользовательской коллекции..."
:)
Это у них ещё для Access 2000 написано и с хранением проблем нет. Проблема в создании без select...case.
...
Рейтинг: 0 / 0
15.02.2019, 15:15
    #39774567
Predeclared
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание на лету переменной класса формы с типом взятым из значение другой переменной
Надо в MzTools отписаться, чтобы они опцию автоматизации варианта с Select Case в свой солюшн добавили.
:)
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Создание на лету переменной класса формы с типом взятым из значение другой переменной / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]