ArrayList、activeX和Delphi

ArrayList、activeX和Delphi,delphi,com,Delphi,Com,我是一名业余天文学家,我用Delphi和标准为望远镜编写驱动程序 首先,我要特别感谢大卫·赫弗南,他在过去的两个月里给了我很多帮助。我在编写驱动程序方面取得了很大的进步,并且有一个评委:“Conform”,一个测试驱动程序所有兼容性的程序。起初情况很糟糕,现在我走上了好的道路。最后一个真正未解决的问题是string的ArrayList。 Ascom望远镜驱动程序的文档具有以下属性: C# Visual Basic: ReadOnly Property SupportedActions As Ar

我是一名业余天文学家,我用Delphi和标准为望远镜编写驱动程序 首先,我要特别感谢大卫·赫弗南,他在过去的两个月里给了我很多帮助。我在编写驱动程序方面取得了很大的进步,并且有一个评委:“Conform”,一个测试驱动程序所有兼容性的程序。起初情况很糟糕,现在我走上了好的道路。最后一个真正未解决的问题是
string
ArrayList
。 Ascom望远镜驱动程序的文档具有以下属性:

C#

Visual Basic:

ReadOnly Property SupportedActions As ArrayList
Get
Visual C++

property ArrayList^ SupportedActions {
  ArrayList^ get ();
}
字段值
包含受支持操作名称的字符串数组列表(SafeArray集合)。已选择数组列表集合作为操作名称的载体,以便客户端更容易确定是否支持特定操作。通过Contains方法很容易做到这一点。由于集合也是可数的,因此很容易使用诸如For Each。。。为了在不必关心hom的情况下对会员进行操作,许多会员都在集合中。

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

因此,我尝试创建一个自动化对象:

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

错误.NET-异常:System.InvalidCastException:无法在类“System.Collections.ArrayList”的类型中强制转换类型为“System.\u ComObject”的COM对象。表示COM组件的类型实例,不能强制转换为不同于表示COM组件的类型;但是,它们可以在接口中强制转换,直到底层COM组件负责接口IID的调用
QueryInterface

中文或古希腊语对我来说更为明显。 我唯一发现的是在regedit中:

再次感谢你的帮助。 仅限您观看,一张用我的望远镜和一些自制程序制作的照片:


解决方案非常简单!!!我在网页上找到的。您想从.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#。

你为什么不改用TStringList呢?当Delphi有相当多合适的等效对象时,不要尝试使用.NET对象。看看
TList
(Delphi相当于
ArrayList
)、
TList
TObjectList
TObjectList
TStringList
,仅举几个例子。你真正不知道的是你的目标是什么。您有一个.net组件需要从Delphi中使用吗?是这样吗?不知道为什么不直接使用C#。@Rudy如果组件是.net组件,那么使用Delphi类会有什么帮助。这只会导致镜像问题。Delphi可以使用TStringList,但.net代码不能。您好,我认为测试驱动程序的程序会等待类型为
System.Collections.ArrayList
的组件。在驱动程序的另一部分中,我能够将IEnumerator与:
importlib(“mscorlib.tlb”)。我对C#一无所知,我喜欢Delphi:-(.最后,是否可以在Delphi中使用.net组件?
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;