IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

controle de n button


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Points : 10
    Points
    10
    Par défaut controle de n button
    salut tout le monde je cherche à afficher n bouttons selon mon besoin (une valeur entrée par l'utilisateur de mon programme) j'ai reussit à le faire mais le probleme et que je veux executer une instruction quelquonque en cliquant sur chaque button. comment le faire merci d'avance

  2. #2
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Salut,

    Tu peux affecter une procédure à l'évènement OnClick des boutons (comme tous les évènements, c'est une propriété (comme les property) qui attent un type procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //pour le ième bouton 
    Button[i].OnClick:=TaProcédure;
    Mieux, il t'es possible de faire un tableau de procédures et d'affecter tes diverses procédures à tes boutons.

    Pour de plus amples informations voici une future FAQ :
    [QR] Un tableau de procédures ? Comment et pourquoi ?

    L'utilisation de l'instruction case ... of en Delphi, quoique pratique dans la plupart des cas de programmation peut parfois se révéler inappropriée lorsque le nombre de branchements devient trop grand :
    • Lourdeur du code
    • Vitesse d'exécution désastreuse.
    Ce cas peut parfois être rencontré lorsque l'on écrit par exemple :
    • un émulateur : on effectue une action particulière différente pour chaque instruction du microprocesseur. Dans ce cas, la vitesse d'exécution est primordiale.
    • un jeu d'aventure :
      • Chaque case d'une carte peut être un type de rencontre différente
      • Chaque objet possédé par le héros possède un effet différent lorsqu'il est utilisé, chaque arme une attaque particulière, chaque sortilège déclenche un effet particulier
      Dans ce cas c'est la clarté du code qui permettra le design d'un univers riche en contenu et rebondissements.

    Par exemple, ce type de code...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    procedure TForm1.UneActionADeterminer(Parametre:integer);
    begin
      ...
      case Parametre of
          0:MaProcedure0;
          1:MaProcedure1;
          2:MaProcedure2;
          3:MaProcedure3;
          4:MaProcedure4;
          5:MaProcedure5;
          .....
          203:MaProcedure203;
          //etc...
      end;
      ...
    end;
    ...gagnera en clarté et en célérité si nous pouvions le transformer en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.UneActionADeterminer(Parametre:integer);
    begin
      ...
      MesProcedures[Parametre];      
      ...
    end;
    Nous venons de présenter ici le cas d'un tableau de procédures sans paramètre. Nous allons voir qu'il est tout aussi possible d'utiliser un tableau de fonctions ou bien encore d'utiliser des paramètres.

    Pour aboutir à ce résultat, nous devons :
    1. Définir un type de variable pouvant contenir un type générique de procédure ou de fonction avec ou sans paramètre (Variables procédurales) :
      Il s'agit de définir ici un type de variable un peu particulière destiné à recevoir une procédure ou une fonction. Ce genre de variable s'appelle une variable procédurale. La syntaxe pour déclarer ce type de variable est la suivante :
      <Nom du Type> = <procedure ou function>[(<paramètres>)[:<type de resultat>]] [of object;]
      (Nota : "of object" signifie que nos procédures ou fonctions seront définies dans une classe comme TForm1 par exemple : elles font partie d'un objet.)
      Ainsi aurons nous ce genre de déclarations pour des :
    2. Ecrire nos procédures ou fonctions :
      L'exemple suivant concerne des fonctions avec paramètres, définies dans une classe (notez le "of object")
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      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
      type
       
      TOperationArithmetique=function(a,b:real):real of object;
       
      TForm1 = class(TForm)
          ...
        private
          { Déclarations privées }
        public
          { Déclarations publiques }
          ...
          TableauDeFonctions:array[0..3] of TOperationArithmetique;
          function Addition(a,b:real):real;
          function Multiplication(a,b:real):real;
          function Division(a,b:real):real;
          function Soustraction(a,b:real):real;
          ...
        end;
      ...
      implementation
      ...
      function TForm1.Addition(a,b:real):real;
      begin
        result:=a+b;
      end;
       
      function TForm1.Multiplication(a,b:real):real;
      begin
        result:=a*b;
      end;
      Les fonctions sont des fonctions globales n'appartenant pas à une classe (disparition du "of object" :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      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
      type
       
      TOperationArithmetique=function(a,b:real):real;
       
      TForm1 = class(TForm)
          ...
        private
          { Déclarations privées }
        public
          { Déclarations publiques }
          ...
          TableauDeFonctions:array[0..3] of TOperationArithmetique;
          ...
        end;
       
      function Addition(a,b:real):real;
      function Multiplication(a,b:real):real;
      function Division(a,b:real):real;
      function Soustraction(a,b:real):real;
      ...
      implementation
      ...
      function Addition(a,b:real):real;
      begin
        result:=a+b;
      end;
       
      function Multiplication(a,b:real):real;
      begin
        result:=a*b;
      end;
      ...
    3. Assigner une procédure à chaque élément du tableau :
      Dans cette partie de code, nous allons simplement remplir notre tableau aussi simplement que nous le ferions avec des variables simples comme des entiers ou des chaînes de caractères :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      procedure TForm1.InitialisationDuTableau
      begin
        TableauDeFonctions[0]:=Addition;
        TableauDeFonctions[1]:=Multiplication;
        ...
        //etc... 
      end;
    4. Utiliser notre tableau :
      • Avec des procédures sans paramètres :
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        8
        9
        procedure TForm1.UneActionADeterminer(Parametre:integer);
        begin
          //si Parametre est compris entre la borne inférieure et la borne supérieure du tableau de procédures
          if ((Parametre>=low(TableauDeProcedures)) and (Parametre<=high(TableauDeProcedures)) then
          //si l'entrée du tableau contient effectivement quelque chose (une procédure)
          if Assigned(TableauDeProcedures[Parametre]) then
          //exécution de la procédure ad hoc
          TableauDeProcedures[Parametre];
        end;
      • Avec des fonctions acceptant des paramètres :
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        procedure TForm1.Calcule(OperationChoisie:integer;NombreA,NombreB:real;var resultat:real);
        begin
           if ((OperationChoisie>=0) and (OperationChoisie<=3)) then
           if Assigned(TableauDeFonctions[OperationChoisie]) then
           resultat:=TableauDeFonctions[OperationChoisie](NombreA,NombreB);
        end;

    Un exemple complet :
    Dans un nouveau projet, nous avons placé un TButton sur notre fiche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    type
      //Définition d'un type de procedure simple
      TProcedureAffichage=procedure of object;
     
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        TableauDeProcedures:array[0..2] of TProcedureAffichage;
        procedure AffichageShowMessage;
        procedure AffichageDansLaFiche;
        procedure AffichageBarreDeTitre;
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    { TForm1 }
     
    procedure TForm1.AffichageShowMessage;
    begin
      showmessage('Procedure n°1');
    end;
     
    procedure TForm1.AffichageDansLaFiche;
    begin
      canvas.font.Color:=random($ffffff);
      canvas.TextOut(10,10,'Procédure n°2');
    end;
     
    procedure TForm1.AffichageBarreDeTitre;
    var i:integer;
        oldcaption:string;
    begin
      oldcaption:=Caption;
      for i:=0 to 9 do
      begin
        caption:='Procedure n°3';
        sleep(200);
        caption:='';
        sleep(100);
      end;
      caption:=oldcaption;
    end;
     
    //Evènement OnClick du Bouton
    procedure TForm1.Button1Click(Sender: TObject);
    var i:integer;
    begin
      //choix aléatoire d'une procedure d'affichage
      i:=Random(3);
      if assigned(TableauDeProcedures[i]) then
      TableauDeProcedures[i];
    end;
     
    //Evènement OnCreate de la fiche
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Randomize;
      TableauDeProcedures[0]:=AffichageShowMessage;
      TableauDeProcedures[1]:=AffichageDansLaFiche;
      TableauDeProcedures[2]:=AffichageBarreDeTitre;
    end;
     
    end.
    Précision sur les variables procédurales : pointeurs ou variables ?
    C'est un grand débat qui dépasse le cadre et l'objectif de cette simple FAQ. En effet, il est tout de même étonnant de constater que bien que ce type se gère comme une variable classique, c'est un type de variable à laquelle s'applique le @, le nil et le Assigned()des pointeurs. Si vous souhaitez approfondir le sujet, nous vous suggérons la lecture de la documentation de Delphi aux rubriques suivantes :
    • Assigned,fonction
    • Types procédure
    • Types procédure dans les instructions et les expressions

    Faites vos jeux !
    Bidouilleuse Delphi

  3. #3
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Et bien au moment de la création de chaque bouton, il suffit de "brancher" l'évenement OnClick vers une méthode d'objet.
    L'exemple suivant branche le meme évenement pour TOUS les boutons créés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    type
      TForm1 = class(TForm)
        btn1: TButton;
        procedure btn1Click(Sender: TObject);
      private
        procedure FaireBouttonClick(Sender: TObject);
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.btn1Click(Sender: TObject);
    var
      vIndice,
      vNbeBtn: Integer;
    begin
      vNbeBtn := 10;
      for vIndice := 1 to vNbeBtn do
        begin
          with TButton.Create(Self) do
            begin
              Top := Random(Self.Height);
              Left := Random(Self.Width);
              Caption := 'Bouton n°'+IntToStr(vIndice);
              // Name := 'MonButon'+IntToStr(vIndice);
              OnClick := FaireBouttonClick;
              Parent := Self;
            end;
        end;
    end;
     
    procedure TForm1.FaireBouttonClick(Sender: TObject);
    begin
      ShowMessage('Vous venez de cliquer sur : '+(Sender as TButton).Caption);
      // if (Sender as TButton).Name = 'MonButon2' then
      //   ....
    end;
    La distinction du bouton, peut se faire avec la propriété Name, ou bein Caption, ou Tag...
    "Si vous voulez être l’esclave des banques et payer pour financer votre propre esclavage, alors laissez les banquiers créer la monnaie" - Josiah Stamp, 1920, Gouverneur de la Banque d’Angleterre
    "Qui ne peut acheter ruine qui voudrait vendre" - Jacques Duboin.
    "Nous n'héritons pas la terre de nos parents, nous l'empruntons à nos enfants." - Antoine de Saint Exupéry

Discussions similaires

  1. Silverlight Bing maps control et radio button
    Par mekongboy dans le forum Silverlight
    Réponses: 1
    Dernier message: 12/05/2012, 08h11
  2. Réponses: 4
    Dernier message: 30/04/2010, 13h34
  3. Réponses: 4
    Dernier message: 11/05/2006, 18h04
  4. [C#]comment donner un style XP à mes controles (button,...)
    Par hassanibi dans le forum Windows Forms
    Réponses: 8
    Dernier message: 03/09/2005, 17h20
  5. Question sur un controle de type "button"
    Par Invité dans le forum Windows
    Réponses: 2
    Dernier message: 29/05/2004, 11h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo