Afficheur d'icônes

Soyez le premier à donner votre avis sur cette source.

Vue 7 077 fois - Téléchargée 471 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
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
@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+
Messages postés
31
Date d'inscription
lundi 10 décembre 2007
Statut
Membre
Dernière intervention
17 juin 2009

très bien a se que vous pouvez affichiez des icônes de type png, ico sur un menu c oui svp aide moi
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
44
Cardinal(-1) ca fonctionne très bien aussi
de delphi 4 à ...
Messages postés
1
Date d'inscription
vendredi 18 avril 2003
Statut
Membre
Dernière intervention
24 avril 2003

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

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.