Autor |
Beitrag |
adler
      
Beiträge: 511
Windows XP
Delphi 05 Pers
|
Verfasst: Mi 28.04.04 13:21
Hi!
Gibt es eine Listbox artige Compo, bei der man jedem Item ein Bild zuordnen kann?
Möchte mal bissl mit FTP experimentieren und Anzeigen lassen ob das ein Ordner oder eine Datei ist.
ThX Adler
_________________ Wo's nix zu gucken gibt, gibts vielleicht was zu hören.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 28.04.04 14:36
Hallo!
Es gibt ja die ComboBox-Komponente, die Bilder anzeigen kann. Lässt sich die nicht so einstellen, das stets alle Einträge angezeigt werden? Mir ist so, als hätte ich das mal gelesen, dass das zumindest bei einer normalen ComboBox funktioniert.
Die zweite Möglichkeit ist, dass Du die Einträge selbst zeichnest! (Und das ist gar nicht so schwierig)
Hier der entsprechende Quelltext:
Zitat: |
Listboxen mit Bitmaps und mehrzeiligem Text
Delphi 1-2
Immer wieder erforderlich und nirgends richtig beschrieben ist das Verfahren, in List- und ComboBox-Feldern sowohl Text als auch Bitmaps darzustellen. Noch dazu, wenn der Text in mehreren Zeilen dargestellt werden soll. Abhilfe schafft die Fähigkeit dieser Listenelemente, mittels des Ereignisses OnOwnerDraw, die einzelnen Zeilen selbst darzustellen. Um das Projekt an einem Beispiel nachzuvollziehen, erstellen Sie drei Image-Komponenten und laden hier unterschiedliche Bilder über die Picture-Eigenschaft. Legen Sie dazu noch eine leere ListBox sowie eine ComboBox-Komponente auf Ihr Formular. Setzen Sie bei beiden Listenelementen die Eigenschaft "Style" auf "lbOwnerDrawFixed" respektive "csOwnerDrawFixed". Füllen Sie dann beide Komponenten im OnCreate-Ereignis des Formulars mit den Bitmaps und passendem Text:
Delphi-Quelltext 1: 2: 3:
| ListBox1.Items.AddObject('Erstes Bitmap', Image1.Picture.Bitmap); ListBox1.Items.AddObject('Zweites Bitmap', Image2.Picture.Bitmap); ListBox1.Items.AddObject('Dies ist'#13'das dritte Bitmap ', Image3.Picture.Bitmap); |
Anschließend erstellen Sie die Behandlungsroutine des OnDrawItem-Ereignisses:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;Rect: TRect; State: TOwnerDrawState); var Bitmap: TBitmap; OutChar: PChar; TS: TStrings; CV: TCanvas; begin If Control is TCustomListBox Then Begin TS := TCustomListBox(Control).Items; CV := TCustomListBox(Control).Canvas; End Else If Control is TCustomComboBox Then Begin TS := TCustomComboBox(Control).Items; CV := TCustomComboBox(Control).Canvas; End; OutChar := StrAlloc(length(TS.Strings[Index]) + 1); StrPCopy(OutChar, TS.Strings[Index]); with CV do begin FillRect(Rect); if TS.Objects[Index] <> nil then begin Bitmap := TS.Objects[Index] as TBitmap; BrushCopy(Bounds(Rect.Left + 2, Rect.Top + 2, Bitmap.Width, Bitmap.Height), Bitmap, Bounds(0, 0, Bitmap.Width, Bitmap.Height), Bitmap.Canvas.Pixels[0,Bitmap.Height]); end; Rect.Left := Rect.Left + Bitmap.Width + 4; Rect.Bottom := Rect.Top + Bitmap.Height + 4; DrawText(Handle, OutChar, StrLen(OutChar), Rect, dt_WordBreak); StrDispose(OutChar); end; end; |
Anmerkung: Diese Routine ist so flexibel gehalten, daß Sie sie für beliebige Combo- und ListBox-Komponenten verwenden können, sogar solche mit Datenbank-Anschluß. Wollen Sie die Größe der einzelnen Zeilen des Listenfeldes verändern, so setzen Sie die Eigenschaft ItemHeight. Soll diese variabel sein, so setzen Sie die Eigenschaft Style auf csOwnerDrawVariable respektive lbOwnerDrawVariable. Im Ereignis OnMeasureItem werden Sie dann bei jedem Element aufgefordert, dessen Höhe - mit Hilfe des Referenzparameters Height - anzugeben.
|
gefunden bei: www.delphimeister.de/
MfG,
Sebastian
|
|
Benedikt
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 28.04.04 16:24
Hi,
ansonsten benutze die TListView mit ViewStyle auf vsReport, das ist wohl das, was du suchst.
|
|
adler 
      
Beiträge: 511
Windows XP
Delphi 05 Pers
|
Verfasst: Mi 28.04.04 17:45
Beides nicht so gut Anwendbar.
Wenn ich TListView nehme, dann gehts nichtmehr, weil .items als TListItem declariert ist.
wenn ich das machen würde wie bei der ersten Antwort, müsste ich mit addobjekt komplette items einfügen?
Aber die Files und Ordner trägt mein idFTP automatisch ein... oder sollte es da noch ne möglichkeit geben?
opj_FTP_c.List(lb_ServerDateien.Items,'',false);
_________________ Wo's nix zu gucken gibt, gibts vielleicht was zu hören.
|
|
Benedikt
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 28.04.04 18:31
Dann schreib dir die Rückgabe von indyFTP doch in eine Stringlist und gehe diese dann durch und adde die ListItems in die ListView.
Nach dem List-Command kannst du auch mit indyFTP.DirectoryListing arbeiten, anstatt mit der Stringlist.
Ich denke die ListView ist dafür schon am besten geeignet.
|
|
adler 
      
Beiträge: 511
Windows XP
Delphi 05 Pers
|
Verfasst: Mi 28.04.04 18:48
Stimmt, danke
Mal sehn ne... ^^
_________________ Wo's nix zu gucken gibt, gibts vielleicht was zu hören.
|
|
adler 
      
Beiträge: 511
Windows XP
Delphi 05 Pers
|
Verfasst: Fr 30.04.04 14:27
Also zumindest bekomm ichs jetzt da richtig rein, nur wie kann ich jetzt Bilder davor machen?
_________________ Wo's nix zu gucken gibt, gibts vielleicht was zu hören.
|
|
Benedikt
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 30.04.04 15:25
Ich denke ja mal, du willst die System-Icons für Ordner bzw. Dateien ausgeben lassen.
Nun, vom Prinzip her müsstest du dir für die jeweiligen Datei-Endungen der FTP-Files die auf deinem Rechner zugeordneten Icons in eine ImageList laden (Stichwort: SH_GETFILEINFO) und dann den jeweiligen Index dem ListView-Item zuweisen.
|
|
adler 
      
Beiträge: 511
Windows XP
Delphi 05 Pers
|
Verfasst: Fr 30.04.04 15:51
Nur wie weise ich es zu :-/
Habe nichts gefunden Sorry!
Die Bilder sollten kein Prob machen  (Also sie in ne ImageList zu laden)
_________________ Wo's nix zu gucken gibt, gibts vielleicht was zu hören.
|
|
Benedikt
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 30.04.04 16:04
Angenommen dein Icon, welches das von SH_GETFILEINFO zurückgelieferte Icon enthält, heißt FileIcon:
Delphi-Quelltext 1: 2: 3: 4:
| SHGetFileInfo('.txt', FILE_ATTRIBUTE_NORMAL, FileInfo, SizeOf(TShFileInfo), SHGFI_ICON or SHGFI_SMALLICON or SHGFI_TYPENAME or SHGFI_USEFILEATTRIBUTES);
FileIcon.Handle:=FileInfo.hIcon; ListItem.ImageIndex:=ImageList.AddIcon(FileIcon); |
FileInfo ist in diesem Falle natürlich vom Typ TSHFileInfo.
|
|
adler 
      
Beiträge: 511
Windows XP
Delphi 05 Pers
|
Verfasst: Fr 30.04.04 16:18
Delphi-Quelltext 1: 2: 3: 4:
| SHGetFileInfo('.txt', FILE_ATTRIBUTE_NORMAL, FileInfo, SizeOf(TShFileInfo), SHGFI_ICON or SHGFI_SMALLICON or SHGFI_TYPENAME or SHGFI_USEFILEATTRIBUTES);
FileIcon.Handle:=FileInfo.hIcon; ListItem.ImageIndex:=ImageList.AddIcon(FileIcon); |
Wofür brauch ich das denn alles!?
Ich möchte doch nur vor jeden Eintrag ein Bild reinsetzen, es ist mir auch völlig egal welches.
Kann ich net einfach bei additem(); noch mein bild dazu machen?
Also das es so nicht geht ok, gibts da net ne andere Funktion?
ListItem.ImageIndex:=ImageList.AddIcon(FileIcon);
Was bringts? Was ist in dem Fall ListItem?
_________________ Wo's nix zu gucken gibt, gibts vielleicht was zu hören.
|
|
Benedikt
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 30.04.04 16:45
Das SHGetFileInfo ist eigentlich nur dafür da, das passende Icon zur Extension, in diesem Falle TXT rauszukriegen.
Dieses Icon wird dann in die ImageList eingefügt (AddIcon).
AddIcon liefert dabei den Index zurück an der das Icon eingefügt wurde, dieser Index wird dann gleich der Eigenschaft ImageIndex von ListItem zugewiesen.
ListItem ist vom Typ TListItem, welches dann mit ListView.Add an die ListView angehangen werden kann.
Zusätzlich muss natürlich noch in der ListView der Eigenschaft Small-, bzw. LargeImages deine ImageList zugewiesen werden.
Wenn du natürlich z.B. für alle Dateien das gleiche statische Bild verwenden willst oder andere Bilder die immer in deiner ImageList drin sind, kannst du dir das mit dem SHGetFileInfo natürlich sparen und einfach nur den jeweiligen Index des Bildes direkt ListItem.ImageIndex zuweisen.
|
|
|