tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
26
ZUGRIFFE
874
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Olaf Lehmann Olaf Lehmann ist offline Mitglied Silber
    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:

    Code :
    1
    
    CFileDialog m_dlgFile(TRUE, NULL, NULL, OFN_PATHMUSTEXIST | OFN_HIDEREADONLY , NULL  );
    und schon wird das Ding angezeigt.

    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.

    Code :
    1
    
    pTreeCtrl.DoModal();
    danach wird ebenfalls nicht akzeptiert.


    P.S.: Ich arbeite mit Visual C++6.0 und ohne Dokument/Ansicht-Architektur.

    Gruß
    Olaf
     

  2. #2
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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

  3. #3
    Olaf Lehmann Olaf Lehmann ist offline Mitglied Silber
    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
     

  4. #4
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Zitat Zitat von Olaf Lehmann Beitrag anzeigen
    müsste dann nicht irgendetwas auf dem Bildschirm zu sehen sein?
    Durch die Verwendung von "SetRectEmpty" ist das Fenster zuverlässig nicht sichtbar
    Da müsstest du schon die Größe zuweisen, die das Fenster haben soll.

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  5. #5
    Olaf Lehmann Olaf Lehmann ist offline Mitglied Silber
    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
    Olaf
    Geändert von Olaf Lehmann (04.08.08 um 17:57 Uhr)
     

  6. #6
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Hallo,

    ergänze mal bei Create noch die Styles TVS_HASBUTTONS, TVS_LINESATROOT und TVS_HASLINES. Damit sollte die Struktur auch grafisch sichtbar werden.

    Zitat Zitat von Olaf Lehmann Beitrag anzeigen
    Sollte der Stammbaum nicht automatisch warten bis ich ein Element ausgewählt habe?
    Was meinst du damit?

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  7. #7
    Olaf Lehmann Olaf Lehmann ist offline Mitglied Silber
    Registriert seit
    Oct 2007
    Beiträge
    56
    Zitat von Olaf Lehmann
    Sollte der Stammbaum nicht automatisch warten bis ich ein Element ausgewählt habe?

    Was meinst du damit?
    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.

    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
     

  8. #8
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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

  9. #9
    Olaf Lehmann Olaf Lehmann ist offline Mitglied Silber
    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)
     

  10. #10
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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

  11. #11
    Olaf Lehmann Olaf Lehmann ist offline Mitglied Silber
    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:
    Code :
    1
    2
    
    void CDateiDlg::OnButton44() 
    {  ..... }
    kann ich den Code des Schalters von einer anderen Funktion aus ausführen, indem ich einfach
    Code :
    1
    
    OnButton44();
    in die andere Funktion schreibe.

    Eine typische Baumstrukturfunktion hat aber Parameter, wie:
    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;
    }
    Wenn ich nun versuche die Funktion von woanders her aufzurufen, gibt es Fehlermeldungen wegen der Parameter, die er nicht erkennt?

    MfG
    Olaf
     

  12. #12
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Zitat Zitat von Olaf Lehmann Beitrag anzeigen
    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.

    Zitat Zitat von Olaf Lehmann Beitrag anzeigen
    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.

    Zitat Zitat von Olaf Lehmann Beitrag anzeigen
    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
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  13. #13
    Olaf Lehmann Olaf Lehmann ist offline Mitglied Silber
    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:
    Code :
    1
    
    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 :
    1
    
    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.
    Geändert von Olaf Lehmann (06.08.08 um 13:55 Uhr)
     

  14. #14
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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

  15. #15
    Olaf Lehmann Olaf Lehmann ist offline Mitglied Silber
    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

  1. Antworten: 0
    Letzter Beitrag: 28.11.06, 14:14
  2. Antworten: 2
    Letzter Beitrag: 07.09.06, 10:45
  3. Antworten: 8
    Letzter Beitrag: 13.09.05, 10:23
  4. Bekomme das nicht hin ...
    Von belisto im Forum Vektor-Programme
    Antworten: 1
    Letzter Beitrag: 23.02.05, 16:49
  5. Bekomme XP nicht drauf!!
    Von Gullynbg im Forum Microsoft Windows
    Antworten: 1
    Letzter Beitrag: 18.11.02, 09:15