powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / форма-функция
9 сообщений из 9, страница 1 из 1
форма-функция
    #32089012
vladK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как лучше сделать свой InputBox и можно ли (на VBA)
Т.е. пользовательская форма, которая может что-то возвратить туда, откуда её вызвали.
...
Рейтинг: 0 / 0
форма-функция
    #32089015
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю может! Создаешь функцию в которой переменной присваивается объект заранее запрограммированной формы. После чего эта переменная (Форма) вызывается. Ну и соответственно после завершения ее работы возвращаем значение взятое с этой формы.
Ну и плю саму форму надо как-то запрограммировать, как тебе надо будет!
...
Рейтинг: 0 / 0
форма-функция
    #32089016
Фотография AlexJuice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну писАл же уже! Через текстовое поле с маской "Пароль".
Возвращать можно, например, через глобальную переменную.
А можно сразу в коде формы проверять введенное значение.
...
Рейтинг: 0 / 0
форма-функция
    #32089022
Фотография AlexJuice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, это было немного о другом...
Что-то я нервный сегодня...
А в чем смысл создания своего Инпута? Что в стандартном не устраивает?
...
Рейтинг: 0 / 0
форма-функция
    #32089040
vladK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2mahoune: Не получиться, потому, что нет синхронности. Вызванная из функции форма выполняется своим чередом (процессом или потоком, не знаю, вопрос к сишникам), а функция своим. И когда Вы функции присвоите значение глобальной переменной, которой собираетесь присвоить значение из поля формы по её событию закрытия (например), то получите Empty.
Возможно тут можно как то докумекать, опрашивая через таймер закрыта ли форма, но это уже будет curve, которая мне уже не нравиться из-зи глобальной пременной.
2AlexJuice. Представтье ситуацию когда есть вспомогательная форма, например, калькулятор. Я вызываю её из разных форм, произвожу вычисления и по нажатию Ok хочу возвратить результат туда, откуда вызывал. так что суть не в InputBox, просто он как раз выполняется синхронно с общим потоком - пока я не введу что то и не нажму OK программа дальше не идет - вот наконец выразился по простому.
...
Рейтинг: 0 / 0
форма-функция
    #32089047
vladK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sorry mahoune, можно и по Вашему если открыть форму с параметром acDialog (что оказывается не тоже самое что модальная- это узнал только сейчас.)

Но вообще я думал что возникнут идеи с тем что форма это модуль класса, и форма может иметь пользовательские свойства и события...
...
Рейтинг: 0 / 0
форма-функция
    #32089142
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут нашёл инфу может поможет:

Код: plaintext
Пример  1 


Когда мне нужно из Формы вызвать другую форму и получить от нее какое
либо значение, то я поступаю сл. образом:
В форме-приемник описываю Public процедуру:

Public Sub Choise(NumChoise as integer, RetValue as variant)
select NumChoise ' Номер выбора
case 1 ' Это например может быть выбор поставщика
' тут анализируем RetValue и делаем то что надо в данном случае
case 2 ' Это покупателя
....
case nnn ' Выборов может быть сколько угодно
end select
end sub

В кнопке по нажатию на которую вызывается форма-источник этой формы, в
качестве аргументов передается номер выбора и имя формы-приемника:

Private Sub MyButton_Click()
' В аргументы открытия можно передавать только одну строку, поэтому
пишем в нее параметры разделяя их ",," например
DoCmd.OpenForm ИмяФормыВыбора, , , , , WindowMode, "Выбор,," &
КодПроцВыбора & ",," & ИмяВызывающейФормы
end sub

На событие "Открытие" формы-источника проверяю аргументы открытия, если
в начале строки стоит "Выбор", то подготавливаю форму для выбора (например показываю кнопку "Выбрать").

Далее на нажатии кнопки "Выбрать" выбрать вешаю код:

if isloaded(ИмяВызывающейФормы) then
forms(ИмяВызывающейФормы).Choise КодПроцВыбора, ВыбранноеЗначение
endif

И все !

Выгоды:

1. Формы-источники не обязательно должны быть окнами Диалога.
2. Не нужно определять кучу глобальных переменных и помнить что они
хранят.
3. По такому принципу можно организовать множественный выбор без закрытия Формы-Источник.

Код: plaintext
Пример  2 


Один из часто задаваемых вопросов - как открыть форму, которая после своего закрытия возвращает какое-либо значение. Опишу один из способов реализации этой проблемы.
Если смотреть на проблему более "глобально", нам нужно написать функцию, принимающую параметры и возвращающую значение. Ее вызов должен выглядеть примерно так:

...
Dim RetVal As Long
Dim RetVal = 1
RetVal = MyFunction(RetVal)
...

Также нам нужно завести в общем модуле 3 глобальные переменные, например такие:

Public varMyFunction_IsEndWork As Boolean 'Признак закрытия формы
Public varMyFunction_RetVal As Long 'Возвращаемое из формы значение
Public varMyFunction_SetVal As Long 'Передаваемое в форму значение

Сама функция будет выглядеть так:

Function MyFunction(Optional varSetVal As Long = 0) As Long

varMyFunction_IsEndWork = False 'Признак закрытия формы = False
varMyFunction_SetVal = varSetVal
'Открываем форму в режиме диалога
DoCmd.OpenForm "MyFunctionForm", , , , , acDialog
'В цикле ждем, пока признак закрытия формы будет = True
Do Until varMyFunction_IsEndWork
DoEvents
Loop
'Присваиваем функции значение переменной varMyFunction_RetVal
MyFunction = varMyFunction_RetVal

End Function

Теперь форма. В нашем примере имя формы - MyFunctionForm. Для корректной
работы функции необходимо, чтобы форма при открытии "реагировала" на
передаваемое в нее значение в глобальной переменной

varMyFunction_SetVal, а при закрытии записывала возвращаемое значение в
глобальную переменную varMyFunction_RetVal и устанавливала переменную
varMyFunction_IsEndWork в True.

Пусть в форме будет группа переключателей с именем ctlGrp. Передаваемое
в форму значение - это "значение по умолчению" для данной группы, а
возвращаемое формой значение - это значение этой группы. Тогда в форме
должены присутствовать следующие строчки кода:

На событии открытия формы:
...
Me!ctlGrp = varMyFunction_SetVal
...

На событие закрытия формы:
...
varMyFunction_RetVal = Me!ctlGrp
varMyFunction_IsEndWork = True
...

Вот, собственно, и все.

Пример 3

Разработка приложений MS Access не является моим основным занятием, но всё же это часто случается и при этом доставляет удовольствие, как и любой творческий процесс. Сайт Ваш посещаю регулярно и часто нахожу полезные советы или элементы приложений. А бывает, просто прочтение каких-нибудь материалов наталкивает на новые идеи. В последнее время я заметил нечто вроде дискуссии на тему возврата значений из форм и хотел бы внести свою лепту. В простых случаях, как, например, возврат значения даты из формы календаря, я часто пользуюсь другим способом (к сожалению нет готового примера, но могу подготовить и прислать). Этот подход может показаться ограниченным, но во многих случаях он позволяет решить проблему наиболее, на мой взгляд, просто, так как не требует никаких дополнительных глобальных переменных, методов и т.п.
Возвращаемое из формы значение можно перед закрытием просто присвоить её свойству Tag.
Делать это лучше в процедурах обработки событий нажатия кнопок (таких, как "OK", "Отмена" и т.п.), иначе этот способ не сработает. Таким
образом, фрагмент вызывающей программы может выглядеть так:

DoCmd.OpenForm "Example", , , , , acDialog, "ABCD"
ResultString = Form_Example.Tag

"Example" имя открываемой формы;
acDialog параметр, указывающий, что форму
надо открывать в модальном режиме (при этом следующая строка программы будет выполнена только после закрытия формы, когда возвращаемое ей значение уже будет известно);
"ABCD" передаваемая в OpenArgs информация (если нужно).
>
Далее, значение ResultString можно использовать, например, для выполнения необходимых проверок и присвоения значения какому либо полю
главной формы. Если нужно указать, что пользователь отказался от изменений, нажав кнопку <Отмена> или просто закрыв форму, то можно присвоить свойству Tag пустую строку или исходное значение OpenArgs. Если необходимо передавать не строковое значение, а число или дату, то придётся выполнить соответствующие преобразования. Для передачи нескольких значений (как в ту, так и в другую сторону) потребуется сформировать из них строку со специальными разделителями, а затем выбирать значения с помощью специальной функции, например, такой:
Const ArgsSeparator = "//"
Public Function GetArgument(strArguments As String, intArg As Integer) As String
' strArguments - строка аргументов с разделителями ArgsSeparator
' intArg As Integer - порядковый номер (начиная с 1) аргумента, который функция должна вернуть
On Error Resume Next
Dim intCounter As Integer
Dim iCurrPos As Integer
Dim strCurrArg As String

GetArgument = ""
For intCounter = 1 To intArg
If strArguments = "" Then Exit Function
iCurrPos = InStr(strArguments, ArgsSeparator)
If iCurrPos > 0 Then
strCurrArg = Left(strArguments, iCurrPos - 1)
strArguments = Mid(strArguments, iCurrPos + Len(ArgsSeparator))
Else
strCurrArg = strArguments
strArguments = ""
End If
Next intCounter
GetArgument = strCurrArg

End Function
С уважением, Сергей Смирнов (ssmirnov@id.ru)
...
Рейтинг: 0 / 0
форма-функция
    #32089477
vladK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Sfagnum:Спасибо большое за "большой" ответ. Только пришел, буду разбираться.
...
Рейтинг: 0 / 0
форма-функция
    #32089485
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / форма-функция
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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