2014-12-09 2 views
3

ОК, я был вне программирования Access для нескольких версий, но я мог бы поклясться, что имел возможность указывать элементы управления в глобальных переменных формы. Пример кода следующим образом:VBA управляет ссылкой (формой) глобальных переменных?

Option Compare Database 
Option Explicit 
Dim Testvar As String 

Private Sub Form_Load() 
Testvar = "Load" 
End Sub 

Private Sub Form_Open(Cancel As Integer) 
Testvar = "open" 
End Sub 

Private Sub Text0_Click() 
Testvar = "settest" 
End Sub 

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

Итак, вопросы - Я схожу - это было невозможно? Или я забыл, как обратиться к форме?

А затем самый важный вопрос - какой лучший способ обойти это?
Наиболее распространенный способ использования этого метода - передать OpenArgs (в этом случае записывать ключи), который затем анализируется на глобальные vars, а затем несколько элементов управления отображают открытые аргументы и/или отображают значения, отображаемые с помощью клавиш ,

Мне очень жаль, что приходится строить подпрограммы, которые восстанавливают и загружают источники записи для элементов управления. Надеюсь, что кто-то знает лучший подход

+0

Вы пытаетесь связать текстовое поле с переменным уровнем модуля? – RubberDuck

+0

Это правильно. Я бы подумал, что контроль, по крайней мере, сможет «увидеть» переменную.Даже если это может не позволить прямого связывания. – alanTuring

+0

@alanTuring вы должны объявить переменную * 'global' * в регулярном модуле, а не в модуле формы. Объявите его как 'public myGlobal as String', тогда он станет доступен для всех модулей. –

ответ

2

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

Function GetTestvar() As String 
    GetTestvar = Testvar 
End Function 

Затем используйте =GetTestvar() как источник управления для Text0.

+0

Хорошо, это, наверное, то, что я помню. В лучшем духе ООП, имея функцию put и get для внешних ссылок. Это очень хорошо работает в моем фактическом случае - поле с dlookup на нем следующим образом: = DLookUp («LookupDesc», «vlookup», «LookupGroup =« FUNS »и LookupID = '» & GetFunctID() & "'") – alanTuring

+0

Не знаете, почему вы говорите о внешних ссылках. Я пересмотрел этот ответ, чтобы уточнить, что я намерен создать функцию в модуле кода формы. – HansUp

+0

ОК, немного «вне темы» - использование функции для извлечения значения из другого «объекта» - очень OOPie. В очень формальной модели кодирования любые значения, требуемые другим модулем, должны вызываться с помощью «get». Я просто подумал, что это очень хороший подход. – alanTuring

2

Вы должны фактически установить значение текстового поля. Невозможно (насколько мне известно) привязать текстовое поле к переменной.

Option Compare Database 
Option Explicit 

Private Sub Form_Load() 
    Text0.Value = "Load" 
End Sub 

Private Sub Form_Open(Cancel As Integer) 
    Text0.Value = "open" 
End Sub 

Private Sub Text0_Click() 
    Text0.Value = "settest" 
End Sub 

Конечно, вы можете сохранить значение в переменной и использовать его, чтобы установить значение вместо этого, но это не имеет никакого смысла, чтобы сделать это в этом простом примере.

+0

Крысы. Я мог бы поклясться, что в контроле можно ссылаться на переменную. Так и должно быть. Спасибо, ребята – alanTuring

2

Коллекция TempVars - это функция, введенная в Access 2007. Итак, если ваша версия доступа> = 2007, вы можете использовать TempVar для хранения строкового значения. Затем вы можете использовать TempVar в качестве источника управления для вашего текстового поля.

С =[TempVars]![Testvar] в качестве источника управления для Text0 следующие процедуры проведения событий делают то, что вы просили.

Private Sub Form_Open(Cancel As Integer) 
    TempVars.Add "Testvar", "Open" 
End Sub 

Private Sub Form_Load() 
    TempVars("Testvar") = "Load" 
End Sub 

Private Sub Text0_Click() 
    TempVars("Testvar") = "settest" 
    Me.Text0.Requery 
End Sub 

Примечание: [TempVars]![Testvar] будут доступны по всей заявке на оставшуюся часть сессии. Если это является проблемой в вашей ситуации, вы можете удалить TempVar в форме, близкой: TempVars.Remove "Testvar"

+0

Это очень хороший способ сделать это. Я не понимал, что вы можете сделать это с помощью TempVars. Просто отметим, что TempVars доступны во всем приложении, поэтому это может немного испортиться, если с помощью этого метода существует множество элементов управления. Они также доступны только в Access (или со ссылкой на Access). ++ – RubberDuck

+1

Да, я добавил предупреждение об этом. Благодарю. – HansUp

+0

@HansUp - это похоже на довольно работоспособное решение. TempVars являются глобальными по охвату, которые мне не нужны, но у них есть свойства, которые я ищу. Спасибо за подсказку - я никогда не слышал о TempVars. – alanTuring

-1

Требование было: показать идентификатор входа пользователя приложения для всех форм в приложении.

Вот как я реализовал это:

Create a module: module_init_globals 
with the following code: 

Option Compare Database 

'Define global variables 

Global GBL_LogonID as string 

Option Explicit 

Public Sub init_globals() 

    'Initialize the global variables 

    'Get_Logon_Name is a function defined in another VBA module that determines the logon ID   of the user 

    GBL_LogonID = Get_Logon_Name() 

End Sub 


On the main/first form - we need to call the module that will initialize the global variables: 

In the code for "on open" event I have: 

Private Sub Form_Open (Cancel as Integer) 
    call init_globals 
End Sub 




then on each of the forms in the app, I have a text control - txtUserID to display the logon id of the user 

and I can set it's value in the "on open" event of the form. 

txtUserID.value = GBL_LogonID