TIcon.Width ist immer Null

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
hitzi
Beiträge: 13
Registriert: Di 22. Jan 2008, 11:51

TIcon.Width ist immer Null

Beitrag von hitzi »

Hallo,

ich hole mir die Symbole der einzelnen Laufwerke unter Windows mit der folgenden Anweisung:

Code: Alles auswählen

FileInfoResult :=SHGetFileInfo(PChar(path), 0, FileInfo, sizeof(FileInfo), SHGFI_ICON or SHGFI_SMALLICON);
if FileInfoResult <> 0 then begin
  resultIcon.Handle := FileInfo.hIcon;
  //resultIcon.Width und auch height sind an der Stelle immer Null 
end;
Warum sind Width und height null? Wie komm ich alternativ an die Breite des Icons?


Achso ... das Icon ist aber vorhanden. Mit DrawIconEx und resultIcon kann ich mir das Icon anzeigen lassen.

Viele Grüße
Hitzi

hitzi
Beiträge: 13
Registriert: Di 22. Jan 2008, 11:51

Beitrag von hitzi »

Hier ist die Lösung:

Code: Alles auswählen

var FileInfo : TSHFileInfo;
      myIconInfo: TIconInfo;
      myBitmap: TBitmap;
      r : TRect;
 
[...]
begin
  if not Assigned(resultItem.Icon) then resultItem.Icon := TIcon.Create;
  if SHGetFileInfo(PChar(path), 0, FileInfo, sizeof(FileInfo), SHGFI_ICON or SHGFI_SMALLICON) then begin
    if (FileInfo.hIcon <> 0) and GetIconInfo(FileInfo.hIcon, myIconInfo) then begin
      try
        if GetObject(myIconInfo.hbmColor, SizeOf(myBitmap), @myBitmap) <> 0 then begin
          r.Top:=0;
          r.Left:=0;
          r.Right:=myBitmap.bmWidth;
          r.Bottom:=myBitmap.bmHeight;
          resultItem.Icon.CreateFromBitmapHandles(myIconInfo.hbmColor, myIconInfo.hbmMask, r);
        end;
      finally
        DeleteObject(myIconInfo.hbmMask);
        DeleteObject(myIconInfo.hbmColor);
      end;
    end;    
[...]

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

Danke für die Lösung.

Euklid

hitzi
Beiträge: 13
Registriert: Di 22. Jan 2008, 11:51

Beitrag von hitzi »

Hier mal die ganze Funktion, mit der man das Icon, die Beschreibung und den Typnamen eines Pfades oder einer Datei ermitteln kann:

Code: Alles auswählen

const SHGFI_ICON              = $000000100;     
        SHGFI_DISPLAYNAME       = $000000200;     
        SHGFI_TYPENAME          = $000000400;     
        SHGFI_SMALLICON         = $000000001;
 
procedure GetFileInfos(Path : string; var Description : string; var TypeName : string; var myIcon : TIcon);
var fileInfo : TSHFileInfo;
    myIconInfo: TIconInfo;
    myBitmap: TBitmap;
begin
  if not Assigned(myIcon) then myIcon := TIcon.Create;
  Description := '';
  TypeName := '';
  if length(Path) = 1 then Path := Path + ':';
  if Pos(PathDelim, Path) = 0 then Path := Path + PathDelim;
  if SHGetFileInfo(PChar(Path), 0, fileInfo, sizeof(FileInfo), SHGFI_ICON or SHGFI_SMALLICON or SHGFI_DISPLAYNAME or SHGFI_TYPENAME) <> 0 then begin
    if (fileInfo.hIcon <> 0) and GetIconInfo(fileInfo.hIcon, myIconInfo) then begin
      try
        if GetObject(myIconInfo.hbmColor, SizeOf(myBitmap), @myBitmap) <> 0 then begin
          myIcon.CreateFromBitmapHandles(myIconInfo.hbmColor, myIconInfo.hbmMask, Types.Rect(0, 0, myBitmap.bmWidth, myBitmap.bmHeight));
        end;
      finally
        DeleteObject(myIconInfo.hbmMask);
        DeleteObject(myIconInfo.hbmColor);
      end;
    end;
    Description := FileInfo.szDisplayName;
    TypeName := fileInfo.szTypeName;
  end;
end;
Description enthält unter Vista die eingedeutschten Namen der Verzeichnisse. Beispiel Findfirst/Findnext ermittelt alle Verzeichnisse von der Systemplatte. Das Verzeichnis Benutzer erscheint in der ermittelten Liste als "User". Jetzt einfach den Pfad an die oben genannte Funktion übergeben und Description enthält bei der Rückgabe den lokalisierten Namen dieses Verzeichnisses.

Viele Grüße
Hitzi

Antworten