Zeiger in CListCtrl speichern?

Ravebaby

Erfahrenes Mitglied
Ich möchte gern Zeiger auf Objekte in einer CListCtrl verwalten. Ist dies irgendwie möglich. Denn bei der Funktion "InsertItem()" ist ja laut Visual Studio.NET Hilfe wohl nur ein Zeiger auf ein LVITEM erlaubt. Oder kann man dort auch eigene Datentypen reinspeichern?!
 
Gottseidank hat Microsoft bei praktisch allen Controls ein ItemData bei jedem Item drin. Im LVITEM gibt es ein lParam. Dort kannst du einen Zeiger reinsetzen. Nicht vergessen, du musst dann auch das LVIF_PARAM-Flag setzen.
 
Dankeschön :) !

Aber nun kommt immer noch eine Fehlermeldung.

Code:
LV_ITEM Item = {0};
Item.lParam  = &fileItem;   // Store pointer to the data
Item.mask    = LVIF_PARAM;	// lParam fields active
Item.iItem   = 0;			// position to insert new item
Item.iSubItem = 0;

Der Fehler lautet:
cannot convert from CFileItem to LPARAM.

Wieso das denn?!
 
Du mußt explizit den Typ konvertieren:
Code:
Item.lParam  = (LPARAM)(&fileItem);
Beim auslesen mußt du den LPARAM ebenfalls wieder in Deinen Zeigertyp konvertieren.
Übrigens: warum willst Du das in eine CListCtrl speichern? Du gibst keinen Text zum Unterscheiden für den User an.
 
super, nun klappts. Vielen, vielen Dank!
Ich brauche nur eine interne Datenstruktur, die schon Sortierverfahren eingebaut hat.
 
Da würde ich allerdings eher eine Klasse von CPtrList ableiten, in der ich eine Sortierfunktion einbaue sowie eine Insert-Funktion, die einen neuen Pointer schon an der richtigen Stelle in die Liste einsetzt.
Nur wegen der Sortierfunktion den ganzen Overhead, das halte ich für etwas übertrieben.
Aber das ist nur meine persönliche Meinung.
 
Achso, ja. Zu was ist denn diese CListCtrl gut?! Es gibt ja auch solche Funktionen wie GetHoverTime(). Sieht so aus, als könnte man da Events besser abfragen?!
Ich entwickel einen Windows File Explorer. Jede Verzeichnisebene des Verzeichnisbaumes wollte ich in eine CListCtrl schreiben. Der File Explorer soll nacher mittels "mouse hover" Funktionalität gesteuert werden. Sprich, wenn der User über einen Text fährt, der einen Ordner bezeichnet, soll der Inhalt aufklappen. Hierzu muss ich wissen, an welcher Stelle der Name des Ornders auf den Bildschirm gezeichnet wurde, um die Mausposition des Users richtig zuzuordnen.
Was für eine Datenstruktur wäre da nun sinnvoll?
 
Also erstmal: CListCtrl ist ein recht komplexes Anzeigeelement für Listen. Das rechte Explorer-Fenster ist ein CListCtrl. Es gibt die Ansichten Symbol, Minisymbol, Liste und Report, wobei Report die einzige Ansicht ist, die mehrere Spalten zur Verfügung stellt. Es kann seinen Inhalt selbst verwalten, kann aber auch Inhalt von "außen" bekommen. Das CListCtrl fordert dann die darzustellenden Daten jedesmal an.
CListCtrl ist also ein Anzeigeelement (abgeleitet von CWnd), CPtrList ist kein Anzeigeelement, sondern eine reine Datenklasse, die eine Liste implementiert. Leider gibt es in dieser Listenklasse (wie auch in CList, CObjList, CObjPtrList,...) keine Sortierfunktion.
Was Deine Anwendung angeht, so verstehe ich noch nicht ganz, wie sie aussehen soll. Soll es nur das CListCtrl geben, in dem am Anfang nur die oberste Verzeichnisebene in der Liste ist und dann, wenn man mit der Maus auf ein Verzeichnis geht, soll der Inhalt dieses Verzeichnisses in der Liste stehen? Oder willst Du den Inhalt des Verzeichnisses unterhalb des verzeichnisnamens in die Liste einfügen? Erkläre mir bitte genauer, was Du vorhast.
 
eine CListCtrl soll den Inhalt von einem Verzeichnis enthalten.
Beim Starten des Programmes wird die oberste Verzeichnisebene eingelesen.
Sobald der User ueber dem Ordner "Programme" ruht, wird ein neues CListCtrl erstellt mit den Verzeichnisinhalten von "Programme"...
 
Du möchtest also für jedes Verzeichnis ein neues Fenster öffnen? Und es soll unabhängig vom vorherigen Fenster sein?
Möglicherweise gibt es bessere Lösungen, aber da würde ich eine Dialogbasierte Anwendung nehmen. Der Dialog enthält dann das CListCtrl und hat eine Membervariable, welche den Pfad enthält. die muß vor dem Starten des Dialogs initialisiert werden. Ist sie das nicht, dann kann man annehmen, daß die oberste Verzeichnisebene eingelesen werden soll. Im InitDialog liest Du dann mit FindFile und FindNextFile die Dateien und Verzeichnisse aus dem angegebenen Verzeichnis aus und stellst sie als Item im CListCtrl dar(InsertItem(...)). Im lParam des Items kannst Du ja ein flag ablegen, das Dir anzeigt, ob es ein Directory ist oder nicht. Wenn dann der Mauszeiger auf einem Verzeichnis ist (SubItemHitTest(...)), dann erzeugst Du eine Neue Instanz des Dialogs und startest sie. Wie man mit CListCtrl arbeitet, kannst Du im MSDN nachlesen, das ist zu umfangreich, um es hier zu wiederholen.
Wenn Du es nicht mit Dialogen machen willst, dann sollte das so ähnlich auch in einer SDI-Anwendung mit CDirListCtrl::Create(...) gehen, wobei CDirListCtrl eine von Dir von CListCtrl abgeletete Kalsse sein soll. Du mußt dich da halt selber um die ganze Erzeugung kümmern. die Initialisierung der Liste kannst Du im OnCreate(...) machen.
So könnte es gehen, es fehlen nur noch die Pointer, nach denen Du am Anfang dieses Threads gefragt hast. Wo bekommst Du die her und was für Pointer sind das? Ich hatte das mit CPtrList vorgeschlagen, da ich nicht wußte, auf was Du hinauswillst. Die Pointer haben mich etwas verwirrt, da man im Allgemeinen Pointer nicht sinnvoll in einer Liste darstellen kann (man kann schon, aber es wird wohl keinem was sagen), man kann sie aber sinnvoll in einer Liste speichern und verwalten.
 
Zurück