全局变量失去它的价值

Posted

技术标签:

【中文标题】全局变量失去它的价值【英文标题】:Global variable loses its value 【发布时间】:2013-07-11 19:37:14 【问题描述】:

在我正在处理的这个 Access 表单上,我有一个全局变量,它从另一个表单的 Form_Load 事件中获取它的值。由于某种我不知道的原因,变量在经过一段时间或发生某些事件后“失去其价值”(变为 =“”)。我没有注意到任何特别会触发这种行为的东西。表单上的“不活动”一段时间后,全局变量是否会重置?

我是这样设置全局变量的:

Private Sub Form_Load()       
    '...
    Set prev_form = Form_Identification.Form
    PasswordSybase = prev_form.Password.Value & vbNullString
    UserSybase = prev_form.UserID.Value & vbNullString
    '...
End Sub

【问题讨论】:

What is the lifetime of a global variable in excel vba ? 【参考方案1】:

我开始使用的替代解决方案(仅 2007 年及以后)是TempVars,而不是在我“需要”全局的奇怪情况下使用全局变量。它是一个集合,除非您明确释放它,否则它会在应用程序期间持续存在。所以在某些情况下,我觉得它比全局变量更有用,在某些情况下更糟。

TempVars.Add myVarName, myVarValue ' To initialize
TempVars.Item(myVarName) = newVarValue ' To reference and assign a new value
TempVars.Remove(myVarName) ' To release

快速搜索应该会显示更多参考文献,但我已包含指向基本参考文献的链接

http://blogs.office.com/b/microsoft-access/archive/2010/09/27/power-tip-maximize-the-user-of-tempvars-in-access-2007-and-2010.aspx

【讨论】:

我赞成但不能接受,因为我必须使用 Access 2000(对不起,我之前没有指定)。不过,对于 2007+ 来说是一个很好的答案。我一定会记住这一点。 旧帖子但仍然有用,TempVars 在 Application.Quit (所有这些卸载事件:D)之后仍然存在,但在 Globals 不完全关闭之前。【参考方案2】:

我确实希望访问者看到这篇文章,因为它提供了一个重要的附加部分。

即使您在全局范围内声明一个变量,如果您在表单模块中设置该变量的值,那么当您 UNLOAD 表单时,该值似乎会丢失。

解决方案(在我的情况下)就像替换一样简单:

卸载我

...与...

我。隐藏

我在该代码模块中设置的变量(和对象)然后在应用程序实例的整个生命周期中保留它们的值。

【讨论】:

感谢您 - 我在测试期间一直在手动关闭我的主窗体(这是普通用户无法做到的),并且想知道为什么我的全局变量一直处于未设置状态。今后会更加小心!【参考方案3】:

这可能会有所帮助: https://accessexperts.com/blog/2011/01/12/multi-session-global-variables/ Juan Soto 解释了如何使用本地表来保存变量以及如何在需要时调用它们。它可能会在 2000 年达到您的目的,因为 TempVars 不是一个选项。您可以随时删除数据库“关闭时”的变量,以便不保留 UID 和 PWD。​​p>

【讨论】:

【参考方案4】:

您可以通过

创建一个“假”全局变量 创建表单(例如命名为 frmGlobal) 确保表单始终打开但隐藏 为您想要的每个全局变量(例如 tVar1)创建一个 TextBox 在您的代码中,参考例如Form_frmGlobal.tVar1

缺点是未绑定的文本框可能无法为您提供所需的特定数据类型

这两种方法是

在您的代码中,在引用全局变量时将文本框显式转换为数据类型 例如 Clng(Form_frmGlobal.tVar1)

另一种选择是创建一个单行表格并将隐藏表单上的文本框绑定到表格,以便强制执行您的数据类型

此方法的一个好处是您可以在会话之间使用持久存储 警告:确保此表仅对单个用户本地,在前端数据库文件中(不要因为多用户相互覆盖而将其放在后端数据库中)。这假设您使用的是前端 + 后端分离的数据库,并将前端分配到每个用户的工作站。

【讨论】:

【参考方案5】:

我在该语句中没有看到任何东西告诉我它是一个全局变量。您可以在模块中的 ALL Subs/Functions 上方和 Options Compare 语句下方设置全局变量,方法是:

PUBLIC X as string

任何其他变量只有在子或函数完成之前才有效。

此外,全局变量必须在 PROPER MODULE 上声明。您不能在表单的模块上声明它们。

【讨论】:

那个“全球”关键字似乎不存在。我把它放在顶部并这样声明:Dim PasswordSybase as String 尝试将 PUBLIC PasswordSybase 作为字符串。省去暗淡 Global 是早期 VB 版本的遗留物,已被 Public 取代。虽然它仍然接受它(如果您以小写形式键入它,则大写 G)但是如果您单击该单词并按 F1,它会将您带到 Public Statement 的帮助。

以上是关于全局变量失去它的价值的主要内容,如果未能解决你的问题,请参考以下文章

如何从函数内部更改全局变量的值?

如何修改全局变量的值

python 函数传参练习 全局变量与局部变量 的理解

全局变量

全局变量

常见的 JavaScript 内存泄露