Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
форма-функция
|
|||
|---|---|---|---|
|
#18+
Как лучше сделать свой InputBox и можно ли (на VBA) Т.е. пользовательская форма, которая может что-то возвратить туда, откуда её вызвали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 17:19 |
|
||
|
форма-функция
|
|||
|---|---|---|---|
|
#18+
Думаю может! Создаешь функцию в которой переменной присваивается объект заранее запрограммированной формы. После чего эта переменная (Форма) вызывается. Ну и соответственно после завершения ее работы возвращаем значение взятое с этой формы. Ну и плю саму форму надо как-то запрограммировать, как тебе надо будет! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 17:23 |
|
||
|
форма-функция
|
|||
|---|---|---|---|
|
#18+
Ну писАл же уже! Через текстовое поле с маской "Пароль". Возвращать можно, например, через глобальную переменную. А можно сразу в коде формы проверять введенное значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 17:24 |
|
||
|
форма-функция
|
|||
|---|---|---|---|
|
#18+
Сорри, это было немного о другом... Что-то я нервный сегодня... А в чем смысл создания своего Инпута? Что в стандартном не устраивает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 17:31 |
|
||
|
форма-функция
|
|||
|---|---|---|---|
|
#18+
2mahoune: Не получиться, потому, что нет синхронности. Вызванная из функции форма выполняется своим чередом (процессом или потоком, не знаю, вопрос к сишникам), а функция своим. И когда Вы функции присвоите значение глобальной переменной, которой собираетесь присвоить значение из поля формы по её событию закрытия (например), то получите Empty. Возможно тут можно как то докумекать, опрашивая через таймер закрыта ли форма, но это уже будет curve, которая мне уже не нравиться из-зи глобальной пременной. 2AlexJuice. Представтье ситуацию когда есть вспомогательная форма, например, калькулятор. Я вызываю её из разных форм, произвожу вычисления и по нажатию Ok хочу возвратить результат туда, откуда вызывал. так что суть не в InputBox, просто он как раз выполняется синхронно с общим потоком - пока я не введу что то и не нажму OK программа дальше не идет - вот наконец выразился по простому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 18:01 |
|
||
|
форма-функция
|
|||
|---|---|---|---|
|
#18+
Sorry mahoune, можно и по Вашему если открыть форму с параметром acDialog (что оказывается не тоже самое что модальная- это узнал только сейчас.) Но вообще я думал что возникнут идеи с тем что форма это модуль класса, и форма может иметь пользовательские свойства и события... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 18:13 |
|
||
|
форма-функция
|
|||
|---|---|---|---|
|
#18+
Тут нашёл инфу может поможет: Код: plaintext Когда мне нужно из Формы вызвать другую форму и получить от нее какое либо значение, то я поступаю сл. образом: В форме-приемник описываю 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 Один из часто задаваемых вопросов - как открыть форму, которая после своего закрытия возвращает какое-либо значение. Опишу один из способов реализации этой проблемы. Если смотреть на проблему более "глобально", нам нужно написать функцию, принимающую параметры и возвращающую значение. Ее вызов должен выглядеть примерно так: ... 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2003, 09:48 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32089477&tid=1682571]: |
0ms |
get settings: |
7ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
70ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 256ms |
| total: | 441ms |

| 0 / 0 |
