C++/MFC - Problem mit Ausgabe: Wert nach setzen von ItemData am CTreeCtrl
Hallo zusammen,
bitte nicht von der Größe des Threads abschrecken lassen. Das Problem ist wahrscheinlich ganz klein, aber ich finde einfach die Lösung nicht, da ich wahrscheinlich immer noch nicht mit den Datentypen und dem casten klar komme.
1. Ich rufe meine Methode DrawNodes auf um im TreeView die ersten Knoten zu zeichnen. Jeder der Knoten bekommt als ItemData den Wert G und dann 1,2,3,4,5.... usw. Mein zweiter Node hat also als ItemData-Wert eine "G2".
Das wurde wie folgt erreicht:
2. Nun nutze ich die Methode OnTvnSelchanged, um den geklickten Node und deren ItemDate-Wert abzuholen. Hier erst einmal die Methode. Darunter beschreibe ich dann was nun geschieht und welche Ausgabe (Fehlerhaft) ich erhalte.
Nachdem ich also nun auf meinen Knoten (G2) gedrückt habe erscheint als Ausgabe (siehe Kommentar: //Test-Ausgabe im Source) folgendes:
Kurz darunter, frage ich ab ob der ItemData-Wert eine "G2" ist. Wenn ja (das ist ja der Fall) soll der Prozedur-Name gespeichert werden.Siehe:
Darunter folgt dann eine Schleife, die nun alle Daten aus Oracle holen soll: Das ist der Source:
Wie man sieht deklariere ich ein hItemSub und mache ein InsertItem. Darunter deklariere ich dann die Var: NodeIdentValue. Sinn soll es sein mein "G2" und die Id des Wertes zusammenzufügen. Ich übergebe also den Wert aus value an die NodeIdentValue. Und dann mache ich ein Inkrement und setze die ID des Datensatzes hinten dran.
Dann setze ich nun meinen neuen ItemData-Wert und gebe mit Trace direkt den Wert von ItemDate für das aktuelle Node einfach im Output aus. Der Output sieht dann bis jetzt, wie folgt aus:
Wenn die Methode am Ende ist, dann wird mit Trace noch "Warte auf Click" ausgegeben. So, und jetzt kommt es.
Ich drücke nun auf den ersten Sub-Node, der hat ja, wie man sehen kann den ItemData-Wert "G21". Jetzt würde man ja denken, dann wenn ich da draufklicke, dass dann in der Ausgabe:
erscheint. Aber genau das passiert eben nicht. Die Ausgabe sieht wie folgt aus:
Es wäre nett, wenn mir jemand sagen kann, warum beim zweiten Klick das hier erscheint:
Vielen Dank im voraus für eure Mühe.
Hallo zusammen,
bitte nicht von der Größe des Threads abschrecken lassen. Das Problem ist wahrscheinlich ganz klein, aber ich finde einfach die Lösung nicht, da ich wahrscheinlich immer noch nicht mit den Datentypen und dem casten klar komme.
1. Ich rufe meine Methode DrawNodes auf um im TreeView die ersten Knoten zu zeichnen. Jeder der Knoten bekommt als ItemData den Wert G und dann 1,2,3,4,5.... usw. Mein zweiter Node hat also als ItemData-Wert eine "G2".
Das wurde wie folgt erreicht:
Code:
HTREEITEM hItem;
hItem = this->InsertItem("Gruppiert nach Prio",3,3);
this->SetItemData(hItem,(DWORD) "G2");
2. Nun nutze ich die Methode OnTvnSelchanged, um den geklickten Node und deren ItemDate-Wert abzuholen. Hier erst einmal die Methode. Darunter beschreibe ich dann was nun geschieht und welche Ausgabe (Fehlerhaft) ich erhalte.
Code:
void CNavTree::OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
//Item-Klick auswerten
HTREEITEM hItem = pNMTreeView->itemNew.hItem;
LPCTSTR value;
value = (LPCTSTR) this->GetItemData(hItem);
//Test-Ausgabe
TRACE("\n");
TRACE("Click-Ausgabe Node-Wert: ");
TRACE(value);
TRACE("\n");
//für Prozedur-Name
_bstr_t m_ProcedureName;
if(this->GetChildItem(this->GetSelectedItem()) == NULL)
{
//Sub-Nodes zeichnen
if(value == "G2")
{
m_ProcedureName = "KENNY$PR_GETERRWITHPRIO";
}
//Nodes zeichnen
try
{
CRec* RS = new CRec();
//RS->Select(theApp.p_MyCN,m_stSQLString);
RS->SelectProcedure(theApp.p_MyCN,m_ProcedureName);
//Prüfen, ob über haupt Daten vorhanden sind, sonst else-Zweig
if(!(RS->pRS->BOF || RS->pRS->EndOfFile))
{
//Auf den ersten Datensatz navigieren
RS->pRS->MoveFirst();
//Mit Schleifen alle Daten bis zum Ende durchgehen
while(!RS->pRS->EndOfFile)
{
//Node Objekte deklarieren, um später
SetItemData ausführen zu können
HTREEITEM hItemSub;
//Icon und Wert aus Datenbank setzen
hItemSub = this->InsertItem((_bstr_t)RS->pRS->Fields->GetItem("VALUE")->Value,3,3,hItem);
//ID an Knoten (ItemData) setzen
_bstr_t NodeIdentValue;
NodeIdentValue = value;
NodeIdentValue += (_bstr_t)
RS->pRS->Fields->GetItem("id")->Value;
this->SetItemData(hItemSub,(DWORD) ((LPCTSTR) NodeIdentValue));
TRACE((LPCTSTR) this->GetItemData(hItemSub));
TRACE("\n");
//zum nächsten DS navigieren
RS->pRS->MoveNext();
}
}
//Es gibt keine Daten
else
AfxMessageBox("Es gibt keine Datensätze, die
angezeigt werden können");
//Pointer löschen
delete RS;
}
catch(_com_error err)
{
_bstr_t str(err.Description());
AfxMessageBox(str);
}
//Expandieren
this->Expand(this->GetSelectedItem(),TVE_EXPAND);
TRACE("Warte auf Click");
TRACE("\n");
TRACE("\n");
}
*pResult = 0;
}
Nachdem ich also nun auf meinen Knoten (G2) gedrückt habe erscheint als Ausgabe (siehe Kommentar: //Test-Ausgabe im Source) folgendes:
Code:
Click-Ausgabe Node-Wert: G2
Kurz darunter, frage ich ab ob der ItemData-Wert eine "G2" ist. Wenn ja (das ist ja der Fall) soll der Prozedur-Name gespeichert werden.Siehe:
Code:
if(value == "G2")
{
m_ProcedureName = "KENNY$PR_GETERRWITHPRIO";
}
Darunter folgt dann eine Schleife, die nun alle Daten aus Oracle holen soll: Das ist der Source:
Code:
//Node Objekte deklarieren, um später
SetItemData ausführen zu können
HTREEITEM hItemSub;
//Icon und Wert aus Datenbank setzen
hItemSub = this->InsertItem((_bstr_t)RS->pRS->Fields->GetItem("VALUE")->Value,3,3,hItem);
//ID an Knoten (ItemData) setzen
_bstr_t NodeIdentValue;
NodeIdentValue = value;
NodeIdentValue += (_bstr_t) RS->pRS->Fields->GetItem("id")->Value;
this->SetItemData(hItemSub,(DWORD) ((LPCTSTR) NodeIdentValue));
TRACE((LPCTSTR) this->GetItemData(hItemSub));
TRACE("\n");
//zum nächsten DS navigieren
RS->pRS->MoveNext();
Wie man sieht deklariere ich ein hItemSub und mache ein InsertItem. Darunter deklariere ich dann die Var: NodeIdentValue. Sinn soll es sein mein "G2" und die Id des Wertes zusammenzufügen. Ich übergebe also den Wert aus value an die NodeIdentValue. Und dann mache ich ein Inkrement und setze die ID des Datensatzes hinten dran.
Dann setze ich nun meinen neuen ItemData-Wert und gebe mit Trace direkt den Wert von ItemDate für das aktuelle Node einfach im Output aus. Der Output sieht dann bis jetzt, wie folgt aus:
Code:
Click-Ausgabe Node-Wert: G2
G21
G22
G23
G24
G25
Warte auf Click
Wenn die Methode am Ende ist, dann wird mit Trace noch "Warte auf Click" ausgegeben. So, und jetzt kommt es.
Ich drücke nun auf den ersten Sub-Node, der hat ja, wie man sehen kann den ItemData-Wert "G21". Jetzt würde man ja denken, dann wenn ich da draufklicke, dass dann in der Ausgabe:
Code:
Click-Ausgabe Node-Wert: G21
erscheint. Aber genau das passiert eben nicht. Die Ausgabe sieht wie folgt aus:
Code:
Click-Ausgabe Node-Wert: îþîþîþîþîþîþîþîþîþîþîþîþL
First-chance exception at 0x77e9bbf3 in Kenny.exe: Microsoft C++ exception: _com_error @ 0x0012f074.
First-chance exception at 0x77e9bbf3 in Kenny.exe: Microsoft C++ exception: _com_error @ 0x0012f1d0.
Es wäre nett, wenn mir jemand sagen kann, warum beim zweiten Klick das hier erscheint:
Code:
îþîþîþîþîþîþîþîþîþîþîþîþL
Vielen Dank im voraus für eure Mühe.
Zuletzt bearbeitet: