Как передать метод C ++ Builder в интерфейс Delphi - InterateSubtreein Delphi Ctrl Виртуальное древовидное представление - Rad Studio C ++ Builder XE - PullRequest
0 голосов
/ 11 января 2019

Я видел пример в Stackoverflow, переданный по ссылке H.K: пример "виртуального дерева" IterateSubtree в C ++ Xe1-7

См. Пример кода из ответа, представленного H.K в нижней части этого вопроса , Проблема, которую я имею, состоит в том, чтобы использовать это в моем приложении Builder C ++ XE. Я использую его, вызывая этот метод для передачи метода «NodeTypeFinder». Обратите внимание, что мои методы используют VTree в качестве имени, которое я дал компоненту VirtualTreeview - в отличие от примеров H.K. Интерфейс, который я написал, имеет это изменение и является по сути тем же примером H.K.

Мой метод FindData.

VirtualNode __fastcall TfrmMain::findData(PVirtualNode n, String title, int id)
{
  // The result of the IterateSubtree call is the node which caused the
  // callback method to Abort.  See method NodeTypeFinder for detail on the
  // Abort conditions.
  PVirtualNode SearchNode = NULL;
  TVirtualNodeStates nStates;
  rec r;

  r.Caption = title;
  r.ID = id;
  nStates =  TVirtualNodeStates() << vsInitialized;

  SearchNode = VTree->IterateSubtree(n, new TMyVTGetNodeProcRef(NodeTypeFinder), (void*) &r, nStates, false, false);


  //SearchNode = VTree->IterateSubtree(n, NodeTypeFinder,
  //                                            (void*) &r, nStates, false, false);

  return SearchNode;
}

Метод обратного вызова ниже 'NodeTypeFinder'

//---------------------------------------------------------------------------
void  __fastcall TfrmMain::NodeTypeFinder(TBaseVirtualTree *Sender,
 PVirtualNode Node, void* Data, bool &Abort)
{
  // Used to abort the findData method, if criteria is true.
  // Used in conjunction with method findData.
  Abort = ((rec*) Sender->GetNodeData(Node))->Caption == ((rec*) Data)->Caption
       && ((rec*) Sender->GetNodeData(Node))->ID == ((rec*) Data)->ID;
}
//---------------------------------------------------------------------------

Моя проблема в том, что мой компилятор выдает следующую ошибку:

[BCC32 Error] Main.cpp(669): E2235 Member function must be called or its address taken
  Full parser context
    Main.cpp(657): parsing: TVirtualNode * _fastcall TfrmMain::findData(TVirtualNode *,UnicodeString,int) 

Так мог бы я получить совет, как мне преодолеть эту ошибку? Я перепробовал все, что мог придумать - проверил hpp-файлы Delphi на наличие virtualtreeview и всей интерактивной помощи Я применил все исправления / обновления к Rad Studio XE.

Спасибо, Дэрил

Код интерфейса H.K и примеры методов.

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 ...   
}   
...