Bekomme CTreeCtrl nicht auf

Olaf Lehmann

Mitglied
Ich hab mir jetzt eine andere Methode ausgemacht wies vielleicht auch gehen könnte:

Ich lege von vornherein die Baumstruktur - aber unsichtbar an.
Wenn der Anwender auf den Ladeschalter drückt geht die Dateiauswahlbox an. Nach der Auswahl werden nur die Fahrernamen und Rundenzeiten aus der Replaydatei gelesen und in die Baumstruktur - geschrieben. Der Dateiname und Pfad ders Replays wird gemerkt. Dann wird die Replaydatei geschlossen und die Baumstruktur sichtbar gemacht. Dann ist der "Schaltercode" zu Ende.
Dann wählt der Anwender in der Baumstruktur eine Runde aus. Dieser Doppelklick in der Baumstruktur bewirkt das nochmalige Öffnen des gemerkten Replays zum Einlesen der eigentlichen Replaydaten der Runde entsprechend der Baumstrukturauswahl. Und zum Schluss muss die Baumstruktur wieder unsichtbar gemacht werden.

Nun weiss ich aber nicht: Wie mache ich denn ein unsichtbares Steuerelement sichtbar und umgekehrt.
Die Srukturansicht heißt: IDC_TREE1
Nun dachte ich mir ich schreibe in den "Ladeschaltercode" eine Anweisung, die das sichtbar machen des Baumes bewirkt. Wie mache ich das denn von da aus nun wieder?

In dem Zusammenhang hab ich auch noch ne Frage:
Wenn ich einen Schalterfunktion ohne Parameter habe, wie:
Code:
void CDateiDlg::OnButton44() 
{  ..... }
kann ich den Code des Schalters von einer anderen Funktion aus ausführen, indem ich einfach
Code:
OnButton44();
in die andere Funktion schreibe.

Eine typische Baumstrukturfunktion hat aber Parameter, wie:
Code:
void CDateiDlg::OnClickTree1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
	
	*pResult = 0;
}
Wenn ich nun versuche die Funktion von woanders her aufzurufen, gibt es Fehlermeldungen wegen der Parameter, die er nicht erkennt?

MfG
Olaf
 

MCoder

Erfahrenes Mitglied
Ich lege von vornherein die Baumstruktur - aber unsichtbar an.
Damit meinst du wahrscheinlich, dass du das TreeControl nicht anzeigen willst; warum eigentlich? Es sollte doch reichen, erstmal keine Daten einzufügen und den Baum leer zu lassen.

Nun dachte ich mir ich schreibe in den "Ladeschaltercode" eine Anweisung, die das sichtbar machen des Baumes bewirkt. Wie mache ich das denn von da aus nun wieder?
Ich nun weiß nicht, wie dein Projekt strukturiert ist. Sind TreeControl und Lade-Button auf dem gleichen Fenster angeordnet? Da ich anehme, dass für das TreeControl in dieser Fensterklasse eine Membervariable existiert, kannst du das TreeControl damit steuern.

Wenn ich nun versuche die Funktion von woanders her aufzurufen, gibt es Fehlermeldungen wegen der Parameter, die er nicht erkennt?
Die OnClickTree1-Methode stellt ja über die Parameter den ausgewählten Knoten bereit, den du auch irgendwie bereitstellen müsstest. Schreibe am besten eine separate Methode, der du ein HTREEITEM als Parameter verpasst. Diese kannst du dann in OnClickTree1 und anderswo verwenden.

Gruß
MCoder
 

Olaf Lehmann

Mitglied
Sachen gibts, die gibts einfach nicht:

Wenn ich ich in meinem Project eine Listbox anlege und dafür mit dem Klassenassistenten eine Member Kontrollvariable m_List1 anlege und dann im OnInitDialog schreibe:
Code:
m_List1.
klappt sofort eine Liste auf mit den möglichen Funktionen (AddString, usw...). Alles ist bestens.
Wenn ich das gleiche mit CTreectrl versuche und eine CTreeCtrl-Variable m_Tree1 anlege und unter den obigen Eintrag in den OnInitDialog
Code:
m_Tree1.
schreibe klappt KEINE Liste auf und es funktioniert nichts.

Lege ich ein neues Projekt an, geht es prima.
Lege ich in meinem ursprünglichen Projekt ein zweites CTreeCtrl an ebenso keine Reaktion wie beim ersten.

Ich gebs erstmal auf, sonst dreh ich ab. :eek:
 
Zuletzt bearbeitet:

MCoder

Erfahrenes Mitglied
Lösche einfach mal die .ncb-Datei (Intellisense Datenbank) im Projektorder. Die macht gelegentlich Probleme.

Gruß
MCoder
 

Olaf Lehmann

Mitglied
Hallo MCoder!

Danke für den Tipp! Hat zwar nichts verändert, aber ich hab mittlerweile gemerkt, dass nur die Hilfefensterchen in meinem Projekt nicht aufgehen, aber doch alles funktioniert. Ist ein bisschen nervig, wenn man was Neues ausprobiert, aber naja.

Jetzt siehts schonmal ganz gut aus.:) Die Knoten lassen sich öffnen und schließen. Das Anzeigen und Verbergen des Stammbaumes klappt auch. Letzters muss übrigens sein, weil durch die Telemetrydatenanzeige einschließlich vieler Schalter, Listenfeld, Kontrollfelder jeder Zentimeter des Bildschirms ausgelastet ist und echt nur für den Moment der Rundenauswahl Platz für noch was anderes ist.

Nun wirds wohl werden...Ist halt schwieriger, als ich dachte. Da ich Windowsprogrammierung so nebenbei autodidaktisch lerne, verliere ich manchmal etwas die Kontrolle.

Gruß
Olaf
 

Olaf Lehmann

Mitglied
Hallo,

bin ein ganzes Stück weiter.:) Die Baumsstruktur ist wird mit den richtigen Daten gefüllt.
Mittels
Code:
void CDateiDlg::OnDblclkTree1(NMHDR* pNMHDR, LRESULT* pResult) 
{
CString Variable=m_Tree1.GetItemData(m_Tree1.GetSelectedItem());
	*pResult = 0;

}
kann ich den Inhalt des doppelgeklickten Treeeintrags auslesen und dann weiterverarbeiten. Nun wäre es aber vorteilhafter, wenn ich irgendwie die Position bekommen würde.
In einer Listbox gibt GetCurSel() den Index des ausgewählten Elements zurück. Geht in CTreeCtrl etwas ähnliches? Ich weiss hier ist es schwieriger: Ich müsste wissen, dass in der Wurzel die x.te Verzweigung (entspricht dem Fahrer), in der nächsten Ebene Verzweigung 1 oder 2 (in meinem Falle Trainings- bzw. Rennrunden) und in der dritten Ebene die x.te Runde gewählt wurde.
Dann könnte ich mir die Vergleicherei sparen.

Gruß
Olaf
 
Zuletzt bearbeitet:

MCoder

Erfahrenes Mitglied
Hallo Olaf,

du kannst versuchen, dich via GetParentItem() in der Hierachie nach oben zu hangeln, um alle nötigen Infos einzusammeln. Wenn jemand in der 3. Ebene was ausgewählt hat, ist ja nur interessant, zu welcher Runde und zu welchen Fahrer der Eintrag gehört.

Gruß
MCoder
 

Olaf Lehmann

Mitglied
Hallo MCoder,

danke schön!
Hab schon gemerkt, mittels
Code:
Var=m_Tree1.GetItemData(m_Tree1.GetParentItem(m_Tree1.GetSelectedItem()));
krieg ich auch die vorhergehenden Bezeichnungen raus. Wie ich ich die Indexe rausbekomme weiss ich noch immer nicht...

Gruß
Olaf
 

MCoder

Erfahrenes Mitglied
Hallo Olaf,

sowas wie einen Index gibt es beim TreeControl nicht; einen fortlaufende Numerierung macht bei einer Baumstruktur auch wenig Sinn. Jeder Knoten wird durch einen eindeutigen HTREEITEM identifiziert. Spezielle Daten pro Knoten können über SetItemData() zugewiesen werden, also etwa auch Zeiger auf Klassenobjekte oder Strukturen, falls komplexere Daten vorgehalten werden soll. Wie ich in deinem Code sehe, hast du ja da schon irgendeinen Text zugewiesen ?

Gruß
MCoder
 

Olaf Lehmann

Mitglied
Hallo MCoder,

SetItemData ist gut. So kann man ja quasi jeden Item unsichtbare Werte zuweisen, die man manchmal besser verwerten kann als die sichtbaren.:)
Ja die Daten (Fahrernamen/Anzeige ob Training oder Rennen/Rundenzeiten) gelangen schon alle perfekt mittels InsertItem in den Baum...

Es geht nun recht flott voran.

Gruß
Olaf