Autor Beitrag
adler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 511

Windows XP
Delphi 05 Pers
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:

ausblenden 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:

ausblenden volle Höhe Delphi-Quelltext
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(00, 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



BeitragVerfasst: Mi 28.04.04 16:24 
Hi,

ansonsten benutze die TListView mit ViewStyle auf vsReport, das ist wohl das, was du suchst.
adler Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 511

Windows XP
Delphi 05 Pers
BeitragVerfasst: 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 511

Windows XP
Delphi 05 Pers
BeitragVerfasst: Mi 28.04.04 18:48 
Stimmt, danke ;)
Mal sehn ne... ^^

_________________
Wo's nix zu gucken gibt, gibts vielleicht was zu hören.
adler Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 511

Windows XP
Delphi 05 Pers
BeitragVerfasst: 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



BeitragVerfasst: 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: Suche in: Delphi-Forum, Delphi-Library SH_GETFILEINFO) und dann den jeweiligen Index dem ListView-Item zuweisen.
adler Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 511

Windows XP
Delphi 05 Pers
BeitragVerfasst: Fr 30.04.04 15:51 
Nur wie weise ich es zu :-/
Habe nichts gefunden Sorry!
Die Bilder sollten kein Prob machen :D (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



BeitragVerfasst: Fr 30.04.04 16:04 
Angenommen dein Icon, welches das von SH_GETFILEINFO zurückgelieferte Icon enthält, heißt FileIcon:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 511

Windows XP
Delphi 05 Pers
BeitragVerfasst: Fr 30.04.04 16:18 
ausblenden 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



BeitragVerfasst: 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.