【问题标题】:example "virtual treeview" IterateSubtree in C++Builder XE-XE7C++Builder XE-XE7 中的示例“虚拟树视图”IterateSubtree
【发布时间】:2015-04-27 16:40:03
【问题描述】:

我需要一个示例如何在 C++ Embarcadero Xe1-7 中使用“虚拟树视图”IterateSubtree

我对这段代码有疑问:

void __fastcall TMyForm::BuSearchClick(TObject *)
{
  MyTreeView->IterateSubtree(NULL, SearchDataSomeId, (void*)&PNodeData, TVirtualNodeStates(), false, false);
}

void __fastcall TMyForm::SearchDataSomeId(TBaseVirtualTree*, PVirtualNode Node, void *Data, bool &Abort)
{
}

编译器给出以下错误:

[bcc32 Error] MyFile.cpp(363): E2034 Cannot convert 'void (_fastcall * (_closure )(TBaseVirtualTree *,TVirtualNode *,void *,bool &))(TBaseVirtualTree *,TVirtualNode *,void *,bool &)' to '_di_TVTGetNodeProc'

【问题讨论】:

  • 您应该格式化代码,以便清楚什么是文本,什么是代码。
  • “C++ embarcadero Xe1-7”什么?
  • 对不起罗德里戈·戈麦斯。现在可以了吗?
  • @RodrigoGómez 我修正了格式。
  • 这里还有更多您没有向我们展示的代码。特别是,我们需要知道_di_TVTGetNodeProc 是什么。

标签: c++builder virtualtreeview


【解决方案1】:

您正在尝试使用 Delphi/C++Builder 调用的方法指针或 __closure。 Virtual Treeview 需要一个匿名方法。详情请见here

认为在 C++Builder 中创建匿名方法涉及从 TProc 继承子类并实现 Invoke 方法,但它似乎记录得很差。

如果子类化 TProc 不起作用或太难弄清楚,我可以想到几个选项:

  • 破解 Virtual Treeview 源以创建采用方法指针的 IterateSubtree 重载。
  • 在 Stack Overflow 上提出一个新问题,希望其他人知道如何在 C++Builder 中创建 Delphi 匿名方法。

【讨论】:

【解决方案2】:

非常感谢`

我找到了解决办法

typedef void (*TIterateSubtreeCallBack)(TBaseVirtualTree*, PVirtualNode Node, void *_Data, bool &Abort);   

class TMyVTGetNodeProcRef : public TCppInterfacedObject<TVTGetNodeProc>    
{
private:   
  TIterateSubtreeCallBack callback;   
public:   
  TMyVTGetNodeProcRef(TIterateSubtreeCallBack _callback) : callback(_callback) {}    
  INTFOBJECT_IMPL_IUNKNOWN(TInterfacedObject);   

  void __fastcall Invoke(TBaseVirtualTree* Sender, TVirtualNode *Node, void *Data, bool &Abort)   
  {   
    return callback(Sender, Node, Data, Abort);   
  }   
};   

void __fastcall TMyForm::BuSearchClick(TObject *)   
{   
  Node= MyTreeView->IterateSubtree(NULL, new TMyVTGetNodeProcRef(SearchDataId), (void*)&PNodeData, TVirtualNodeStates(), false, false);   
}   

void TMyForm::SearchDataId(TBaseVirtualTree*Tr, PVirtualNode Node, void *_Data, bool &Abort)   
{   
 put my code ...   
}   
//---------------------------------------------------------------------------

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多