在delphi中有这个VB代码的相关语法吗?

时间:2013-06-20 11:33:26

标签: delphi casting delphi-2010 delphi-xe

我试图在delphi中这样做,但我不确定CTYPE函数。

Dim docStyleSheet As mshtml.IHTMLStyleSheet = CType(doc.styleSheets.item(0), mshtml.IHTMLStyleSheet)
Dim docStyleRules As mshtml.HTMLStyleSheetRulesCollection = CType(docStyleSheet.rules, mshtml.HTMLStyleSheetRulesCollection)

为什么我们不能简单地在delphi中这样做:

stylesheet :=  document.styleSheets.item(0) As IHTMLStyleSheet;

可以在此链接中找到完整代码 https://stackoverflow.com/a/2996819

Tlama,David ... thanx for the correction yes a a vb code。

1 个答案:

答案 0 :(得分:3)

AS。答案被延长了几次,因为越来越多的信息被发现,将问题从“什么是CType功能?”转移出来。到“如何将OleVariant转换为所需的接口类型?”。因此,答案逐渐涵盖了所有这些主题。

因此,您在Microsoft Visual Basic代码中遇到了未知功能。当他遇到一些未知的东西时,该做什么?去谷歌。

带有文字CType MSDN的Google.com在其最佳结果中为我们提供了此链接:http://msdn.microsoft.com/en-us/library/vstudio/4x2877xb.aspx

  

返回显式转换表达式的结果   指定的数据类型,对象,结构,类或接口。   如果没有从表达式到typename定义转换(例如,   从Integer到Date),Visual Basic显示编译时错误消息。

所以我们必须在Delphi中重现类型转换,如果可能的话,最好是编译式类型转换。

带有文字typecast docwiki的Google.com在其最佳结果中为我们提供了此链接:

反过来又为我们提供了另外一个在文本中引用的链接:

所以你有两种语法可供尝试。一个你试过并排除了 - 一个有AS操作员的人。然后尝试另一种直接的类型转换语法。

stylesheet :=  IHTMLStyleSheet( document.styleSheets.item(0) );

有时如果上面的失败,它也有助于进行双重类型转换,Variant -> IUnknown -> certain interface,但在很多情况下,它只是上层代码的冗余版本。

stylesheet :=  IHTMLStyleSheet( IInterface( document.styleSheets.item(0) ) );

好了,既然有人告诉我们源表达式数据类型是OleVariant,我们可以阅读更准确的文档,关于Variant数据类型转换(OleVariant与{{Variant略有不同1}}在现代德尔福):

  • AS运算符适用于类,对象和接口。它不适用于Variant表达式。这回答了原来的“为什么我们不能......”的问题。
  • Variant类型的文档建议使用直接类型转换语法对其进行转换。

stylesheet :=  IInterface( document.styleSheets.item(0) ) as IHTMLStyleSheet;

如果愿意,您甚至可以使用http://docwiki.embarcadero.com/Libraries/XE2/en/System.Variants.VarType使用(过度?)防御性编程来检查您是否获得varUnknownvarDispatch,然后再尝试将IUnknown移出返回值。

PS。这个问题现在似乎是重复的。