Anonymous
Virtualtreeview reditlink Проблема назначения в C ++
Сообщение
Anonymous » 13 авг 2025, 13:25
У меня есть проблемы с reditlink назначить в TvirtualStringtree и Embarcadero C ++ Builder. Когда я пытаюсь назначить новый класс редактора, работает только редактор по умолчанию.
Only Oructor вызывается в событии CreateEditor. Редактор Affer создан и назначен EditLink, на самом деле мой пользовательский редактор больше не называется или даже удален. Работает только встроенный редактор. < /P>
Код: Выделить всё
class TFormMain : public TForm, public EcuCommListenerItem
{
__published: // IDE-managed Components
TVirtualStringTree *VST;
void __fastcall VSTCreateEditor(TBaseVirtualTree *Sender, PVirtualNode Node,
TColumnIndex Column, IVTEditLink *EditLink);
private: // User declarations
public: // User declarations
__fastcall TFormMain(TComponent* Owner);
};
typedef struct {
unsigned Id;
String Caption;
}MyRecord;
//---------------------------------------------------------------------------
__fastcall TFormMain::TFormMain(TComponent* Owner)
: TForm(Owner),
{
VST->NodeDataSize = sizeof(MyRecord);
VST->RootNodeCount = 3;
}
class TPropertyEditor : public TInterfacedObject, public IVTEditLink
{
private:
TWinControl* m_Edit;
TVirtualStringTree* m_Tree;
PVirtualNode m_Node;
int m_Column;
public:
__fastcall TPropertyEditor() //:
IVTEditLink(),
TInterfacedObject()
{
DEBUG_FUNC("\n");
m_Edit = nullptr;
m_Tree = nullptr;
m_Node = nullptr;
m_Column = 0;
}
__fastcall ~TPropertyEditor() {
DEBUG_FUNC("\n");
delete m_Edit;
}
HRESULT __stdcall QueryInterface(const GUID& IID, void **Obj) override {
return GetInterface(IID, Obj) ? S_OK : E_NOINTERFACE;
}
ULONG __stdcall AddRef() override {
return TInterfacedObject::_AddRef();
}
ULONG __stdcall Release() override {
return TInterfacedObject::_Release();
}
bool __stdcall BeginEdit() override {
DEBUG_FUNC("\n");
m_Edit->Show();
static_cast(m_Edit)->DroppedDown = true;
m_Edit->SetFocus();
return true;
}
bool __stdcall CancelEdit() override {
DEBUG_FUNC("\n");
m_Edit->Hide();
return true;
}
bool __stdcall EndEdit() override {
DEBUG_FUNC("\n");
m_Edit->Hide();
m_Tree->SetFocus();
return true;
}
bool __stdcall PrepareEdit(TBaseVirtualTree* Tree, PVirtualNode Node, Virtualtrees::Types::TColumnIndex Column) override {
DEBUG_FUNC("PrepareEdit\n");
m_Tree = reinterpret_cast(Tree);
m_Node = Node;
m_Column = Column;
delete m_Edit;
m_Edit = nullptr;
m_Edit = new TComboBox( Tree );
m_Edit->Parent = Tree;
m_Edit->Visible = false;
static_cast(m_Edit)->Items->Add(L"Option 1");
static_cast(m_Edit)->Items->Add(L"Option 2");
static_cast(m_Edit)->Items->Add(L"Option 3");
return true;
}
void __stdcall ProcessMessage(Winapi::Messages::TMessage &Message) override {
m_Edit->WindowProc(Message);
}
void __stdcall SetBounds(const System::Types::TRect &R) override {
//FTree.Header.Columns.GetColumnBounds(FColumn, Dummy, R.Right);
DEBUG_FUNC("\n");
m_Edit->BoundsRect = R;
}
};
void __fastcall TFormMain::VSTCreateEditor(TBaseVirtualTree *Sender, PVirtualNode Node,
TColumnIndex Column, IVTEditLink *EditLink)
{
EditLink = new TPropertyEditor();
DEBUG_FUNC("\n");
}
< /code>
edit < /p>
Я нашел прототип VirtualTreeView OncreateEditorEvent, и он отличается от создания IDE: < /p>
__interface DELPHIINTERFACE IVTEditLink;
typedef System::DelphiInterface _di_IVTEditLink;
typedef void __fastcall (__closure *TVTCreateEditorEvent)(TBaseVirtualTree* Sender, PVirtualNode Node, Virtualtrees::Types::TColumnIndex Column, /* out */ _di_IVTEditLink &EditLink);
Как его использовать правильно?
Подробнее здесь:
https://stackoverflow.com/questions/797 ... oblem-in-c
1755080731
Anonymous
У меня есть проблемы с reditlink назначить в TvirtualStringtree и Embarcadero C ++ Builder. Когда я пытаюсь назначить новый класс редактора, работает только редактор по умолчанию. Only Oructor вызывается в событии CreateEditor. Редактор Affer создан и назначен EditLink, на самом деле мой пользовательский редактор больше не называется или даже удален. Работает только встроенный редактор. < /P> [code]class TFormMain : public TForm, public EcuCommListenerItem { __published: // IDE-managed Components TVirtualStringTree *VST; void __fastcall VSTCreateEditor(TBaseVirtualTree *Sender, PVirtualNode Node, TColumnIndex Column, IVTEditLink *EditLink); private: // User declarations public: // User declarations __fastcall TFormMain(TComponent* Owner); }; typedef struct { unsigned Id; String Caption; }MyRecord; //--------------------------------------------------------------------------- __fastcall TFormMain::TFormMain(TComponent* Owner) : TForm(Owner), { VST->NodeDataSize = sizeof(MyRecord); VST->RootNodeCount = 3; } class TPropertyEditor : public TInterfacedObject, public IVTEditLink { private: TWinControl* m_Edit; TVirtualStringTree* m_Tree; PVirtualNode m_Node; int m_Column; public: __fastcall TPropertyEditor() //: IVTEditLink(), TInterfacedObject() { DEBUG_FUNC("\n"); m_Edit = nullptr; m_Tree = nullptr; m_Node = nullptr; m_Column = 0; } __fastcall ~TPropertyEditor() { DEBUG_FUNC("\n"); delete m_Edit; } HRESULT __stdcall QueryInterface(const GUID& IID, void **Obj) override { return GetInterface(IID, Obj) ? S_OK : E_NOINTERFACE; } ULONG __stdcall AddRef() override { return TInterfacedObject::_AddRef(); } ULONG __stdcall Release() override { return TInterfacedObject::_Release(); } bool __stdcall BeginEdit() override { DEBUG_FUNC("\n"); m_Edit->Show(); static_cast(m_Edit)->DroppedDown = true; m_Edit->SetFocus(); return true; } bool __stdcall CancelEdit() override { DEBUG_FUNC("\n"); m_Edit->Hide(); return true; } bool __stdcall EndEdit() override { DEBUG_FUNC("\n"); m_Edit->Hide(); m_Tree->SetFocus(); return true; } bool __stdcall PrepareEdit(TBaseVirtualTree* Tree, PVirtualNode Node, Virtualtrees::Types::TColumnIndex Column) override { DEBUG_FUNC("PrepareEdit\n"); m_Tree = reinterpret_cast(Tree); m_Node = Node; m_Column = Column; delete m_Edit; m_Edit = nullptr; m_Edit = new TComboBox( Tree ); m_Edit->Parent = Tree; m_Edit->Visible = false; static_cast(m_Edit)->Items->Add(L"Option 1"); static_cast(m_Edit)->Items->Add(L"Option 2"); static_cast(m_Edit)->Items->Add(L"Option 3"); return true; } void __stdcall ProcessMessage(Winapi::Messages::TMessage &Message) override { m_Edit->WindowProc(Message); } void __stdcall SetBounds(const System::Types::TRect &R) override { //FTree.Header.Columns.GetColumnBounds(FColumn, Dummy, R.Right); DEBUG_FUNC("\n"); m_Edit->BoundsRect = R; } }; void __fastcall TFormMain::VSTCreateEditor(TBaseVirtualTree *Sender, PVirtualNode Node, TColumnIndex Column, IVTEditLink *EditLink) { EditLink = new TPropertyEditor(); DEBUG_FUNC("\n"); } < /code> edit < /p> Я нашел прототип VirtualTreeView OncreateEditorEvent, и он отличается от создания IDE: < /p> __interface DELPHIINTERFACE IVTEditLink; typedef System::DelphiInterface _di_IVTEditLink; typedef void __fastcall (__closure *TVTCreateEditorEvent)(TBaseVirtualTree* Sender, PVirtualNode Node, Virtualtrees::Types::TColumnIndex Column, /* out */ _di_IVTEditLink &EditLink); [/code] Как его использовать правильно? Подробнее здесь: [url]https://stackoverflow.com/questions/79734089/virtualtreeview-editlink-assignment-problem-in-c[/url]