插件架构数据/控制交换

时间:2014-05-17 15:52:23

标签: delphi plugins dll com

首先,请原谅我的英语,我是法国德尔福用户......

我正在编写一个复杂的程序,我想让它模块化(即它使用插件)。所以我编写了一个插件管理器系统,动态加载可用的插件并显示和执行它们。

但是我遇到了很多问题,例如指针错误和标准功能错误(例如:TPageControl没有更改其活动标签!)

我已经探索了很多方法来使这个系统工作,但我仍然没有找到理想的方法。

这是我使用的系统:

主程序打开包含地形数据的文档(如字段数据,角度数据,坐标数据)。 它在启动时加载插件,并为每个有效插件添加菜单项和工具栏按钮。

每个插件必须:

  • 描述自己(标题,提示,图标等)
  • 执行自身(显示更改数据的表单)
  • 如果需要,可以在主程序的参数Form中设置一个控件(它是插件参数表)

问题在于,为了执行插件,首先必须填充可能依赖于其他数据的数据:

//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?包?其他?

  • DLL:它是我使用的方法。但是我已经说过很多问题了。
  • COM:1)这对我来说是一种困难的方法,我仍然在研究这种方法。 2)我无法理解为什么这种方法更好地实现我的插件系统,因为有人告诉我特别是使用组件。我发现了一个非常有用的tutorial但是像往常一样,它只显示基本功能。我从来没有找到关于COM的复杂数据/控制交换的教程......
  • 软件包:恭顺,我不喜欢这种方法......我提供大量BPL文件的简单事实让我觉得它不是很容易使用......

0 个答案:

没有答案