2013-10-21 22 views
1

我试图翻译德尔福此代码C++ Builder中:翻译德尔福VarSupports到C++ Builder中

procedure HandleStyleSheets(const Document: IDispatch); 
var 
    Doc: IHTMLDocument2;      // document object 
    StyleSheets: IHTMLStyleSheetsCollection; // document's style sheets 
    SheetIdx: Integer;      // loops thru style sheets 
    OVSheetIdx: OleVariant;     // index of a style sheet 
    StyleSheet: IHTMLStyleSheet;    // reference to a style sheet 
    OVStyleSheet: OleVariant;     // variant ref to style sheet 
    RuleIdx: Integer;       // loops thru style sheet rules 
    Style: IHTMLRuleStyle;     // ref to rule's style 
begin 
    // Get IHTMLDocument2 interface of document 
    if not Supports(Document, IHTMLDocument2, Doc) then 
Exit; 
    // Loop through all style sheets 
    StyleSheets := Doc.styleSheets; 
    for SheetIdx := 0 to Pred(StyleSheets.length) do 
    begin 
    OVSheetIdx := SheetIdx; // sheet index as variant required for next call 
    // Get reference to style sheet (comes as variant which we convert to 
    // interface reference) 
    OVStyleSheet := StyleSheets.item(OVSheetIdx); 
if VarSupports(OVStyleSheet, IHTMLStyleSheet, StyleSheet) then 
begin 
    // Loop through all rules within style a sheet 
    for RuleIdx := 0 to Pred(StyleSheet.rules.length) do 
    begin 
    // Get style from a rule and reset required attributes. 
    // Note: style is IHTMLRuleStyle, not IHTMLStyle, although many 
    // attributes are shared between these interfaces 
    Style := StyleSheet.rules.item(RuleIdx).style; 
    Style.backgroundImage := ''; // removes any background image 
    Style.backgroundColor := ''; // resets background colour to default 
    end; 
    end; 
    end; 
end; 

一切都很好,直到这条线:

if (VarSupports(OVStyleSheet, IID_IHTMLStyleSheet, StyleSheet)) 

据报道:E2285找不到'VarSupports(OleVariant,_GUID,_di_IHTMLStyleSheet)的匹配'

其他所有翻译都很好。任何人都可以帮助我与上述行?

我至今翻译:

DelphiInterface<IHTMLDocument2> Doc;          // document object 
DelphiInterface<IHTMLStyleSheetsCollection> StyleSheets;     // document's style sheets 
int SheetIdx;                // loops thru style sheets 
OleVariant OVSheetIdx;              // index of a style sheet 
DelphiInterface<IHTMLStyleSheet> StyleSheet;        // reference to a style sheet 
OleVariant OVStyleSheet;             // variant ref to style sheet 
int RuleIdx;                // loops thru style sheet rules 
DelphiInterface<IHTMLRuleStyle> Style;          // ref to rule's style 
DelphiInterface<IHTMLStyleSheetRule> StyleSheetRule; 

// Get IHTMLDocument2 interface of document 
if (!Supports(EmbeddedWB1->Document, IID_IHTMLDocument2, Doc)) throw Exception("Not supported"); 

// Loop through all style sheets 
StyleSheets = Doc->styleSheets; 
for (SheetIdx = 0; SheetIdx < StyleSheets->length; SheetIdx++) 
    { 
    OVSheetIdx = SheetIdx;             // sheet index as variant required for next call 
    // Get reference to style sheet (comes as variant which we convert to interface reference) 
    StyleSheets->item(OVSheetIdx, OVStyleSheet); 
    if (VarSupports(OVStyleSheet, IID_IHTMLStyleSheet, StyleSheet)) 
     { 
     // Loop through all rules within style a sheet 
     for (RuleIdx = 0; RuleIdx < StyleSheet->rules->length; RuleIdx) 
      { 
      // Get style from a rule and reset required attributes. 
      // Note: style is IHTMLRuleStyle, not IHTMLStyle, although many 
      // attributes are shared between these interfaces 

      StyleSheet->rules->item(RuleIdx, StyleSheetRule); 
      Style = StyleSheetRule->style; 

      Style->backgroundImage = L""; // removes any background image 
      Style->backgroundColor = L""; // resets background colour to default 
      } 
     } 
    } 
} 

回答

1

的原因编译错误是VarSupports被定义为采取Variant,而你传递一个OleVariant

它看起来好像代码试图将OVStyleSheet分配到IHTMLStyleSheet接口StyleSheet。在C++ Builder中,你应该能够公正分配给它,如

_di_IInterface inter = _di_IInterface(OVStyleSheet); 
StyleSheet = inter; 

如果成功和StyleSheet不为NULL,你应该能够使用StyleSheet。需要注意的是无效的变分配可以抛出异常,所以你可能要来处理(且假定异常也意味着OVStyleSheet不支持IHTMLStyleSheet接口)

此外,C++ Builder中有一个Interface.Supports功能似乎要做VarSupports的工作,只是VarSupports需要一个变体,所以Interface.Supports也需要你自己从OleVariant获取接口。可能是这样的:

di_IInterface inter = _di_IInterface(OVStyleSheet); 
if (inter->Supports(StyleSheet)) 
{ 
    ShowMessage("StyleSheet has been assigned"); 
} 

这个编译,但我没有测试过它。

+0

谢谢,但如果我指定它就像它不能编译 - E2285找不到匹配的操作符_di_IHTMLStyleSheet :: = (OleVariant)' – Coder12345

+0

你必须首先从OleVariant获取接口 - 我已经纠正上面的代码。如前所述,它编译,但我没有功能测试它。 – nachbar