MSAccess 2003 - VBA для передачи значения из одной формы в другую - PullRequest
9 голосов
/ 23 сентября 2009

Так как я могу передать значение из одной формы в другую? Например: пользователь выбирает организацию из списка, и это открывает форму поездки, которая позволяет пользователю вводить различную информацию о поездке. В одном месте я хотел бы добавить еще одну маленькую всплывающую форму, где они могут ввести контактную информацию (просто имя и телефон для POC) организации, которую они посещают.

Итак, когда эта начальная форма открыта с экрана выбора, у нее есть два идентификатора, которые просто скрыты в текстовых полях (один - tripID, а другой - OrgID), так как мне передать их во второе маленькое всплывающее окно сформируйте так, чтобы у контактной информации были соответствующие идентификаторы.

Спасибо.

Ответы [ 3 ]

16 голосов
/ 23 сентября 2009

Лучший подход в этих случаях - не пытаться передавать кучу переменных. Это слишком много кода и негибко. Например, если вам нужно передать два значения, что произойдет за эти годы, когда это требование возрастет до 5 значений? Попытка сохранить и передать целый набор значений - слишком трудоемкий код.

Имейте в виду, что каждая форма в ms-access на самом деле является объектом класса, которым вы можете манипулировать в коде. Итак, используйте здесь объектный подход, и вы обнаружите, что вы не только пишете меньше кода, но и ваш код будет более чистым, более модульным, не будет нуждаться в глобальных переменных, а код, который вы пишете, часто может использоваться повторно между различными формами. *

Вот как:

Как правило, когда одна форма запускает другую форму во 2-й форме в событии открытия форм (на самом деле вы можете использовать его даже позже, чем событие загрузки), вы можете получить ссылку на объект формы ПРЕДЫДУЩАЯ. , Другими словами, вы можете использовать объектный подход здесь.

На уровне модуля форм, для формы я объявляю объект формы как:

Option Compare Database
Option Explicit 
dim frmPrevious       as form 

Затем в событии загрузки по формам мы идем:

Set frmPrevious = Screen.ActiveForm

Теперь любой код в нашей форме может БЕСПЛАТНО использовать код, события, даже переменные, объявленные как открытые из предыдущей формы в коде.

Итак, если вы хотите форсировать запись на диск предыдущей формы и перезагрузить данные.

frmPrevious.Refresh

Если вы хотите установить значение идентификатора, перейдите:

frmPrevious!ID = some value

И, обратите внимание, что вы даже можете объявить предыдущую форму как переменную PUBLIC для этой формы, и, таким образом, если у вас две формы глубины, вы можете перейти:

frmPrevious.frmPrevious!ID = some value

Итак, просто объявите объект формы в КАЖДОМ модуле кода форм (или, по крайней мере, в тех, где вам нужно использовать значения в коде). Вышеуказанное означает, что любой код имеет готовую ссылку на предыдущий объект формы. Функции, объявленные как общедоступные в форме, становятся МЕТОДОМ формы и могут выполняться следующим образом:

frmPrevious.MyCustomRefresh

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

frmPrevous.SetInvoice

или

frmPrevious.SetProjectStatusOn

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

Фактически, как стандарт кодирования, большинство моих форм имеют открытую функцию под названием MyRefresh.

Обратите внимание, что прелесть этого подхода в том, что вы можете читать + использовать + устанавливать значения из этой предыдущей формы. Это позволяет вашему коду не только получать значения, но и устанавливать значения в этой предыдущей форме. Так что этот подход является двунаправленным. Вы можете перетасовывать данные и значения между формами. Другим преимуществом здесь является то, что вы НЕ ограничены только переменными, но можете использовать поля, управляющие значения (события, свойства) и т. Д.

Этот подход означает, что большая часть предыдущей формы теперь у вас под рукой.

Так что не пытайтесь передать целый набор переменных. Передайте ссылку на форму, и у вас под рукой будет красивый готовый объект, и это делает этот тип проблемы кодирования легким.

6 голосов
/ 23 сентября 2009

Обычный способ - ссылаться на текстовые поля в исходной форме из всплывающей формы, например:

Forms!frmInitialForm!tripID
Forms!frmInitialForm!OrgID

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

Лучше всего использовать OpenArgs:

DoCmd.OpenForm "frmPopup", OpenArgs:=Me.tripID & ", " & me.OrgID

Это помещает ваши два значения в строку, которая передается во всплывающую форму. Затем вы можете проанализировать два значения из OpenArgs, используя функцию Split.

Для получения дополнительной информации о передаче параметров с использованием OpenArgs см .: http://www.fmsinc.com/free/NewTips/Access/accesstip13.asp

1 голос
/ 23 сентября 2009
...