[gtkmm] Zugriff auf ListStore-Elemente ohne Selection [gelöst]



  • Hi Leute,

    ich möchte nacheinander auf alle Gtk::ListStore-Elemente (Gtk::TreeModel::Row) zugreifen. Dies ist mittels Gtk::TreeModel::iterator möglich. Allerdings finde ich keinen eleganten Weg um das erste und letzte Element der Kette zu ermitteln.

    Realisiert habe ich den Zugriff erstmal mittels einer Zeilen-ID. Allerdings würde ich gerne auf diese verzichten, einerseits, weil ich sie sonst nicht brauche und andererseits weil sie relativ fehleranfällig ist.
    Ich würde gerne ähnlich wie bei verketteten Listen mittels eines First-Element bzw. Null-Pointers das Erste bzw. das letzte Element erkennen. Der Gtk::TreeModel::iterator besitzt zwar einen ++operator und --operator, mittels denen man in der Liste vor und zurück gelangt, jedoch keine Funktion um auf das erste bzw. das letzte Element zuzugreifen.
    Navigiert man über die Listenenden hinaus, also nutzt "iter++" beim letzten, oder "iter--" beim ersten Element, stürtzt das Programm mit der Meldung "Segmentation fault (core dumped)" ab. Es wird leider weder das Überschreiten des Listenendes abgefangen, noch durch einen Null-Pointer kenntlich gemacht.

    Welche besseren Möglichkeiten gibt es hier?

    Zur Veranschaulichung ein Auszug aus meiner Routine zum Durchlaufen der Liste vom ersten zum letzten Listenelement:

    // Zurueckspulen - Das erste Listen-Element finden
    col_row = *iter; // Das zuletzt hinzugefügte oder zuletzt selektierte Element
    while(col_row[cols.col_id] > 1){ // Pruefung der ID
      iter--;
      col_row = *iter;
    }
    
    // Auflisten - Alle Listen-Elemente auflisten
    while( col_row[cols.col_id] < zeilenzahl ){
    
      // Beispielsweise Ausgabe der ID und des Namens
      std::cout << std::endl << "col_row[cols.col_id] : " << col_row[cols.col_id]
    	    << " | col_row[cols.col_name] : " << col_row[cols.col_name];
    
      iter++;
      col_row = *iter;
    }
    
    // Beispielsweise Ausgabe der ID und des Namens (letzes Element)
    std::cout << std::endl << "col_row[cols.col_id] : " << col_row[cols.col_id]
    	  << " | col_row[cols.col_name] : " << col_row[cols.col_name];
    

    Schon mal im Voraus: Vielen Dank für Eure Hilfe.

    Schöne Grüße,
    m_power





  • Super vielen Dank!
    Das war genau die Lösung die ich gesucht habe.

    Schönen Abend wünscht,
    m_power


Log in to reply