![]() |
Icon - Symbol von Dateityp ermitteln (Speicherort)
Ich möchte in TListView das Symbol der entsprechenden Datei angezeigt haben. Damit das geht, muss ich wissen, wo ich das Icon (Symbol) auf der Festplatte finde. Wenn ich z.B. eine *.txt Datei habe, dann möchte ich das Symbol für die Textdatei laden. Dies soll für alle Dateitypen möglich sein. Ich habe schon versucht den Speicherort über die Registry heraus zu bekommen, das funktioniert aber nicht, hab alles durchsucht, nix gefunden :(
Dann bin ich auf die Idee gekommen Im Arbeitsplat bei Ordneroptionen -> Dateitypen zu gucken. Dort fand ich z.B. bei TXT Dateien heraus, dass das Symbol hier gespeichert ist: C:\WINDOWS\system32\shell32.dll Aber das wusste ich auch schon vorher. Wenn man über Ordneroptionen das entsprechende Icon abfragen kann, dann muss man das doch auch irgendwie mit Delphi können. In meiner TListView soll halt das entsprechende Icon angezeigt werden. Weiß das jemand zufällig, wie man das raus bekommt? :gruebel: |
Re: Icon - Symbol von Dateityp ermitteln (Speicherort)
Da gibt es eine API-Funktion für. Ich vergesse nur immer welche, weil ich sie nie brauche. Aber du bist nicht der erst, der das machen will.
|
Re: Icon - Symbol von Dateityp ermitteln (Speicherort)
ich habe mal vor einiger zeit den dialog für dateieigenschaften von win nachprogrammiert, da brauchte ich das auch, und ja ich habs geschafft über die registry, du musst nur immer den verlauf nachverfolgen!! bsp txt datei..
1. .txt im pfad "HKEY_CLASSES_ROOT\.txt" den wert standart auslesen, das ist (im normal fall wenn nichts geändert worden ist) "txtfile" 2. diesen wert wieder nachverfolgen im pfad "HKEY_CLASSES_ROOT\txtfile" 3.unter dem pfad ""HKEY_CLASSES_ROOT\txtfile\defaulticon" dort ist der pfad zum icon vom arbeitsplatz/explorer gespeichert diesen musst du dann zerlegen und thats it anmerkung: bei vista währe es für die txtdateien: "%SystemRoot%\system32\imageres.dll,-102" befindet sich also in der dll imagesres an platz 102.... so hab ich es gemacht und das ging... bei exe dateien kannst natürlich auch den pfad auslesen und dann per apitool das icon auslesen... danach einfach mal googeln oder hier suchen |
Re: Icon - Symbol von Dateityp ermitteln (Speicherort)
Das ist aber nicht der von MS offizielle Weg.
Ich habs: ![]() |
Re: Icon - Symbol von Dateityp ermitteln (Speicherort)
Ich dachte, dass man das mit
![]() |
Re: Icon - Symbol von Dateityp ermitteln (Speicherort)
@littleDave: Es gibt oft nicht nur einen einzigen Weg. ;)
Ich mache es jedoch auch immer mit ShGetFileInfo:
Delphi-Quellcode:
Das ist nur aufs Kürzeste zusammengefasst. Speicher freigeben etc. nicht vergessen.
Icon: TIcon;
FileInfo: SHFileInfo; // ... SHGetFileInfo(PChar(ExtractFileExt('Pfad zur Datei')), FILE_ATTRIBUTE_NORMAL, FileInfo, SizeOf(TSHFileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_ICON or SHGFI_USEFILEATTRIBUTES); Icon.Handle := FileInfo.hIcon; // ImageList ist ListView.SmallIcons zugewiesen ListItem.ImageIndex := ImageList.AddIcon(Icon); // ... Grüße, Matze |
Re: Icon - Symbol von Dateityp ermitteln (Speicherort)
@Matze: ich war nur so erstaunt, weil ich diese Funktion nicht kannte :shock:. Aber man lernt ja nie aus ;-)
|
Re: Icon - Symbol von Dateityp ermitteln (Speicherort)
Das funzt nicht wirklich...
Delphi-Quellcode:
Genau in dieser Zeile steigt mein Programm aus! Wenn ich nur diese Zeile auskommentiere, dann läuft es wenigstens, auch wenn nichts passiert.
Icon.Handle := FileInfo.hIcon;
Zitat:
|
Re: Icon - Symbol von Dateityp ermitteln (Speicherort)
Aber Icon ist instanziiert?
|
Re: Icon - Symbol von Dateityp ermitteln (Speicherort)
Zitat:
naja und die 3 lösungsvorschläge werden ja wohl reichen, einer wird bestimmt gehem^^ |
Re: Icon - Symbol von Dateityp ermitteln (Speicherort)
Ich krieg die Krise. Jetzt habe ich schon x Stunden in das kleine Problem gesteckt, es funzt nicht. Es werden einfach keine Icons angezeigt!
Delphi-Quellcode:
Und auch krieg ich die Daten aus dem Array in kein Stream gepackt :shock:
procedure Tver.BitBtn18Click(Sender: TObject);
var name,inhalt,bytes,komma: string; groesse,i,symbol: integer; Icon: TIcon; FileInfo: SHFileInfo; ListItem: TListItem; begin if dateinummer >= 500 then ShowMessage('Soviele Dateien können nicht verwaltet werden. Benutzen Sie ein weiteres Bild oder löschen Sie einige Dateien aus der Liste!') else begin dateinummer := dateinummer + 1; if OpenDialog3.Execute = true then try bytes := ''; name := OpenDialog3.FileName; inhalt := FileToString(name); dateien[1,dateinummer] := ExtractFileName(name); dateien[2,dateinummer] := inhalt; SHGetFileInfo(PChar(ExtractFileExt(name)), FILE_ATTRIBUTE_NORMAL, FileInfo, SizeOf(TSHFileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_ICON or SHGFI_USEFILEATTRIBUTES); Icon := TIcon.Create; ListItem := Listview1.Items.Add; try Icon.Handle := FileInfo.hIcon; ListItem.ImageIndex := ImageList1.AddIcon(Icon); finally FreeAndNil(Icon); end; ListItem.Caption := ExtractFileName(name); // ListView1.Items.Add.Caption := ExtractFileName(name); groesse := length(dateien[2,dateinummer]); i := -1; i := length(IntToStr(groesse)); // sprache abfragen!!! -> Die Amis haben nen andres Komma!!! // überprüfen ob datei größer als diese 12 * 3 MB ist, um den Arbeitsspeicher zu schützen. komma := ','; if (i < 3) and (i > -1) then bytes := IntToStr(groesse) + ' B' else if i < 6 then begin bytes := IntToStr(groesse div 1000); bytes := bytes + komma + IntToStr(groesse mod 1000)[1] + ' KB'; end else if i >= 6 then begin bytes := IntToStr(groesse div 1000000); bytes := bytes + komma + IntToStr(groesse mod 1000000)[1] + ' MB'; end; ListItem.SubItems.Add(bytes); ListItem.SubItems.Add('lol'); ListItem.SubItems.Add(name); ListItem.Checked := true; except ShowMessage('Es ist ein Fehler aufgetreten. Die Datei konnte nicht geladen werden.'); end; end; end;
Delphi-Quellcode:
Der Text ist unheimlich kurz und besteht nur aus nen 12 Sonderzeichen obwohl mehr drin ist. :wall:
procedure Tver.Button4Click(Sender: TObject);
var strom: TMemoryStream; i: integer; text: string; begin // dateinummer = anzahl der dateien beginnend mit 1 strom := TMemoryStream.Create; strom.Write(dateinummer,SizeOf(dateinummer)); for i:= 1 to dateinummer do begin text := 'Jetzt will ichs wissen!'; strom.Write(dateien[1,i],sizeof(dateien[1,i])); strom.Write(dateien[2,i],sizeof(dateien[2,i])); strom.Write(text,sizeof(text)); end; text := ''; text := memoryToString(strom); ShowMessage(IntToStr(length(text))); strom.Free; end; |
Re: Icon - Symbol von Dateityp ermitteln (Speicherort)
ist ImageList1 ListView1.SmallIcons zugewiesen?
|
Re: Icon - Symbol von Dateityp ermitteln (Speicherort)
Zitat:
Delphi-Quellcode:
ListView1.SmallIcons existiert nicht :?:
ListItem.ImageIndex := ImageList1.AddIcon(Icon);
|
Re: Icon - Symbol von Dateityp ermitteln (Speicherort)
Guck mal im Objektinspektor, da kannst du das wunderbar zuweisen.
|
Re: Icon - Symbol von Dateityp ermitteln (Speicherort)
Ich hab da mal n fetzen Code für dich, den ich vor ca. 5 Jahren mal gefunden hab. Er zwar nicht sehr gut, aber er funktioniert (bei mir ;-)):
Diese Funktion im FormCreate-Event aufrufen:
Delphi-Quellcode:
Und dann einfach einlesen:
procedure Createimages;
var SysIL : uint; SFI : TSHFileInfo; begin LargeImages := TImageList.Create(MainForm); SysIL := SHGetFileInfo('', 0, SFI, SizeOf(SFI), SHGFI_SYSICONINDEX or SHGFI_LARGEICON); if SysIL <> 0 then begin LargeImages.Handle := SysIL; LargeImages.ShareImages := TRUE; end; SmallImages := TImageList.Create(MainForm); SysIL := SHGetFileInfo('', 0, SFI, SizeOf(SFI), SHGFI_SYSICONINDEX or SHGFI_SMALLICON); if SysIL <> 0 then begin SmallImages.Handle := SysIL; SmallImages.ShareImages := TRUE; end; MainForm.ListView.LargeImages:=LargeImages; MainForm.ListView.SmallImages:=SmallImages; end;
Delphi-Quellcode:
Wenn du das hast, musst du einfach noch SHGetFileInfo anpassen (nur die Extension und ich glaub, du musst noch einen Parameter am schluss mir OR hinzufügen)
procedure VerzeichnisEinlesen(VerzName:string);
var NewItem : TListItem; Info : TSHFileInfo; SR : TSearchRec; begin MainForm.ListView.Items.BeginUpdate; if VerzName[length(VerzName)]<>'\' then VerzName:=VerzName+'\'; with MainForm do begin ListView.Items.Clear; if FindFirst(VerzName+'*.*',faAnyFile,SR)=0 then begin repeat if (length(SR.Name)>0) and (SR.Name[1]<>'.') then begin NewItem:=ListView.Items.Add; NewItem.Caption:=SR.Name; SHGetFileInfo(PChar(VerzName+SR.Name),0,Info,SizeOf(TSHFileInfo),SHGFI_SYSIconIndex or SHGFI_TYPENAME); NewItem.ImageIndex:=Info.IIcon; NewItem.SubItems.Add(Info.szTypeName); end; until FindNext(SR)<>0; FindClose(SR); end; end; MainForm.ListView.Items.EndUpdate; end; |
Re: Icon - Symbol von Dateityp ermitteln (Speicherort)
Zitat:
lg LordPsychoter |
Re: Icon - Symbol von Dateityp ermitteln (Speicherort)
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz