我正在开发一个 MDI 应用程序(Delphi 7),它将以插件的形式加载 .bpl 包作为 MDI 子项。一个插件只能打开一个实例,但显然可以同时打开多个插件。
我有一个类,它是一个通用类,用于“共享”MDI 父级上可用的某些组件。我通过让公共类在构造每个相关组件时存储一个指向每个相关组件的指针来实现这一点。
例如:
...
TCommonClass = class(TObject)
public
MainMenu: ^TMainMenu;
MyClass: ^TMyClass;
...
constructor TCommonClass.Create;
var
CtrlItm: array[0..999] of TComponent;
...
for i := 0 to (Application.MainForm.ComponentCount - 1) do
begin
CtrlItm[i] := Application.MainForm.Components[i];
if CtrlItm[i].ClassName = ‘TMainMenu’ then MainMenu := @CtrlItm[i];
if CtrlItm[i].ClassName = ‘TMyClass’ then MyClass := @CtrlItm[i];
end;
每当我引用一个对象时,我只需执行以下操作:
...
var
tmp: String;
begin
MainMenu^.items[0].Caption := 'Something'; //just to demonstrate
MyClass.DoSomething;
end;
每个插件都有自己的这个公共类的实例,其理念是对其组件之一的任何更新都会真正更新 MDI 父级上的组件。这种方法对我来说一直很有效,直到我编写的最后一个插件(它相当大并且包含许多 TMS 组件)开始给我带来我似乎无法追踪的错误。
我想知道的是,这种方法在内存(指针)使用方面是否合理?通过加载和卸载包,内存映射的变化是否有可能破坏指针?我应该以不同的方式做这件事吗?