Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Systemicons und Listview (https://www.delphipraxis.net/21893-systemicons-und-listview.html)

Christian Seehase 28. Mai 2004 15:49

Re: Systemicons und Listview
 
Moin Mathias,

Zitat:

Zitat von MathiasSimmack
"ShGetFileInfo" funktioniert IMHO leider nicht mit "Bruchstücken",

doch, man kann auch nur die Extension nehmen, und erhält dann das korrekte Handle auf das Icon in der Systemimagelist zurück.
Ich hatte erst vor kurzem dazu ein Beispiel gepostet (Hier im Forum suchenSHGetFileInfo)

Thunderchild 1. Jun 2004 14:31

Re: Systemicons und Listview
 
Ich habe gestern den ganzen Tag Codeschnipsel und Beiträge hier zu diesem Thema gelesen, weil ich in meinem FTP-Client gern Windows-Icons für die FTP-Liste nehmen möchte. Aber das Höchste, was ich bis jetzt als Index aus GetFileInfo gekriegt habe, ist 2. Das heißt, bis jetzt habe ich nur OverlayIcons zu sehen bekommen. Bitte sag mir einer, was hier falsch ist. Es ist übrigens ein MDI-Programm. Die Imagelist für die Systemicons ist im Hauptformular, die Listenansicht befindet sich auf dem jeweiligen MDIchild.

OnCreate des Hauptformulars:
Delphi-Quellcode:
var   hIl:HIMAGELIST;
    fi:TSHFileInfo;
begin
  hIl:=HIMAGELIST(SHGetFileInfo('',0,fi,sizeof(fi),
       SHGFI_SYSICONINDEX or SHGFI_SMALLICON));
  if(hIl<>0) then ilShellIcons.Handle:=hIl;
  // ShareImages ist schon zur Entwurfszeit auf true gesetzt
  // [...]
end;
Die Prozedur, die den ListView füllt:
Delphi-Quellcode:
procedure RefreshList;
var fi:TSHFileInfo; Item:tListItem;
begin
  // [...]
  // Programmeinstellung: Windows-Icons verwenden?
  if fm.Settings.FTPicons=2 then begin
    ZeroMemory(@fi,sizeof(TSHFileInfo)); // brauche ich das überhaupt jedes mal?

    // l ist vom Typ TidListItems, also das Listing des akt. Verzeichnisses.
    SHGetFileInfo(PChar('c:\'+l[i].FileName),0,fi,SizeOf(fi),
                  SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
    Item.ImageIndex:=fi.iIcon;
  end
end;

MathiasSimmack 1. Jun 2004 15:29

Re: Systemicons und Listview
 
Zitat:

Zitat von Christian Seehase
doch, man kann auch nur die Extension nehmen, und erhält dann das korrekte Handle auf das Icon in der Systemimagelist zurück.

Stimmt, mein Fehler :oops:. Ich hatte vergessen, dass es das Flag SHGFI_USEFILEATTRIBUTES gibt.

@Thunderchild: Was war jetzt dein Problem? Du hast Dateien vom FTP-Server, die´s auf deinem Rechner u.U. nicht gibt. Und darum passen die Symbole nicht. Dann folgende Änderung (wie Christian das bereits angedeutet hat):
Delphi-Quellcode:
  ZeroMemory(@fi,sizeof(fi));
  SHGetFileInfo('.HxS',
    FILE_ATTRIBUTE_NORMAL, <-- Dateiattribut
    fi,sizeof(fi),
    SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_SMALLICON or
    SHGFI_USEFILEATTRIBUTES); <-- Flag
In der "iIcon"-Membervariablen hast du jetzt den Index des HxS-Symbols. Du kannst auch einen Dateinamen angeben. Durch das o.g. Flag und das Dateiattribut spielt´s keine Rolle ob die Datei wirklich existiert oder nicht. Es ist als würde sie existieren.

PS: Ach nee, Lamy wollte das ja wissen.

Thunderchild 1. Jun 2004 21:45

Re: Systemicons und Listview
 
Supi, danke. Das isses.

Da würd ich gern noch ne Frage dran hängen:
Wie ich das Icon eines Ordners bekomme, habe ich schnell raus gefunden. Was hat das aber mit dem SHGFI_OPENICON auf sich? Ich hatte gehofft, das ist der aufgeklappte Ordner. Aber irgendwie geht das wieder nicht. Zurück zu meiner eigentlichen Frage: mit welchen Parametern bekomme ich nun noch das Icon des Arbeitsplatzes? Damit möchte ich die Wurzel des FTP-Directories schmücken.

mfG

MathiasSimmack 1. Jun 2004 21:49

Re: Systemicons und Listview
 
Zitat:

Zitat von Thunderchild
Was hat das aber mit dem SHGFI_OPENICON auf sich? Ich hatte gehofft, das ist der aufgeklappte Ordner.

Ist es normalerweise auch. Ich habe das Ding in der Tree-View-Demo benutzt, und es war aufgeklappt. Bei einigen Spezialordnern (Favoriten, usw.) gibt es IMHO aber keine aufgeklappte Variante.

Zitat:

mit welchen Parametern bekomme ich nun noch das Icon des Arbeitsplatzes?
Puh. Kannst du nicht was einfaches fragen? ;)

Christian Seehase 2. Jun 2004 18:59

Re: Systemicons und Listview
 
Moin Thunderchild,

war eine interessante Frage mit dem Arbeitsplatzicon.
Ich hab's jetzt mal so gelöst:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

var
  fiWork : TSHFileInfo;
  icWork : TIcon;
  pidlDSK : PItemIdList;
  imWork : IMalloc;

begin
  SHGetSpecialFolderLocation(0,CSIDL_DESKTOP,pidlDSK);
  icWork := TIcon.Create;
  try
    SHGetFileInfo(PChar(pidlDSK),0,fiWork,SizeOf(fiWork),SHGFI_PIDL or SHGFI_ICON or SHGFI_SMALLICON);
    icWork.Handle := fiWork.hIcon;
    Canvas.Draw(10,10,icWork);
  finally
    FreeAndNil(icWork);
    SHGetMalloc(imWork);
    imWork.Free(pidlDSK);
  end;
end;

Thunderchild 3. Jun 2004 22:38

Re: Systemicons und Listview
 
Danke für die Antwortarbeit. Welcher Unit kann ich denn die PItemIdList entnehmen? Ferner brauche ich nur den IconIndex. Den möchte ich beim Programmstart ermitteln und dann in einer Vari speichern. Brauche ich dann dieses imWork überhaupt noch?
Gruß

MathiasSimmack 4. Jun 2004 07:40

Re: Systemicons und Listview
 
Du brauchst zwei Units:
Delphi-Quellcode:
uses
  ShlObj,   // für PItemIdList
  ActiveX;  // für IMalloc
Und Ja: mit dem Index geht es auch. Basierend auf Christians Code:
Delphi-Quellcode:
li        := lv.Items.Add;
li.Caption := 'Arbeitsplatz';

if(SHGetSpecialFolderLocation(0,CSIDL_DRIVES,pidlDSK) =
  S_OK) then
try
  SHGetFileInfo(pchar(pidlDSK),0,fi,sizeof(fi),
    SHGFI_PIDL or SHGFI_ICON or SHGFI_SYSICONINDEX);
  li.ImageIndex := fi.iIcon;
finally
  SHGetMalloc(imWork);
end;
wobei ich aber CSIDL_DESKTOP durch CSIDL_DRIVES ersetzt habe, denn im PSDK steht:
Zitat:

CSIDL_DRIVES
The virtual folder representing My Computer, [...]
Das andere wäre dieses Symbol, dass du auch in der Schnellstartleiste siehst, bzw. als Root im Windows-Explorer. Aber das Symbol des Arbeitsplatzes (das auf dem Desktop) ist bei mir ein anderes.

Thunderchild 4. Jun 2004 08:30

Re: Systemicons und Listview
 
Danke, es geht.
Aber nochmal nachgehakt: wozu das SHGETMALLOC? Nach meiner Doku hier übergibt das einen Zeiger an das imWork (also damit damit gearbeitet werden kann). Aber weder wird es in der Indexermittlung verwendet, noch dahinter.

mirage228 4. Jun 2004 08:52

Re: Systemicons und Listview
 
Zitat:

Zitat von Thunderchild
Danke, es geht.
Aber nochmal nachgehakt: wozu das SHGETMALLOC? Nach meiner Doku hier übergibt das einen Zeiger an das imWork (also damit damit gearbeitet werden kann). Aber weder wird es in der Indexermittlung verwendet, noch dahinter.

Also,
Mit SHGetMalloc der Zeiger auf IMalloc geholt wird. Und IMalloc wird dazu benutzt, den im fremden Prozessraum reservierten Speicher für die PItemIdList wieder freigeben zu lassen (da der Speicher dafür ja nicht von uns reserviert wurde, sondern von Windows)...

mfG
mirage228


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:47 Uhr.
Seite 3 von 4     123 4      

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