我试图在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。
答案 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}}在现代德尔福):
Variant
表达式。这回答了原来的“为什么我们不能......”的问题。Variant
类型的文档建议使用直接类型转换语法对其进行转换。
stylesheet := IInterface( document.styleSheets.item(0) ) as IHTMLStyleSheet;
如果愿意,您甚至可以使用http://docwiki.embarcadero.com/Libraries/XE2/en/System.Variants.VarType使用(过度?)防御性编程来检查您是否获得varUnknown
或varDispatch
,然后再尝试将IUnknown
移出返回值。
PS。这个问题现在似乎是重复的。