Передача переменных из дочерней в основную форму - PullRequest
2 голосов
/ 15 июля 2009

Я сделал Access 2007 db. Я буду писать некоторые базовые vba для соответствующего события формы, чтобы при открытии исходной формы отображалась модальная форма. Это не сложно, но эта форма будет иметь выпадающий список идентификаторов из определенной таблицы. Пользователь выберет идентификатор, но я хочу, чтобы выбранный идентификатор из этой формы вернулся в родительскую форму. E.g.:

  1. Форма автомобиля открыта
  2. Событие запускается, чтобы открыть модальную форму

Идентификаторы FK для автомобилей должны быть выбраны в поле со списком (например, идентификатор водителя - для простоты, давайте предположим, что на одном автомобиле может быть много водителей, но не наоборот, поэтому только 1: n)

Есть кнопка для подтверждения выбора. При нажатии на эту кнопку форма закрывается, и выбранный идентификатор водителя автоматически вставляется в текстовое поле DriverID на форме автомобиля (вероятно, будет доступно только для чтения).

Последний шаг, в котором я не уверен. Как это можно сделать в VBA?

Ответы [ 5 ]

3 голосов
/ 16 июля 2009

Это один из худших потоков доступа, которые я когда-либо видел на StackOverflow.com, потому что каждый ответ неверен, по крайней мере, в каком-то важном аспекте - ни один из них не будет работать, если вы вставите их в VBA в база данных Access.

Ключевые принципы здесь:

Открыть диалоговую форму модально (с аргументами acDialog)

Не закрывайте его после подтверждения значения, а вместо этого установите его свойство .Visible в False.

Затем в форме вызова прочитайте значение из скрытой формы, а затем закройте его.

Примерно так:

  DoCmd.OpenForm "dlgPickDriver", , , , , acDialog 
  If IsLoaded("dlgPickDriver") Then
     Me!DriverID = Forms!dlgPickDriver!cmbDriver
     DoCmd.Close acForm, "dlgPickDriver"
  End If

[IsLoaded - это функция, предоставляемая Microsoft; Я недавно опубликовал это здесь, на StackOverflow , но предположил бы, что подавляющее большинство разработчиков Access, пишущих на VBA, использовали бы его всегда]

Я бы не рекомендовал, чтобы код, запускаемый в диалоговой форме, вставлял данные в родительскую форму, потому что тогда невозможно использовать диалоговую форму в нескольких местах. Хорошая практика программирования заключается в том, чтобы диалоговая форма знала как можно меньше о контексте, в котором она называется. С другой стороны, это правда, что вызывающая форма должна знать имя элемента управления, из которого она получает значение, но, на мой взгляд, это более разумный контекст, чем наоборот.

3 голосов
/ 15 июля 2009

Чтобы получить «доступ» (получить ?!) к элементам управления в отдельных запущенных формах, вы можете использовать следующее:

Forms("AnOpenFormName").Controls("ControlName") = value

Редактировать: я использовал неправильные скобки AMG!

0 голосов
/ 29 января 2014

Мне кажется намного проще создать глобальную переменную в модуле (например, Public gi_Value as Integer), а затем установить ее в дочерней форме. Затем значение можно прочитать в любом месте.

0 голосов
/ 15 июля 2009

Все вышеперечисленные ответы хороши.Мне особенно нравится третий способ преобразования такого рода функциональности в вызовы функций многократного использования.Единственное, что я хотел бы добавить, это не ЗАКРЫТЬ модальную форму ... в противном случае вы не можете получить выбранное значение.Вместо этого сделайте me.visible = false.

Таким образом, вы делаете что-то вроде этого.

Public Function GetCArKey as Integer

dim intReturn as integer

docmd.openform "MyModalForm",,,,,,acdialog  

'(событие щелчка кнопки okay этой формы делает me.visible = false ..Нажатие кнопки Отмена закроет форму.)

if isloaded("MyModalForm") then
   intReturn=Forms("MyModalForm").Controls("ControlName").Value
end if

GetCarKey=intReturn

End Function 
0 голосов
/ 15 июля 2009

Вы можете написать функцию, которая будет отображать форму модально, а затем возвращать выбранное пользователем значение в качестве возвращаемого значения (аналогично msgbox / inputbox).

РЕДАКТИРОВАТЬ: Вы можете написать функцию, такую ​​как следующие.

Function GetUserSelectedCarID() as string
dim myPopupForm as Form
set myPopupForm = new Form

myPopupForm.Show vbModal
GetUserSelectedCarID = myPopupForm.UserSelectedCar
End Function

UserSelectedCar - это свойство, которое хранит выбор пользователя во всплывающей форме.

РЕДАКТИРОВАТЬ2: Вы также можете добавить свойство в всплывающую форму, чтобы увидеть, нажал ли пользователь OK или Отмена. Он вернется пустым из вышеуказанной функции, если пользователь нажал Отмена.

...