ArrayList, activeX and Delphi

4
我是一名业余天文学家,用Delphi编写望远镜驱动程序,并使用标准 ASCOM。首先要特别感谢David Heffernan在过去两个月里给了我很多帮助。我在编写驱动程序方面取得了很大进展,有一个评判标准:'Conform',它测试驱动程序的所有兼容性。一开始情况非常糟糕,现在我已经走上了正确的道路。最后一个真正未解决的问题是一个stringArrayList。Ascom望远镜驱动程序的文档有一个属性:
ArrayList SupportedActions { get; }

Visual Basic:

ReadOnly Property SupportedActions As ArrayList
Get

Visual C++

property ArrayList^ SupportedActions {
  ArrayList^ get ();
}

字段值
一个字符串的ArrayList(SafeArray集合),包含支持操作的名称。选择数组列表集合作为操作名称的载体,以便客户端更容易确定是否支持特定操作。这可以通过Contains方法轻松完成。由于集合也是可枚举的,因此可以使用诸如For Each...之类的结构来操作成员,而无需担心集合中有多少成员。

在望远镜规范中使用了集合已有多年,并已知与COM兼容。在.NET中,ArrayList是正确的实现,因为.NET通用方法与COM不兼容。

所以我尝试制作一个自动化对象:

enter image description here

我收到了大法官“Conform”程序的错误信息(抱歉,这是法语翻译):

ERROR .NET - Exception: System.InvalidCastException: 无法将类型为'System.__ComObject'的COM对象强制转换为类'System.Collections.ArrayList'的类型。表示COM组件的类型实例不能被强制转换为与其不同的类型; 但是,它们可以被强制转换为接口,直到底层的COM组件负责调用QueryInterface以获取接口的IID为止!?!?!?!?!?

对我来说,中文或古希腊语更容易理解。我唯一找到的是在注册表中:

enter image description here

感谢您的帮助。这是一张我用望远镜拍摄,并使用自己编写的程序制作的照片,仅供您查看:

enter image description here


为什么不使用TStringList呢?当Delphi有相当数量的适当等效对象时,不要尝试使用.NET对象。看一下TListArrayList的Delphi等效对象),TList<T>TObjectListTObjectList<T>TStringList,这只是其中几个例子。 - Rudy Velthuis
@Rudy 如果组件是 .net 组件,使用 Delphi 类会有什么帮助呢?这只会导致镜像问题。Delphi 可以使用 TStringList,但 .net 代码不能。 - David Heffernan
最后,能否在Delphi中使用.NET组件? - michastro
好的,我有点不明白。他必须将ArrayList传递给.NET吗?那么我真的很想知道为什么这部分没有在.NET中完成。 - Rudy Velthuis
@Rudy 有很多互操作选项可用。只是对于不熟悉互操作领域的非专家来说并不简单。 - David Heffernan
显示剩余8条评论
1个回答

1

解决方案如此简单!我在一个网页上找到了它。你想要一个来自.net的ArrayList吗?那就这样做:

function TTelescope.Get_SupportedActions: OleVariant;
var
  capacity: Integer;
  item:Variant;
  dotNetArrayList:Variant;
begin
{ Create object }
  dotNetArrayList := CreateOleObject('System.Collections.ArrayList');


{ Add an element }
  dotNetArrayList.Add('Un élément chaîne');
  item := dotNetArrayList.Item(0);
  Result:=dotNetArrayList;
end;

它运行得非常完美。不过,非常感谢您的答复,也许有一天我会尝试学习C#。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接