begin process at 2010 02 10 02:03:14
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > AFFICHEUR D'ICÔNES

AFFICHEUR D'ICÔNES


 Information sur la source

Note :
8,33 / 10 - par 3 personnes
8,33 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Niveau :Expert Date de création :27/04/2002 Date de mise à jour :27/04/2002 17:12:41 Vu / téléchargé :4 606 / 295

Auteur : Delphiprog

Ecrire un message privé
Site perso
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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

  • 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.
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.        

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip TABLE DE CORRESPONDANCE TYPES DE DONNÉES API/PASCAL OBJET
Source avec Zip Source avec une capture GÉNÉRER DES PDF AVEC DELPHI ET PDF CREATOR
Source avec Zip Source avec une capture DESIGN PATTERN OBSERVER : IMPLÉMENTATION RÉUTILISABLE
Source avec Zip DESIGN PATTERN STRATÉGIE APPLIQUÉ AU CODE "JOURNAL DE DÉBUGG...
Source avec Zip Source avec une capture DESSINER UN RECTANGLE DE SÉLECTION AU DESSUS D'AUTRES COMPOS...

 Sources de la même categorie

Source avec Zip NEXTGENS -> UNITÉS DE TYPES ÉVOLUÉS NOUVELLE GÉNÉRATION (DE... par f0xi
Source avec Zip Source avec une capture AUTO-COMPLÉTION D'UN CONTRÔLE DE SAISIE par Bacterius
Source avec Zip CARDS GAME SDK 1.0.0.0 par f0xi
Source avec Zip Source avec une capture TRAYICON - VOTRE ICONE DANS LA BARRE DES TACHES par Bacterius
Source avec Zip Source avec une capture WINHIDER _ CACHER UN PROGRAMME DE L'ÉCRAN ET DE LA BARRE DE ... par soldier8514

Commentaires et avis

Commentaire de Gysmo le 27/04/2002 16:00:44

Je comprend pas, quoi que j'ouvre comme fichier (exe, dll, ico) j'obtient ce message : 'Ce fichier n'est pas un éxécutable une DLL ou fichier d''icone !' et du coup je n'ai que les petites icones?! J'ai du passer sur quelque chose...
J'ai compiler sous D6 EP.

Commentaire de Gysmo le 27/04/2002 19:26:09

OK ca marche maintenant. Ca sort petite et grande icones.
Il serait maintenant interressant de montrer toutes les icones car il existe plusieur tailles d'icones(16x16, 32x32, 48x48 (sur XP), etc...) dans ce source.

Bye.

Commentaire de Delphiprog le 27/04/2002 22:27:43 administrateur CS

Comme tu l'auras remarqué, ce code est écrit avec Delphi 4 et la fonction qui utilise les API, à savoir ExtractIconEx, ne connaît que les petites et les grandes icônes. Je vais regarder si Delphi 6 permet d'aller plus loin pour afficher les icones 48x48. Je ne garantis rien. Mais c'est un bon exercice.

Commentaire de Papy67 le 15/01/2003 11:32:53

tres astucieux ta parade au bug extractIcon
remarque ce bug semble resolu dans delphi 7

Commentaire de romaigoupil le 24/04/2003 02:16:15

il suffit de rajouter UINT(-1) à la place de -1.

Commentaire de cirec le 24/09/2005 23:22:48 administrateur CS

Cardinal(-1) ca fonctionne très bien aussi
de delphi 4 à ...

Commentaire de cheragasalhi le 26/02/2008 12:56:29 8/10

très bien a se que vous pouvez affichiez des icônes de type png, ico sur un menu c oui svp aide moi

Commentaire de Delphiprog le 27/02/2008 09:23:25 administrateur CS

@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+

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,061 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales