Afficheur d'icônes

Soyez le premier à donner votre avis sur cette source.

Vue 7 351 fois - Téléchargée 488 fois

Description

Un petit bug dans Delphi empêche d'utiliser correctement la fonction ExtractIcon. Cet exemple démontre l'utilisation, à la place, de la fonction ExtractIconEx et comment récupérer les grandes comme les petites icônes.

Source / Exemple :


unit UExtractIcon;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    btnLoadIcon: TButton;
    Image1: TImage;
    OpenDialog1: TOpenDialog;
    UpDown1: TUpDown;
    Label1: TLabel;
    Label2: TLabel;
    chbxSmall_Ico: TCheckBox;
    procedure btnLoadIconClick(Sender: TObject);
    procedure UpDown1Changing(Sender: TObject; var AllowChange: Boolean);
    procedure chbxSmall_IcoClick(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form1             : TForm1;

implementation

{$R *.DFM}
uses
  ShellApi;

var
  phIconLarge       : HIcon = 0;
  phIconSmall       : HIcon = 0;
  Uicon             : Hicon;
  NbrIcons          : Longint = 0;
  Change            : boolean = True;

procedure TForm1.btnLoadIconClick(Sender: TObject);
const
  sContient         = 'Fichier : %s - Icônes : %d';
  CrLf              = #13#10;
begin
  if OpenDialog1.Execute then
    if FileExists(OpenDialog1.FileName) then
      begin
        //Effacer l'image actuelle
        Image1.Picture := nil;
        {Contrairement à ce qui est écrit dans l'aide
        de Delphi, on ne peut pas passer -1 comme valeur dans le
        dernier paramètre de la fonction ExtractIcon puisque ce
        paramètre est déclaré de type Cardinal !
        NbrIcons := ExtractIconEx(Handle, PChar(OpenDialog1.FileName), -1);
        Delphi refuse donc de compiler. Deux solutions : modifier le code
        source fourni avec Delphi ou bien trouver une solution plus élégante ?

        La deuxième solution est retenue car tout le monde n'a pas les codes
        sources de l'unité ShellApi. Nous utilisons donc la fonction
        ExtractIconEx qui nous permet de récupérer les petites comme les
        grandes icones. Avouez que nous n'avons rien perdu au change !}
        NbrIcons := ExtractIconEx(PChar(OpenDialog1.FileName),
          -1,
          phIconLarge,
          phIconSmall,
          MaxInt);
        //N'autoriser une action sur le contrôle UpDown1
        //que s'il y a au moins une icône dans le fichier
        UpDown1.Enabled := NbrIcons > 0;

        case NbrIcons of
          0: ShowMessage('Ce fichier ne contient aucune icône.');
          else
            with UpDown1 do
              begin
              //Le tableau d'icônes est indexé de 0..(n-1)
                Max := NbrIcons - 1;
              //Positionner sur le première
                Position := 0;

                Label1.Caption := Format(sContient,
                  [ExtractFileName(OpenDialog1.FileName),
                  NbrIcons]);
              //Simuler un clic sur le UpDown1
                UpDown1Changing(self, Change);
              end;
        end;
      end;
end;

procedure TForm1.UpDown1Changing(Sender: TObject;
  var AllowChange: Boolean);
const
  IcoPosition       = 'Icone %d/%d';
begin
  //Récupérer le handle selon propriété Position du contrôle UpDown
  UIcon := ExtractIconEx(pchar(OpenDialog1.FileName),
    UpDown1.Position,
    phIconLarge,
    phIconSmall,
    1);
  with Image1.Picture.Icon do
    case chbxSmall_Ico.Checked of
      False: //Affichage de la grande icône
        Handle := phIconLarge;
      True: //Affichage de la grande icône
        Handle := phIconSmall;
    end;

  //Informer sur la position dans le tableau des icônes
  Label2.Caption := Format(IcoPosition, [UpDown1.Position + 1, NbrIcons]);
end;

procedure TForm1.chbxSmall_IcoClick(Sender: TObject);
begin
  //Réactualiser affichage icône
  UpDown1Changing(nil, Change);
end;

end.

Conclusion :


Ecrit avec Delphi 4 pour permettre au maximum de personnes de profiter de ce code.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
cs_Delphiprog
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Membre
Dernière intervention
9 janvier 2013
31
27 févr. 2008 à 09:23
@cheragasalhi : ta question doit être posée sur le forum et non ici car on s'écarte de l'objet de ce code-source. D'avance, merci. A+
cheragasalhi
Messages postés
31
Date d'inscription
lundi 10 décembre 2007
Statut
Membre
Dernière intervention
17 juin 2009

26 févr. 2008 à 12:56
très bien a se que vous pouvez affichiez des icônes de type png, ico sur un menu c oui svp aide moi
cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 2022
48
24 sept. 2005 à 23:22
Cardinal(-1) ca fonctionne très bien aussi
de delphi 4 à ...
romaigoupil
Messages postés
1
Date d'inscription
vendredi 18 avril 2003
Statut
Membre
Dernière intervention
24 avril 2003

24 avril 2003 à 02:16
il suffit de rajouter UINT(-1) à la place de -1.
cs_Papy67
Messages postés
51
Date d'inscription
mercredi 25 décembre 2002
Statut
Membre
Dernière intervention
17 mars 2008

15 janv. 2003 à 11:32
tres astucieux ta parade au bug extractIcon
remarque ce bug semble resolu dans delphi 7
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.