TListView OnDrawItem
-
Hallo Jungs und Mädels,
ich tu mich grade etwas schwer bei dem OnDrawItem Event des TListViews.
Ich habe die Eigenschaft OwnerData auf true gesetzt so wie es in der BCB Hilfe vermerkt ist.
Nur leider wird das OnDrawItem Event nicht ausgelöst?Eine neues Item habe ich immer so eingefügt:
TListItem *newItem; //Ein neues ListItem-Objekt erzeugen newItem=list_Left[0]->Items->Add(); //Neus Item der Liste hinzufügen newItem->Caption = wfd.cFileName; //Den geundenen Namen ausgeben newItem->SubItems->Add("--"); //Erweiterung angeben (bei Ordnern --) newItem->SubItems->Add("<DIR>"); //Größe angeben (Bei Ordnern <DIR>Wenn ich dabei nun OwnerData auf true setzte, werden die Daten garnicht mehr angezeigt.
Wie muss ich dann angeben, dass da nun ein Dateiname und dessen Größe also die SubItems drin stehen soll.Ich möchte das OnDrawItem Event haben,
da ich vor dem Dateinamen das dazugehörige Icon setzten möchte.
Icon hole ich dann ja mit folgendem Code (Zu mindestens wird es so kompiliert, ob es nun funktioniert weiß
ich ja nichtvoid __fastcall TForm1::ListViewDrawItem(TCustomListView *Sender, TListItem *Item, const TRect &Rect, TOwnerDrawState State) { AnsiString FileName = asFileName[iF]; HICON hGen16Icon; SHFILEINFO shfi; unsigned short IconIndex = 0; // Systemincon zu einer Datei wird ermitelt if (SHGetFileInfo (FileName.c_str(), 0, &shfi, sizeof (SHFILEINFO), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON)) { hGen16Icon = shfi.hIcon; // if (hGen16Icon == NULL) return; // Text in Spalte übermalen (löschen, nur Icon ist gewollt) list_Left[0]->Canvas->FillRect(Rect); //StringGrid1->Canvas->FillRect(Rect); // Systemicon wird dargestellt. DrawIconEx(list_Left[0]->Canvas->Handle, Rect.Left+1,Rect.Top+1, hGen16Icon, 16, 16, 0, NULL, DI_NORMAL); //DrawIconEx(StringGrid1->Canvas->Handle, Rect.Left+1,Rect.Top+1, hGen16Icon, 16, 16, 0, NULL, DI_NORMAL); } }Mein ListView habe ich Dynamisch erzeugt und das Event zugewiesen:
// ListView erzeugen list_Left[i_AktPos] = new TListView(tab_Left[i_AktPos]); list_Left[i_AktPos]->Parent = tab_Left[i_AktPos]; list_Left[i_AktPos]->Align = alClient; list_Left[i_AktPos]->ViewStyle = vsReport; list_Left[i_AktPos]->GridLines=false; list_Left[i_AktPos]->OwnerData = true; list_Left[i_AktPos]->OnCustomDrawItem = ListViewCustomDrawItem;Die Ivent Prozedur ist auch im Header deklariert so wie es sich gehört.
DAnke schonmal für eine Antwort.
Gruß
Thorsten
-
Oder soll ich lieber ein StringGrid benutzten für die Anzeige eines Ordners bzw. Verzeichnisses?
-
Hah? Heißt es nicht OwnerDraw? OwnerData macht vielleicht auch Sinn, aber dann musst du auch noch die ganzen anderen Ereignisse implementieren...
-
auszug aus der BCB Hilfe
Das Ereignis OnDrawItem tritt ein, wenn ein Element in der Listenansicht gezeichnet werden soll.
__property TLVDrawItemEvent OnDrawItem = {read=FOnCustomDrawItem, write=FOnCustomDrawItem};
Beschreibung
Nehmen Sie in eine OnDrawItem-Ereignisbehandlungsroutine Code auf, um Elemente in der Listenansicht manuell zu zeichnen. OnDrawItem tritt nur ein, wenn OwnerData auf true gesetzt ist.
welche anderen ereignisse ?
-
Welche BCB-Version hast du?
BCB-Hilfe schrieb:
Dieses Ereignis wird ausgelöst, wenn ein Element in der Listenansicht gezeichnet werden soll.
__property TLVDrawItemEvent OnDrawItem = {read=FOnDrawItem, write=FOnDrawItem};
Beschreibung
Dieses Ereignis wird ausgelöst, wenn ein Element in der Listenansicht gezeichnet werden soll.In einer Ereignisbehandlungsroutine für OnDrawItem können Befehle zum manuellen Zeichnen von Elementen in der Listenansicht enthalten sein. Dieses Ereignis wird nur ausgelöst, wenn OwnerDraw den Wert true hat.
Hinweis: Listenansichten empfangen verschiedene weitere Ereignisse, [...]
Nicht dass sich da ein Fehler in der Hilfe eingschlichen hat...
-
C++ 5
-
Ich hab' die 6.
Versuche es mal mit OwnerDraw statt OwnerData. Vielleicht ist es ja wirklich ein Fehler in der Hilfe...
-
jo, habe es schon ma versucht gehabt. nun funktioniert es wohl. zu mindestens wird mir ein icon gezeichnet. nur wie bekomme ich dann daneben den Text hin?
das ist wohl meine letzte Frage diesbezüglich, dann müsste ich es verstanden habe.bis dann und danke nochmal gruß thorsten
-
vlt. sollte man solche Hilfe "Bugs" hier irgendwie auf der Seite auch auflisten. Wird bestimmt nicht der einzige Fehler sein, bei einer so Umfangreichen aber auch guten Hilfe!
-
mit DrawText kannst du Text ausgeben. Ausserdem solltest du nicht jedesmal beim Zeichnen die Icons abfragen sondern die vorher in ner liste speichern. siehe Virtual ListView - Beispiel in deinem BCB-Installationsordner.
-
hmm sieht sehr gut aus das Example, genau sowas in etwa habe ich vor. nur wie lesen die die verzeichnisse ein? ich kenne das nur mit FindFirst etc. oder FindFirstFile etc.?
ein wenig kommmentare in diesem programm finde ich.
gruß
thorsten
-
Hallo
In dem Beispiel wird eine alternative Möglichkeit der WinAPI verwendet.
Du kannst aber auch mit FindFirst/FindNext arbeiten.bis bald
akari
-
was ist denn nun besser? ich sehe zumindestens kein großen while schleife oder ist dass das selbe bei der alternative. werde den code dann wohl sehr gut interpretieren um zu verstehen was da abgeht
