Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hallo halli!

Wie kann ich Elemente in eine Tree-Ansicht einfügen bzw. das Level festlegen?

Und vielleicht kann mir jemand mit der CD-ROM-Kontrolle helfen?! (siehe Laufwerke und ihre Buchstaben)

Original geschrieben von Narf!

Wie kann ich Elemente in eine Tree-Ansicht einfügen bzw. das Level festlegen?

MFC oder nicht? Falls ja, mit CTreeCtrl::InsertItem. Wenn Du mit Level meinst, wo das neue Element eingefügt werden soll: Du musst bei InsertItem das Parent-Element angeben, in Form eines HTREEITEM. Ein solches bekommst Du beim Aufruf von InsertItem für das neu eingefügte Element zurück. Wenn Du ein Element auf der obersten Ebene anlegen willst, musst Du als Parent TVI_ROOT angeben.

Siehe auch:

http://msdn.microsoft.com/library/en-us/vclib/html/_mfc_CTreeCtrl.3a3a.InsertItem.asp

Und vielleicht kann mir jemand mit der CD-ROM-Kontrolle helfen?! (siehe Laufwerke und ihre Buchstaben)
Hat Dir ffGebaecks Antwort nicht weitergeholfen?
  • Autor

Tachchen!

Danke für die Tree-Tipps, es hat geklappt.

Aber nun das nächste Problem:

Wenn ich ein Item aus der Liste auswähle, dann möchte ich den Text des Items in einer Variable speichern, um sie mit einem anderen String zu vergleichen. Wie bekomme ich den Item-Text in eine Variable?

Dafür hättest Du kein neues Thema beginnen müssen, ich führ das mal zusammen ;).

Aber zur Frage:

Um überhaupt etwas davon mitzubekommen, wenn sich die Selektion eines Tree Controls ändert, musst Du im Klassenassistenten für das Control eine Nachrichtenbehandlungsfunktion für die Nachricht TNV_SELCHANGING einrichten.

Die generierte Funktion sieht dann in etwa so aus:

void CDeinDlg::OnSelchangedTreeXy(NMHDR* pNMHDR, LRESULT* pResult) 
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here

*pResult = 0;
}[/CODE] Diese Funktion wird aufgerufen, wenn sich die Auswahl ändert. An den Text des Elements kommst Du mit CTreeCtrl::GetItemText, dafür brauchst Du das HTREEITEM des Elements als Parameter. Das wird hier aber zum Glück mitgeliefert, in der NM_TREEVIEW-Struktur. Du musst also nur folgenden Code an der TODO-Stelle einfügen, und schon hast Du den Text in einem CString:
[CODE]CString strItemText = m_DeinTreeCtrl.GetItemText( pNMTreeView->itemNew.hItem );

  • 3 Wochen später...
  • Autor

Noch 'n Problem:

Wenn ich den Tree das erstemal aufbauen lasse, geht alles klar. Bei DeleteAllItems macht er keine Probleme.

Wenn ich aber den Tree ein zweites Mal aufbauen lasse, lösche ich den Inhalt der drin steht mit m_Tree.DeleteAllItems(). Dabei bekomme ich jetzt eine seltsame Fehlermeldung: MessageBox ohne Text! Was soll das? Die kommt bei jedem Item, das gelöscht wird. Danach habe ich zwar die neue Tree-Ansicht, aber wenn ich darin herum navigiere, kommt wieder diese Fehlermeldung.

PANIK! :confused:

oh cool muss ich kein neues aufmachen.

hab da auch mal ne frage. hab den namen vom item und brauch das handle hab aber keine funktion gefunden die das bewerkstelligen könnte. hab ich da was übersehen???

wenns nicht geht wie mach ich das am blödsten ohne dass ich mir jeden text geben lasse und dann die strings vergleiche?!?!

habs schon aber danke.

  • Autor

Mit pCtrl baue ich meine Tree-Ansicht auf und lösche vorher den Inhalt mit der dritten Zeile.

Beim ersten Aufbau geht ja alles klar.

CTreeCtrl* pCtrl = (CTreeCtrl*) GetDlgItem(IDC_TREE1);

ASSERT(pCtrl != NULL);

pCtrl->DeleteAllItems();

Den habe ich auch versucht, aber das war nichts. Egal wo ich den im Programm stehen hatte.

//m_Tree.DeleteAllItems();

Es klappt alles bis eben auf das Löschen. :(

Originally posted by Narf!

Es klappt alles bis eben auf das Löschen. :(

Nochmal:

Hast Du eine Nachrichtenbehandlungsfunktion für TVN_DELETEITEM erstellt? Wenn ja, was steht drin?

Der MessageMap-Eintrag sollte in etwa so aussehen:

ON_NOTIFY(TVN_DELETEITEM, IDC_TREE1, OnDeleteitemTree)

komisch bei mir klappts so hast du vielleicht ne messagebox irgendwann mal eingebaut???

hab gerade mal die OnDeleteItem.... überschrieben und reindebuggt. so wie ich das sehe wird diese funktion bei jedem item aufgerufen.

  • Autor

@Klotzkopp: Keinen Handler benutzt.

@cleo:wird auch bei jedem Item aufgerufen, aber nur bei den nichtmarkierten und ab dem ersten markierten bei jedem nachfolgendem tritt der Fehler auf

kann mich nur wiederholen bei mir nicht.

  • Autor

Ich hab das jetzt mal mit dem Debugger probiert. Wenn ich es beim Haltepunkt bei

pCtrl->SetFocus() weiterlaufen lasse, gibt er mir diese Fehlermeldung:

Nicht abgefangene Ausnahme in test2.exe (GDI32.DLL): 0xC0000005: Access Violation.

Nicht abgefangene Ausnahme in test2.exe (GDI32.DLL): 0xC0000005: Access Violation.

:confused:

  • 1 Monat später...
  • Autor

Ich muss mal wieder was hierzu fragen:

Ich lese aus einer Datei einen String aus, den möchte ich in der Treeansicht suchen und markieren, kann sich auch in einer nächsten Ebene befinden.

Wie?

  • Autor

Damit geht's:

void xKlasse::Suchen()

 {

  HTREEITEM such=m_Tree.GetRootItem(); //m_Tree - Control

  BOOL find=0;

  CString suchtxt;


  while(find!=1)

   {

    suchtxt=m_Tree.GetItemText(such);


    if(strcmp(suchtxt,Titel)==0) //Titel - global, aus Datei gelesen

     {

      m_Tree.SelectItem(such);


      find=1;

     }


    else

     {

      if(m_Tree.ItemHasChildren(such))

       {

        such=m_Tree.GetChildItem(such);


        suchtxt=m_Tree.GetItemText(such);


        if(strcmp(suchtxt,Titel)==0)

         {

          m_Tree.SelectItem(such);


          find=1;

         }

       }

     }

    such=m_Tree.GetNextVisibleItem(such);

   }

 }

  • 4 Wochen später...
  • Autor

So, bin mal wieder am verzweifeln. :confused:

Auf einigen Rechner funktioniert die Tree-Ansicht nicht richtig.

Mein Programm startet, der Dialog wird angezeigt und auch die Tree-Ansicht ist gefüllt und alles an seinem Platz.

Auf einigen Rechnern gibt es aber das Problem, dass man in der Tree-Ansicht nicht mit den Pfeiltasten navigieren kann, d.h. der blaue Balken ist nicht da.

Wenn ich aber mit der Maus auf ein Item klicke, ist alles ok. Das Item wird markiert und OnSelChange() arbeitet. Drücke ich nun wieder auf eine Pfeiltaste, ist wieder alles beim Alten.

Wo kann ich das Problem finden und beheben?

  • Autor

Ich habe mir heute mit Depends die dll's anzeigen lassen und auf den Rechnern gesucht und gefunden, daran liegt es also nicht.

Kann es vielleicht am Chipsatz auf dem Board liegen?

Brauche dringend Hilfe!

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.