[delphi] filelistbox met icoontjes, hoe kom ik aan de ico's?

Pagina: 1
Acties:

  • Hardcell
  • Registratie: November 2004
  • Laatst online: 03-02-2023
Ik ben bezig met een e-mail applicatie. Nu wil ik hier attachments mogelijk maken en wil ik een listbox waar bestanden, het bijbehorende icoontje (bijv. een acrobat reader ico voor een pdf, een winamp ico voor mp3 enz) inpassen.
Hoe kom ik aan deze icoontjes? Zijn deze op een of andere manier uit het bestand te trekken?
Ik kan hier niets voor vinden, ook voorgebouwde componenten waar ik iets mee kan vind ik niet. Enkel filelistbox componenten die de inhoud van een bepaalde directory laten zien. Helaas zijn deze (bijvoorbeeld die van raize components) zonder source dus ik kan niet ff kijken hoe die dat aanpakken.

Any suggestions?

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Zie MSDN

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 21-04 13:13
Icoontjes zitten over het algemeen ingebakken in de applicaties welke het bestandsformaat ondersteunen (bijv in winamp.exe zitten n aantal icoonen), in DLL's, of simpelweg in *.ico bestanden.

Verder heeft Apache al een icons/ map met een aantal icoontjes welke worden gebruikt bij de directorylisting. Ook zou je zelf een library kunnen opbouwen met icoontjes welke je bijv. met Google vind.
Voor Linux zijn een groot aantal stijlen aan icoontjes beschikbaar, waar vast wel wat naar jouw smaak tussen zit.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Of de win32 function SHGetFileInfo gebruiken met de SHGFI_ICON parameter. Zo ook http://www.scalabium.com/faq/dct0014.htm

We adore chaos because we like to restore order - M.C. Escher


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 08:01

Tomatoman

Fulltime prutser

Ik heb eens in mijn code zitten kijken en kwam de volgende functie tegen:

[Edit]
Meteen netjes gedocumenteerd en wat algemener gemaakt.
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
uses
  ShellAPI, ImgList;

{ GetShellIcon retrieves the shell icon associated with a file.
    - ImageList: An image list whose handle will be set to the system image
      list, which contains all shell images. The original images in the list are
      erased.
    - FileName: The file for which to retrieve the shell image.
    - Large: If false, the file's small icon (16x16 pixels) is retrieved. If
      true, the file's large icon (32x32 pixels) is retrieved.
  Result:
    The index of the icon in the image list on success or -1 on failure. }

function GetShellIcon(ImageList: TCustomImageList; const FileName: string;
  Large: Boolean): Integer;
const
  SizeFlags: array[Boolean] of UINT = (SHGFI_SMALLICON, SHGFI_LARGEICON);
var
  FileInfo: TSHFileInfo;
  Flags: Integer;
  Handle: THandle;
begin
  Flags := SHGFI_SYSICONINDEX or SizeFlags[Large];
  Handle := SHGetFileInfo(PChar(FileName), 0, FileInfo, SizeOf(FileInfo),
    Flags);
  if Handle <> 0 then
  begin
    if ImageList.Handle <> Handle then
      ImageList.Handle := Handle;
    Result := FileInfo.iIcon;
  end
  else
    Result := -1;
end;
Het tekenen van een image op een canvas gaat heel eenvoudig met TImageList.Draw. Hieronder een voorbeeld om op positie (100, 100) op Form1 de icon van een Worddocument te tekenen.
Delphi:
1
2
3
MijnImageList.DrawingStyle := dsTransparent;
MijnImageList.Draw(Form1.Canvas, 100, 100,
  GetShellIcon(MijnImageList, 'C:\test\document1.doc', True));

[ Voor 56% gewijzigd door Tomatoman op 01-12-2005 23:15 ]

Een goede grap mag vrienden kosten.


  • Hardcell
  • Registratie: November 2004
  • Laatst online: 03-02-2023
Op 1 klein puntje na werkt die GetShellIcon perfect. Als ik die functie loslaat op een bestand dan komen er ipv 1 18 images in de imagelist.
Is er nog een handige manier om alleen de juiste erin te zetten of gewoon bij iedere die ik toevoeg ff alle images die ik niet nodig heb uit de list verwijderen?

edit:

Nog een andere issue waar ik nu pas achter kom. Als ik die andere 17 uit de imagelist flikker en ik start een nieuwe opendialog dan staan er hier ineens geen icoontjes meer voor de bestandsnamen?! :?

[ Voor 27% gewijzigd door Hardcell op 01-12-2005 11:10 ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je gooit ze namelijk ooit windows weg. Het is niet een copy die je maakt, maar je krijgt echt toegang tot de lijst die windows gebruikt.

We adore chaos because we like to restore order - M.C. Escher


  • Hardcell
  • Registratie: November 2004
  • Laatst online: 03-02-2023
hmm okee, nou ik copy dan gewoon degene die ik nodig heb naar een andere imagelist en ik gebruik deze alleen voor de hele zooi steeds in te laden..

Anyway, bedankt voor de hulp! Especially tomatoman!

[ Voor 16% gewijzigd door Hardcell op 01-12-2005 11:41 ]

Pagina: 1