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

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

如何开始工作?

还有一个问题,哪个更好用:图书馆的静态或动态加载? 你能推荐一些书籍或网站来了解更多相关信息吗?

提前致谢。

有帮助吗?

解决方案

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

在多个库之间引用的任何内容必须在其自己的库中 梅森的建议很合理。 / p>

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

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

其他提示

似乎是通过“库”来实现的。你的意思是BPL包,所以这里是指南:

每个BPL加载后,加载其中的所有单位。任何单位都不能加载多次。这意味着如果多个包需要访问其中一个全局变量,那么它必须位于其他(需要)列表中的其他包中,或者位于单独的包中所有其他人都需要。

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

我不明白为什么人们为这样一个简单的问题提到Delphi版本,答案是肯定的,最好在实现关键字之前将共享变量放在一个单独的单元中。 每个对象(表单,类,控件)都派生自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教程,理解起来应该非常简单。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top