Я видел пример в 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 ...
}