Shelllistview Systemicons einlesen

Für Fragen von Einsteigern und Programmieranfängern...
DoorPro
Beiträge: 15
Registriert: Do 8. Mär 2012, 13:02
OS, Lazarus, FPC: Windows (L 0.9.30.2 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: Xanten
Kontaktdaten:

Shelllistview Systemicons einlesen

Beitrag von DoorPro »

Hallo Leute,
ich habe jetzt fast 2 Wochen nach ner Lösung gesucht aber keine gefunden.

Mein Problem ich verwende Shelllistview um Dateien anzuzeigen.
Nur fehlen mir die Symbole weiß vielleicht einer von euch wie ich das hin bekomme.

Danke schonmal im Vorhaus
:oops:
The Door Project
Door is a Virtual Desktop System for Windows
Next Door Version 7.5

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Shelllistview Systemicons einlesen

Beitrag von Socke »

DoorPro hat geschrieben:ich habe jetzt fast 2 Wochen nach ner Lösung gesucht aber keine gefunden.
Nach was hast du denn gesucht?

http://lmgtfy.com/?q=delphi+tshelllistview+icon ... Swissdelphicenter.ch hat viele gute Ansätze; teilweise -- wie dieser hier -- aber nur für Windows
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

DoorPro
Beiträge: 15
Registriert: Do 8. Mär 2012, 13:02
OS, Lazarus, FPC: Windows (L 0.9.30.2 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: Xanten
Kontaktdaten:

Re: Shelllistview Systemicons einlesen

Beitrag von DoorPro »

Klar das hab ich auch gefunden.
Nur die Dateien habe ich ja schon nur das dazu gehörige Symbol fehlt halt.

Außerdem hab ich seit heute probleme mit der dieser procedure
da im abschnitt
with ShellListView do
Hält der Compiler an und sagt das er shelllistview nicht finden kann.
The Door Project
Door is a Virtual Desktop System for Windows
Next Door Version 7.5

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Shelllistview Systemicons einlesen

Beitrag von DiBo33 »

Hält der Compiler an und sagt das er shelllistview nicht finden kann.
Dann überlege mal ganz, ganz, ganz scharf woran das wohl liegen könnte.

Wie heißt denn dein TShellListview?

DoorPro
Beiträge: 15
Registriert: Do 8. Mär 2012, 13:02
OS, Lazarus, FPC: Windows (L 0.9.30.2 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: Xanten
Kontaktdaten:

Re: Shelllistview Systemicons einlesen

Beitrag von DoorPro »

DiBo33 hat geschrieben:
Hält der Compiler an und sagt das er shelllistview nicht finden kann.
Dann überlege mal ganz, ganz, ganz scharf woran das wohl liegen könnte.

Wie heißt denn dein TShellListview?
Nun wenn du ShellListview1 meinst weiß ich aber das geht leider auch nicht.
Also so doof bin ich jetzt echt nicht
The Door Project
Door is a Virtual Desktop System for Windows
Next Door Version 7.5

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Shelllistview Systemicons einlesen

Beitrag von DiBo33 »

Dann zeige deinen Code

DoorPro
Beiträge: 15
Registriert: Do 8. Mär 2012, 13:02
OS, Lazarus, FPC: Windows (L 0.9.30.2 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: Xanten
Kontaktdaten:

Re: Shelllistview Systemicons einlesen

Beitrag von DoorPro »

uses
ShellApi;

Code: Alles auswählen

procedure LV_InsertFiles(strPath: string; ListView: TListView; ImageList: TImageList);
var
  i: Integer;
  Icon: TIcon;
  SearchRec: TSearchRec;
  ListItem: TListItem;
  FileInfo: SHFILEINFO;
begin
  // Create a temporary TIcon
  Icon := TIcon.Create;
 ListView.Items.BeginUpdate;
  try
    // search for the first file
    i := FindFirst(strPath + '*.*', faAnyFile, SearchRec);
    while i = 0 do
    begin
      with ListView do
      begin
        // On directories and volumes
        if ((SearchRec.Attr and FaDirectory <> FaDirectory) and
          (SearchRec.Attr and FaVolumeId <> FaVolumeID)) then
        begin
          ListItem := ListView.Items.Add;
          //Get The DisplayName
          SHGetFileInfo(PChar(strPath + SearchRec.Name), 0, FileInfo,
            SizeOf(FileInfo), SHGFI_DISPLAYNAME);
          Listitem.Caption := FileInfo.szDisplayName;
          // Get The TypeName
          SHGetFileInfo(PChar(strPath + SearchRec.Name), 0, FileInfo,
            SizeOf(FileInfo), SHGFI_TYPENAME);
          ListItem.SubItems.Add(FileInfo.szTypeName);
          //Get The Icon That Represents The File
          SHGetFileInfo(PChar(strPath + SearchRec.Name), 0, FileInfo,
            SizeOf(FileInfo), SHGFI_ICON or SHGFI_SMALLICON);
          icon.Handle := FileInfo.hIcon;
          ListItem.ImageIndex := ImageList.AddIcon(Icon);
          // Destroy the Icon
          DestroyIcon(FileInfo.hIcon);
        end;
      end;
      i := FindNext(SearchRec);
    end;
  finally
    Icon.Free;
    ListView.Items.EndUpdate;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  // Assign a Imagelist to the ListView
  ListView1.SmallImages := ImageList1;
  // Show Listview in Report Style and add 2 Columns
  ListView1.ViewStyle := vsReport;
  ListView1.Columns.Add;
  ListView1.Columns.Add;
  LV_InsertFiles('C:\Windows\', ListView1, ImageList1);
end;

So nicht wundern das ist der Orginal code von: http://www.swissdelphicenter.ch/de/showcode.php?id=421" onclick="window.open(this.href);return false;

Mir gehts ja eigendlich nur darum es so zu ändern das die entsprechden Icon noch zu den bestehenden eintragen in der Shelllistview1 hinzufügen.

PS: Bitte denkt euch statt Listview einfach Shelllistview1
Zuletzt geändert von DoorPro am So 11. Mär 2012, 18:27, insgesamt 2-mal geändert.
The Door Project
Door is a Virtual Desktop System for Windows
Next Door Version 7.5

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Shelllistview Systemicons einlesen

Beitrag von DiBo33 »

Bitte den Quellcode entsprechend formatieren [code=laz]...[/code]

> So nicht wundern das ist der Orginal code von: http://www.swissdelphicenter.ch/de/showcode.php?id=421" onclick="window.open(this.href);return false;

Klasse und wir sollen jetzt anhand diesen Code den Fehler in deinem Code finden?
Sorry aber bei der Hellseherprüfung falle ich immer durch.

DoorPro
Beiträge: 15
Registriert: Do 8. Mär 2012, 13:02
OS, Lazarus, FPC: Windows (L 0.9.30.2 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: Xanten
Kontaktdaten:

Re: Shelllistview Systemicons einlesen

Beitrag von DoorPro »

DiBo33 hat geschrieben:Bitte den Quellcode entsprechend formatieren > So nicht wundern das ist der Orginal code von: http://www.swissdelphicenter.ch/de/showcode.php?id=421" onclick="window.open(this.href);return false;

Klasse und wir sollen jetzt anhand diesen Code den Fehler in deinem Code finden?
Sorry aber bei der Hellseherprüfung falle ich immer durch.
Oh schön für dich
Ich persönlich finde diese Antwort von dir etwas unfreundlich!
Außerdem denke ich wohl das man sich immer gegenseitig Helfen sollte.
:x
The Door Project
Door is a Virtual Desktop System for Windows
Next Door Version 7.5

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Shelllistview Systemicons einlesen

Beitrag von Socke »

DoorPro hat geschrieben:Oh schön für dich
Ich persönlich finde diese Antwort von dir etwas unfreundlich!
Außerdem denke ich wohl das man sich immer gegenseitig Helfen sollte.
:x
Wenn du fremden Quelltext verwendest (zum Beispiel von swissdelphicenter.ch), dann musst du den natürlich an deinen eigenen vorhandenen Quelltext anpassen. Daher versuche bitte zuerst den Quelltext selbst anzupassen, da bei diesem Schritt dir niemand helfen kann, der deinen eigenen Quelltext nicht kennt. Von daher halte ich die Forderung, deinen eigenen Quelltext hier zu posten als gerechtfertigt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Shelllistview Systemicons einlesen

Beitrag von DiBo33 »

Ich persönlich finde diese Antwort von dir etwas unfreundlich!
Außerdem denke ich wohl das man sich immer gegenseitig Helfen sollte.
Naja, überlege mal.
Dein Auto geht nicht, du zeigst den Mechaniker ein funktionierendes und sagst zu ihm "Sie müssen es sich jetzt nur in rot vorstellen".

DoorPro
Beiträge: 15
Registriert: Do 8. Mär 2012, 13:02
OS, Lazarus, FPC: Windows (L 0.9.30.2 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: Xanten
Kontaktdaten:

Re: Shelllistview Systemicons einlesen

Beitrag von DoorPro »

So das ist jetzt mein Quelltext.
Jetzt Aktualisiert

Code: Alles auswählen

procedure LV_InsertFiles(strPath: string; ShellListView1: TShellListView; ImageList: TImageList);
var
  i: Integer;
  Icon: TIcon;
  SearchRec: TSearchRec;
  ListItem: TListItem;
  FileInfo: SHFILEINFO;
begin
  // Create a temporary TIcon
  Icon := TIcon.Create;
ShellListView1.Items.BeginUpdate;
  try
    // search for the first file
    i := FindFirst(strPath + '*.*', faAnyFile, SearchRec);
    while i = 0 do
    begin
      with ShellListView1 do
      begin
        // On directories and volumes
        if ((SearchRec.Attr and FaDirectory <> FaDirectory) and
          (SearchRec.Attr and FaVolumeId <> FaVolumeID)) then
        begin
          ListItem := ShellListView1.Items.Add;
          //Get The Icon That Represents The File
          SHGetFileInfo(PChar(strPath + SearchRec.Name), 0, FileInfo,
            SizeOf(FileInfo), SHGFI_ICON or SHGFI_SMALLICON);
          icon.Handle := FileInfo.hIcon;
          ListItem.ImageIndex := ImageList.AddIcon(Icon);
          // Destroy the Icon
          DestroyIcon(FileInfo.hIcon);
        end;
      end;
      i := FindNext(SearchRec);
    end;
  finally
    Icon.Free;
    ShellListView1.Items.EndUpdate;
  end;
end;  
end;
Der Aufruf

Code: Alles auswählen

procedure TForm1.ShellTreeView1Click(Sender: TObject);
begin
  combobox1.text := ShellTreeView1.GetSelectedNodePath;
  ShellListView1.SmallImages := ImageList1;
  LV_InsertFiles(combobox1.text+'\', ShellListView1, ImageList1);
end;
LV_InsertFiles(combobox1.text+'\', ShellListView1, ImageList1);

Leider gibts beim ersten Aufruf noch einen Fehler (RunError42192)
Zuletzt geändert von DoorPro am So 11. Mär 2012, 19:25, insgesamt 4-mal geändert.
The Door Project
Door is a Virtual Desktop System for Windows
Next Door Version 7.5

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Shelllistview Systemicons einlesen

Beitrag von DiBo33 »

Nur ich muss die Procedure noch abspecken.
Ist doch so in Ordnung, viel abspecken wirst du daran nicht können.

DoorPro
Beiträge: 15
Registriert: Do 8. Mär 2012, 13:02
OS, Lazarus, FPC: Windows (L 0.9.30.2 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: Xanten
Kontaktdaten:

Re: Shelllistview Systemicons einlesen

Beitrag von DoorPro »

Und noch was der Eintrag ist jetzt war erweitert aber an der stelle wo das Symbol sein soll ist nix zu sehen

Ach der Fehler tritt immer dann auf wenn ich den eintrag C: in der Shelltreeview1 anklicke
The Door Project
Door is a Virtual Desktop System for Windows
Next Door Version 7.5

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Shelllistview Systemicons einlesen

Beitrag von Bora4d »

Hier ist ist Beispiel wie das Funktioniert:
http://www.lazarus.freepascal.org/index ... 62982.html" onclick="window.open(this.href);return false;

Hier herunterladen (Crossplatform Quelltext komentiert - Verwendung als Tabbed Dateimanager):
http://www.lazarus.freepascal.org/index ... ttach=1707" onclick="window.open(this.href);return false;

(Ja das ist von mir :) )

So siehts aus:
Dateianhänge
Screenshot
Screenshot

Antworten