0

我试图在库中划分我的单体 Delphi-Win32 应用程序,所以我遇到了一些关于如何使用 Delphi 2009 在我的库之间共享全局变量和对象的问题。例如,我有 3 个全局对象(派生自 TObject):用于用户信息、当前会话信息以及存储活动数据库连接和管理与此数据库的操作。我的库需要使用这些对象。此外,某些库会将派生自 TForm 的对象提供给主窗体中的另一个父控件。每个从 TForm 派生的对象传递给主窗体都有自己的方法和属性,即它们的类彼此不同。

我正在考虑将全局对象放入一个单独的库中,但我想这会使事情变得更加困难,但请考虑一下。

这种情况下怎么上班?

还有一个问题,哪个更好用:库的静态或动态加载?您能推荐一些书籍或网站以了解更多信息吗?

提前致谢。

4

3 回答 3

2

我们过去在模块之间共享变量(我们使用 BPL)所做的是通过共享的 TStringList 传递它们。一般来说,最好有一个全局共享对象,其中包含所有共享变量。

任何要在多个库之间引用的东西都必须在它自己的库中。 梅森的建议是合理的

使用静态加载,除非您出于某种特定原因确实需要动态加载(听起来不像)。让 Windows 内存管理器从内存中换出不需要的库。

来自管理大型应用程序的人的一个提示,该应用程序拆分为多个库。我们在包中包含组件、VCL、一些应用程序通用例程,然后是每个“屏幕”或应用程序段的库。对于屏幕的更改,可以只发布一个更新的库,但是对于任何其他类型的库的更改,我们发现我们通常必须重新部署所有内容。因此,我们很少能从配置中获得优势。

于 2009-11-28T15:31:20.323 回答
1

似乎“库”是指 BPL 包,所以这里是指导方针:

每个 BPL 在加载时都会加载其中的所有单元。任何单位都不能装载超过一次。这意味着,如果多个包需要访问其中一个全局变量,则它必须位于其他包中的Requires列表中的一个包中,或者位于所有其他包都需要的单独包中。

至于静态与动态加载,如果您的程序绝对需要它,请将其静态链接。动态加载用于可选功能,例如插件。(如果你想走这条路,看看 JVCL 中的 JVPlugin。这是一个非常有用的系统。)

于 2009-11-28T05:41:15.077 回答
-1

我不明白为什么人们会为这样一个简单的问题提到 Delphi 版本,答案是肯定的,最好在 implementation 关键字之前将共享变量放在一个单独的单元中。每个对象(表单、类、控件)都是从 TObject 派生的,即使您定义了一个类

type TMyClass = class
  // no inheritance ?
end;

上面的类仍然是从 TObject 派生的(阅读 Delphi 帮助)。您的全局变量可以声明为 TObject 或 Pointer 类型,当您访问它们时使用硬转换 TForm(MyPointerVariable).Method,即

var MyPointerVariable: Pointer; // I presume it is already initialized and is a pointer to a TForm descendant
...
begin
     TForm(MyPointerVariable).Caption := 'Stack Overflow';
end;

有关更多信息,请阅读我博客上的 Delphi 教程,它应该很容易理解。

于 2009-11-28T06:27:03.977 回答