首先,请原谅我的英语,我是法国德尔福用户......
我正在编写一个复杂的程序,我想让它模块化(即它使用插件)。所以我编写了一个插件管理器系统,动态加载可用的插件并显示和执行它们。
但是我遇到了很多问题,例如指针错误和标准功能错误(例如:TPageControl
没有更改其活动标签!)
我已经探索了很多方法来使这个系统工作,但我仍然没有找到理想的方法。
这是我使用的系统:
主程序打开包含地形数据的文档(如字段数据,角度数据,坐标数据)。 它在启动时加载插件,并为每个有效插件添加菜单项和工具栏按钮。
每个插件必须:
问题在于,为了执行插件,首先必须填充可能依赖于其他数据的数据:
//Only one TDossierData
TDossierData = record
Numero: Integer;
Commune: String;
//A lot of other properties of different types
end;
//Can have a lot of TNHVDStation, TNHVDPoint, TPolygo and TXYZPoint
TNHVDStation = record
Numero: String;
Hi: Double;
//Other properties of different types
end;
TNHVDPoint = record
Numero: String;
AH: Double;
Station: TNHVDStation; //Depends on the above record
//Other properties of different types
end;
//To use the both above records, I must browse every TNHVDStation and
//for each of them, browse every TNHVDPoint which depends on it
TPolygo = record
PolygoType: TPolygoType; //This is a set but it doesn't matter
StartReference: String;
//Other properties of different types
end;
TXYZPoint = record
Num; String;
X: Double;
//Other properties of different types
end;
当插件执行时,mainform将插件中的新数据加载到打开的文档中。
目前,我已经为这些数据编写了一个管理器(派生自TComponent
),我只是将此管理器作为参数加载/保存数据。但这很棘手。
另一个问题是当我将插件参数Form加载到参数主窗体中时。有时,插件表单可以包含复杂的控件,当它是父级时,结果可能非常奇怪!正如我所说,PageControl标签在点击时不会再做出反应,从父级创建一个新表单会产生访问冲突,等等...
这些问题告诉我,我使用了错误的方法,或者我使用的方法很糟糕......
我的问题很简单:
实现此插件系统的更好解决方案是什么? DLL? COM?包?其他?