Problem mit Tree-View Control/Klassenattribut



  • Ich habe derzeit ein ganz merkwürdiges Problem, das wahrscheinlich gleichermaßen einfach zu lösen ist. Ich komme allerdings nicht drauf.

    Ich habe eine Klasse TreeView, die die Einträge eine Tree-View Control in meinem Dialog verwaltet. Diese Klasse hat in der Definition das Attribut:

    HTREEITEM entities;
    

    Im Konstruktor werden dann einige Daten ausgelesen und die Message TVM_INSERTITEM an die Control abgeschickt. Die gibt ja als Rückgabewert den Handle zu dem Item des Tree-Views zurück, also mache ich folgendes:

    entities = (HTREEITEM)SendDlgItemMessage(tree_hwnd, IDC_TREE, TVM_INSERTITEM, 0, (LPARAM)&tree_node);
    

    Überprüfe ich den Wert von entities, dann komme ich auf nicht Null. Wenn ich innerhalb des KOnstruktors damit weiterarbeite, klappt auch alles wunderbar.

    Ich habe jetzt aber eine weitere Methode, die jeweils ein neues Element unter diesem Element entities einfügen soll. Mir ist aber aufgefallen, dass das nicht mehr geht, und zwar weil entities innerhalb dieser Methode anscheinend NULL ist. Dabei müsste das Attribut, aus dem Konstruktor gespeichert, doch mit der anderen Methode wieder abrufbar sein, oder?

    Was mache ich hier falsch?



  • Kannst du mal bitte etwas zusammenhängenden Code zeigen? (besonders wichtig ist hierbei die Frage, wo du dein HTREEITEM entities; stehen hast ;))



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Klar, kein Problem. Sorry für falsches Forum, übrigens.

    Im folgenden Code tritt das Problem in der Methode AddEntity auf. Und, ja, ich rufe auch wirklich dieselbe Instanz auf, keine andere.

    class TreeView
    {
    public:
    	TreeView() { };
    	TreeView(HWND hwnd);
    	~TreeView();
    
    	void AddEntity();
    
    private:
    	TVINSERTSTRUCT tree_node;
    	HTREEITEM root;
    	HTREEITEM entities;
    	HTREEITEM events;
    	HWND tree_hwnd;
    };
    
    TreeView::TreeView(HWND hwnd) {
    	tree_hwnd = hwnd;
    
    	//insert root
    	tree_node.hParent = NULL;
    	tree_node.hInsertAfter = TVI_ROOT;
    	tree_node.itemex.mask = TVIF_TEXT;
    	tree_node.itemex.pszText = "THN File"/*theTHNExporter.ip->GetCurFileName()*/;
    	root = (HTREEITEM)SendDlgItemMessage(tree_hwnd, IDC_TREE, TVM_INSERTITEM, 0, (LPARAM)&tree_node); 
    
    	//insert entities
    	tree_node.hParent = root;
    	tree_node.hInsertAfter = TVI_LAST;
    	tree_node.itemex.pszText = "entities";
    	entities = (HTREEITEM)SendDlgItemMessage(tree_hwnd, IDC_TREE, TVM_INSERTITEM, 0, (LPARAM)&tree_node);
    
    	//expand root
    	SendDlgItemMessage(tree_hwnd, IDC_TREE, TVM_EXPAND, TVE_EXPAND, (LPARAM)root);
    }
    
    void TreeView::AddEntity() {
        //Die folgende Bedingung ist nie wahr!
    	if (entities != NULL)
    		MessageBox(NULL, "Entity tree node added!", "Note", MB_OK);
    
    	tree_node.hParent = entities;
    	tree_node.hInsertAfter = TVI_LAST;
    	tree_node.itemex.pszText = "New Entity";
    	SendDlgItemMessage(tree_hwnd, IDC_TREE, TVM_INSERTITEM, 0, (LPARAM)&tree_node);
    
    	//expand entities
    	SendDlgItemMessage(tree_hwnd, IDC_TREE, TVM_EXPAND, TVE_EXPAND, (LPARAM)entities);
    }
    

    Möglicherweise wichtig ist vielleicht auch, dass die Klasse TreeView als Eigenschaft einer weiteren Klasse initialisiert wird. Von dieser Klasse werden auch Konstruktor und oben genannte Methode der Klasse TreeView aufgerufen. Da sieht es so aus:

    class THNFile
    {
    public:
    	THNFile();
    	~THNFile();
    
    	void SetNodes(HWND hwnd);
    	void AddEntity();
    
    private:
    	TreeView tree;
    /*.....*/
    };
    
    void THNFile::SetNodes(HWND hwnd) {
    	TreeView tree(hwnd);
    }
    
    void THNFile::AddEntity() {
    	tree.AddEntity();
    }
    


  • Sniffman schrieb:

    class THNFile
    {
    public:
    	THNFile();
    	~THNFile();
    	
    	void SetNodes(HWND hwnd);
    	void AddEntity();
    
    private:
    	TreeView tree;
    /*.....*/
    };
    
    void THNFile::SetNodes(HWND hwnd) {
    	TreeView tree(hwnd);
    }
    
    void THNFile::AddEntity() {
    	tree.AddEntity();
    }
    

    Und es sind tatsächlich zwei verschiedene Instanzen - SetNodes() arbeitet mit einer lokalen Variablen 'tree', AddEntity() mit der Membervariable 'THNFile::tree' (letztere wurde per Default-Ctor erstellt). Vielleicht solltest du der TreeView()-Klasse eine Methode SetNodes spendieren, dann kann das THNFile noch nachträglich die Tree-Nodes justieren.



  • Tatsächlich! Welch ein Anfängerfehler. 😉

    Na, jedenfalls schönen Dank dafür. Jetzt sollte es leicht sein, die Sache zu beheben.


Anmelden zum Antworten