Autor Beitrag
Doc Morelli
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 27



BeitragVerfasst: Sa 14.08.04 17:27 
Hi @all,

mein Problem: Ich habe gerade einen FTP-Client geschrieben und die Dateien sowie Ordner werden in einer ListView angezeigt. Jetzt möchte ich, dass die Dateien mit den zugehörigen Icons angezeigt werden.

Folgenden Tipp habe ich mir dazu schon angeguckt:

www.swissdelphicente.../showcode.php?id=421

Aber mit diesem Tipp klappt das ja nur bei einem Verzeichnis auf der Platte und ich weiß nicht, wie ich das nun für meinen FTP-Client realisieren soll.

Würde mich über schnelle Hilfe freuen und Danke schonmal im Vorraus.

MFG Frost
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Sa 14.08.04 19:07 
Hi und :welcome: im Delphi-Forum,
im Prinzip genauso! Für EXE,ICO,... Dateien geht's natürlich nicht, da hierfür die Datei erst vom FTP Server gezogen werden müsste. Alle anderen Icons kriegst du mit ExtractIcon (aus der Registry erfährst du, welche Dateiendung welche Iconresource benutzt), welche du dann in eine ImageList hinzufügen kannst, um so einen Index zu erhalten, den du der Listview geben kannst.

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Doc Morelli Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 27



BeitragVerfasst: Sa 14.08.04 20:09 
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
uses ShellAPI;

procedure TForm1.Button1Click(Sender: TObject);
var Icon: TIcon;
    FileInfo: SHFILEINFO;
    listitem : TListItem;
begin
Icon := TIcon.Create;
SHGetFileInfo( 'datei.txt', 0, FileInfo,
            SizeOf(FileInfo), SHGFI_ICON or SHGFI_SMALLICON);
icon.Handle := fileinfo.hIcon;
listitem := listview1.Items.Add;
listitem.Caption := 'datei.txt';
listitem.ImageIndex := imagelist1.AddIcon(Icon);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ListView1.SmallImages := ImageList1;
listview1.ViewStyle := vsReport;
listview1.Columns.Add;
listview1.Columns.Add;
end;


Das hab ich gerade geschrieben, aber ein Icon wird nicht angezeigt... Was hab ich falsch gemacht??? Muss das Verzeichnis wirklich existieren oder kann man das nur über den Dateiname regeln?
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 14.08.04 20:23 
In Bezug auf Exe-Dateien und ICO-Symbole hat maxk natürlich Recht. Da diese Dateien erst vom Server geholt werden müssten, damit man das korrekte Symbol erfährt, muss man einen Kompromiss schließen. Mit "SHGetFileInfo" kann man aber auch von anderen Dateitypen das Icon ermitteln.
Wenn du dazu im im MSDN unter Suche im MSDN "SHGETFILEINFO" die Bedeutung des Flags SHGFI_USEFILEATTRIBUTES nachschlägst, dann kennst du auch das Geheimnis. :)

Abgesehen davon ist dein Ansatz aber sehr ineffizent. Du liest nämlich die Symbole an sich aus und schiebst sie in deine Imageliste. Ich gehe mal davon aus, dass du auf deinem Server evtl. mehrere ZIP-Dateien hast, bzw. andere Dateien gleichen Typs. Das würde bedeuten, dass sich deine Imageliste langsam aber sicher auch mit den gleichen Icons füllt.
Die bessere Alternative ist, die System-Imageliste zu benutzen und nur den Index des Symbols zu ermitteln. Ich bin sicher, dass es im DF auch dazu was gibt. Aber auf Anhieb fallen mir doch eigentlich nur meine eigenen Beiträge in der Delphi-Praxis ein: Suche in der Delphi-PRAXiS SHGETFILEINFO SYSTEM IMAGELIST.
Doc Morelli Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 27



BeitragVerfasst: Sa 14.08.04 20:53 
Habs hingekriegt. Danke.

Ein Problem hab ich noch: Was mach ich, wenn die Datei ein Ordner ist, wie bekomme ich dann das Icon heraus???
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 14.08.04 21:18 
Icon gibt's in der Reg über Eintrag HKCR\Folder bzw. HKCR\Directory. Ansonsten gleiches Schema.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Doc Morelli Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 27



BeitragVerfasst: Sa 14.08.04 21:31 
Hab dann jetzt überprüft, ob die Datei ein Verzeichnis ist, aber das mit dem Icon klappt noch nicht so ganz...
ausblenden Quelltext
1:
icon.LoadFromFile('C:\WINDOWS\system32\shell32.dll,3');					

--> Soll das Icon laden, sieht aber ein bisschen falsch aus und ist es auch, hab das aus der Registry. Wie komm ich jetzt an das Icon?
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 14.08.04 22:27 
Mit "SHGetFileInfo" kann man problemlos die Symbole sowohl von Dateien als auch von Ordnern ermitteln.
Auch die Symbole von speziellen Ordnern (Eigene Dateien, Favoriten, usw.) kann man so erhalten.

Ansonsten mal zum Nachdenken:
Findest du auf deinem Rechner im Systemordner von Windows eine Datei namens "shell32.dll,3"? Sicher nicht. Die Datei heißt nur "shell32.dll", die Angabe 3 nach dem Komma bezieht sich auf den Index des Icons. Mit einer Funktion wie bspw. PathParseIconLocation kannst du den Dateinamen quasi filtern.

Aber notwendig ist das alles nicht. Ich persönlich bin der Meinung, dass dein Weg nicht nur umständlich sondern auch ressourcen-vergeudend ist. Mit jeder Datei fügst du deiner Imageliste ein neues Symbol hinzu. Und wie gesagt: Zwei ZIP-Dateien auf dem Server (oder wo auch immer), und deine Imageliste enthält zweimal das gleiche Symbol.

Windows hält bereits eine Liste aller bekannten Icons im Speicher, auf die man zugreifen kann. Wozu die Dinger also noch mal laden?
Doc Morelli Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 27



BeitragVerfasst: So 15.08.04 09:41 
Also, hab jetzt alles hingekriegt und läuft auch alles einwandfrei. Danke an alle, die mir geholfen haben. :)