ERLEDIGT
JA
JA
ANTWORTEN
26
26
ZUGRIFFE
874
874
EMPFEHLEN
-
04.08.08 12:05 #1
- Registriert seit
- Oct 2007
- Beiträge
- 56
Hallo,
brauche zum ersten Mal eine Baumstruktur und bekomme das Ding nicht auf.
Die Baumstruktur soll erst an einer bestimmten Stelle erscheinen und nicht bereits beim Programmstart sichtbar sein.
Wenn ich beispielsweise einen CFileDialog öffne, schreibe ich einfach:
und schon wird das Ding angezeigt.Code :1
CFileDialog m_dlgFile(TRUE, NULL, NULL, OFN_PATHMUSTEXIST | OFN_HIDEREADONLY , NULL );
Bei:
...Code :1 2 3
CTreeCtrl pTreeCtrl; HTREEITEM Wurzel=pTreeCtrl.InsertItem("Wurzel",NULL); HTREEITEM Kind1=pTreeCtrl.InsertItem("Kind1",Wurzel);
wird nichts angezeigt. Hinter pTreeCtrl werden keine Klammern akzeptiert, in die ich eventuell TRUE eingeben könnte.
danach wird ebenfalls nicht akzeptiert.Code :1
pTreeCtrl.DoModal();

P.S.: Ich arbeite mit Visual C++6.0 und ohne Dokument/Ansicht-Architektur.
Gruß
Olaf
-
CTreeCtrl ist kein Dialog sondern ein Steuerelement und daher anderes zu behandeln. Du musst das Fenster erst mal erzeugen: pTreeCtrl.Create( ... ).
Anzeigen oder Ausblenden erfolgt dann mit der Methode ShowWindow.
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
04.08.08 14:10 #3
- Registriert seit
- Oct 2007
- Beiträge
- 56
Auwiea, diesmal ist es ja wirklich wie schwimmen im Teer...
Code :1 2 3 4 5 6 7 8
CTreeCtrl pTreeCtrl; CRect rectDummy; rectDummy.SetRectEmpty(); pTreeCtrl.Create(WS_CHILD | WS_VISIBLE | WS_BORDER , rectDummy, this, 1); HTREEITEM Wurzel=pTreeCtrl.InsertItem("Wurzel",NULL); HTREEITEM Kind1=pTreeCtrl.InsertItem("Kind1",Wurzel); pTreeCtrl.ShowWindow(SW_SHOW);
müsste dann nicht irgendetwas auf dem Bildschirm zu sehen sein?
Gruß
Olaf
-
"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
04.08.08 17:55 #5
- Registriert seit
- Oct 2007
- Beiträge
- 56
Code :1 2 3 4 5 6
CTreeCtrl pTreeCtrl; pTreeCtrl.Create(WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(100,20,300,700), this, 1); HTREEITEM Wurzel=pTreeCtrl.InsertItem("Wurzel",NULL); HTREEITEM Kind1=pTreeCtrl.InsertItem("Kind1",Wurzel); pTreeCtrl.ShowWindow(SW_SHOW); UpdateWindow();
Immerhin zeigt das nun etwas an. Nämlich das Wort Wurzel.
Aber nun gibts Fragen über Fragen:
Wieso sehe ich keine Baumstruktur?
Wenn ich auf das Wort "Wurzel" klicke oder doppelklicke, sollte sich dann nicht die darunterliegende Ebene öffnen, also "Kind1" erscheinen?
Sollte der Stammbaum nicht automatisch warten bis ich ein Element ausgewählt habe? Ist das nicht bei dergleichen Stammbäumen so üblich?
Muss man das etwa alles selber programmieren?
Kennt jemand ein verständliches Tutorial zu dem Problem/den Problemen? Mit meinem Buch von Susanne Wigard komme ich überhaupt nicht klar (nicht nur zu diesem Thema).
Danke
OlafGeändert von Olaf Lehmann (04.08.08 um 17:57 Uhr)
-
"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
04.08.08 20:07 #7
- Registriert seit
- Oct 2007
- Beiträge
- 56
Der Stammbaum soll an einer bestimmten Stelle in einer Funktion, die durch Mausklick auf einen Button ausgelöst wird, warten bis ich aus dem Stammbaum etwas ausgewählt habe und nicht vorher einfach fortfahren den nachfolgenden Code auszuführen.Zitat von Olaf Lehmann
Sollte der Stammbaum nicht automatisch warten bis ich ein Element ausgewählt habe?
Was meinst du damit?
Durch Hinzunahme der drei Styles erscheint jetzt das Plus.
Wenn ich darauf klicke erscheint die untere Ebene aber noch nicht.
Muss ich dazu zusätzlich CTreeView benutzen?
MfG
Olaf
-
CTreeView brauchst du nicht noch zusätzlich. Es hat hinsichtlich der Baumstruktur keine anderen oder weitergehenden Funktion als CTreeCtrl. Es erzeugt nur ein Ansichtsfenster, das in SDI- oder MDI-Projekten verwendet werden kann.
Warum die nächste Ebene nicht angezeigt wird, ist mir nicht klar. Der Code zum Erzeugen der Items ist korrekt. Evt. zeigst du mal etwas mehr.
Die Sache mit dem Warten, ist mir leider noch viel klarer geworden. Das TreeCtrl nimmt die Daten für die Baumstruktur auf und visualisiert sie. Beim Auswählen von Elementen oder dem Auf- bzw. Zuklappen von Hierarchien werden Events ausgelöst, die man bei Bedarf behandeln kann. Weitergehende Funktionalitäten gehören nicht zum TreeCtrl und ich wüsste auch nicht wozu.
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
05.08.08 10:06 #9
- Registriert seit
- Oct 2007
- Beiträge
- 56
Morgen MCoder!
Ich glaub wenn ich jetzt mehr Code hier poste, das führt nicht weiter. Der ganze Code unter dem Button ist über 1000 Zeilen lang.
Ich versuche mal auf die Schnelle den eigentlichen Hintergrund aufzuhellen:
Es handelt sich um ein Telemetryprogramm (dasselbe zu dem ich vor Monaten schon mal paar Fragen gestellt hatte). Das liest aus einem Replay Telemetrydaten wie Drehzahl, Gang, Leistung, usw. aus und stellt die Daten dann graphisch auf die Runde bezogen dar.
Nun gibt es einen Schalter "Laden". Drücke ich auf diesen Schalter geht erstmal eine Dateiauswahlbox auf. Darin wähle der Anwender das entsprechende Replay aus. Nach der Auswahl werden die Telemetrydaten eingelesen (und zwar deesjenigen Fahrers, der das Replay gespeichert hat - und zwar ALLE seine gefahrenen Runden. SELBSTVERSTÄNDLICH wird solange der Anwender in der Dateiauswahlbox keine Auswahl getroffen hat NiCHT der nachfolgende "Schaltercode" ausgeführt, sondern erst nach der Auswahl damit fortgefahren. Das funktioniert alles schon perfekt. Aber nur mit den Daten eines Fahrers nämlich desjenigen, der das Replay gespeichert hat.
Nun will ich aber auch dier Daten der anderen Fahrer anzeigen. Hierzu müssen nachdem das Replay vom Anwender ausgewählt worden ist, erstmal alle Fahrernamen und zu jedem Fahrer die zugehörigen Rundenzeiten eingelesen werden. Dannach muss eine Auswahl getroffen werden, da das Einlesen aller Runden aller Fahrer nicht sinnvoll wäre (und Stunden dauern würde). Hier soll dann die Baumstruktur ins Spiel kommen. Der Stammbaum soll in der obersten Ebene die Fahrernamen anzeigen und eine Ebene tiefer (wenn ich auf das Plus klicke) die Rundenzeiten. Wenn ich dann auf eine Rundenzeit klicke sollen die Telemetrydaten dieser einen Runde des ausgewählten Fahrers eingelesen werden.
Nun ist es bisher aber so, dass die Baumstruktur aufgeht und die Fahrernamen anzeigt (praktisch ist das natürlich im Moment noch nicht so programmiert - bis jetzt steht da ja probehalber erstmal "Wurzel"). Während der Anwender versucht, dort etwas auszuwählen und dazu braucht er ja ein paar Sekunden, wird bereits der nachfolgende "Schaltercode" ausgeführt, anstatt zu warten bis überhaupt klar ist, welche Runde welches Fahrers eingelesen werden soll. Das ist natürlich nicht im Sinne des Erfinders.
Hier nochmal der Vergleich mit CFile. Nachdem die Dateiauswahlbox aufgegangen ist, wird ja auch erst dann der nachfolgende Code ausgeführt, wenn eine Datei vom Anwender ausgewählt wurde, da in der Regel danach auf die ausgewählte Datei und keine andere zugegriffen werden soll.
Das zweite Problem ist wie gesagt, dass ich die Pluszeichen nicht öffnen kann und somit nicht in die darunterliegende Ebene (Rundenzeiten) gelange.
So, ich hoffe ich konnte nun klarstellen, was ich meine...
MfG
Olaf
P.S.: Ich erwähne nochmal: VisualC++ 6.0. Vielleicht ist da was anders als mit moderneren Compilern?Geändert von Olaf Lehmann (05.08.08 um 10:10 Uhr)
-
Hallo Olaf,
du brauchst natürlich nicht alle Daten in einem Rutsch einlesen, sondern nur in Ahängigkeit von der Auswahl. Das heißt, du schreibst erst mal nur die Fahrernahmen in den Baum und dazu jeweils einen Dummy-Child, damit das Plus sichtbar wird. Sobald der Nutzer die Hierarchie öffnen will, wird eine Notification Message (TVN_ITEMEXPANDING) gesendet. Dafür musst du einen Eventhandler einrichten, in dem du dann die Rundenzeiten einlesen kannst (jweils wieder mit Dummy-Child für's Pluszeichen). Wird dann da die Hierarchie geöffnet, werden dann die Telemetrydaten ebenso gelesen.
Bei deinen zweiten Problem kann ich dir leider nicht helfen, da ich in deinem Codefragment keinen Fehler erkennen kann. Das Problem liegt daher möglicherweise an einer anderen Stelle. Verzichte mal auf den ShowWindow()-Aufruf; mit WS_VISIBLE wird das Control sowieso sichtbar.
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
05.08.08 18:06 #11
- Registriert seit
- Oct 2007
- Beiträge
- 56
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:
kann ich den Code des Schalters von einer anderen Funktion aus ausführen, indem ich einfachCode :1 2
void CDateiDlg::OnButton44() { ..... }
in die andere Funktion schreibe.Code :1
OnButton44();
Eine typische Baumstrukturfunktion hat aber Parameter, wie:
Wenn ich nun versuche die Funktion von woanders her aufzurufen, gibt es Fehlermeldungen wegen der Parameter, die er nicht erkennt?Code :1 2 3 4 5 6
void CDateiDlg::OnClickTree1(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen *pResult = 0; }
MfG
Olaf
-
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.
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.
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"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
06.08.08 13:53 #13
- Registriert seit
- Oct 2007
- Beiträge
- 56
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:
klappt sofort eine Liste auf mit den möglichen Funktionen (AddString, usw...). Alles ist bestens.Code :1
m_List1.
Wenn ich das gleiche mit CTreectrl versuche und eine CTreeCtrl-Variable m_Tree1 anlege und unter den obigen Eintrag in den OnInitDialog
schreibe klappt KEINE Liste auf und es funktioniert nichts.Code :1
m_Tree1.
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.
Geändert von Olaf Lehmann (06.08.08 um 13:55 Uhr)
-
Lösche einfach mal die .ncb-Datei (Intellisense Datenbank) im Projektorder. Die macht gelegentlich Probleme.
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
06.08.08 18:27 #15
- Registriert seit
- Oct 2007
- Beiträge
- 56
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
Ähnliche Themen
-
CTreeCtrl->GetTooltips()->SetDelayTime geht nicht
Von tt5 im Forum C/C++Antworten: 0Letzter Beitrag: 28.11.06, 14:14 -
CTreeCtrl, deselektiertes Item kann nachher nicht mehr selektiert werden
Von tt5 im Forum VisualStudio & MFCAntworten: 2Letzter Beitrag: 07.09.06, 10:45 -
CTreeCtrl in CMDIChildFrame - wird nicht erstellt/angezeigt
Von pibr im Forum VisualStudio & MFCAntworten: 8Letzter Beitrag: 13.09.05, 10:23 -
Bekomme das nicht hin ...
Von belisto im Forum Vektor-ProgrammeAntworten: 1Letzter Beitrag: 23.02.05, 16:49 -
Bekomme XP nicht drauf!!
Von Gullynbg im Forum Microsoft WindowsAntworten: 1Letzter Beitrag: 18.11.02, 09:15





Zitieren

Login






