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

Langage Delphi Discussion :

affecter une fonction à onclick delphi


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 192
    Points : 65
    Points
    65
    Par défaut affecter une fonction à onclick delphi
    bonjour à tous,
    je veux affecter un champ de ma table a l'évènement d'un bouton , et pour cela j'ai crée une fonction comme tel la ou les autre procédure et function sont déclarées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     procedure  bouton_clik(codeproduit : integer);
    qui est une fonction vide
    et que j'appel la
    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
    Function TForm_Vente_Caisse.Affecte_Bouton():integer;
    var Bouton : tcxbutton;
    begin
      With Datamodule4.affectation_t do
        begin
          Open;
          first;
           while not EOF do
             begin
             Bouton:=Tcxbutton(Form_Vente_Caisse.FindComponent(Datamodule4.affectation_tNOM_BUTTON.Value));
             If Bouton <> Nil
             Then
               begin
                Bouton.Caption := Datamodule4.affectation_tNOM_PROd.Value;
                Bouton.Colors.Default := graphics.Stringtocolor(Datamodule4.affectation_tCOULEUR.Value);
                bouton.OnClick := bouton_clik(Datamodule4.affectation_tCODE_PROD.Value);           end;
             next;
             end;
        end;
    end;
    mon problème a la compilation "il me dite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [DCC Erreur] Vente_Caisse_U.pas(203): E2010 Types incompatibles : 'TNotifyEvent' et 'procedure, untyped pointer or untyped parameter'
    ':' attendu mais ';' trouvé"
    je sais pas ou ça cloche, si vous avez pas une idée n'hésiter

  2. #2
    Membre régulier Avatar de user 56gt8
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 92
    Points
    92
    Par défaut
    C'est parce que le ButtonOnClick envoit 'Sender' comme paramètre.La procédure que tu assigne doit avor les mêmes paramètres: procedure bouton_clik(sender : TObject);
    Un truc pour contourner ca c'est d'assigner l'integer que tu voulais utiliser à la propriété Tag du TButton ( donc le sender).Par la suite tu récupère ca avec
    'sender as':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure  bouton_clik(sender : TObject);
    var : MonIntegerQuiAvantDevaitEtreUnParamètre
    begin
    If sender.className = TButton then MonIntegerQuiAvantDevaitEtreUnParamètre := (sender as TButton).Tag;
    ..........
    end;

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 464
    Points : 24 888
    Points
    24 888
    Par défaut

    Gérer évènement composant runtime - ... on me dit d'ajouter une procédure liée à l'évènement OnClick ...

    En complément de la réponse de user 56gt8, qui donne l'idée du Tag pour le stockage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                Bouton.Caption := Datamodule4.affectation_tNOM_PROd.Value;
                Bouton.Colors.Default := graphics.Stringtocolor(Datamodule4.affectation_tCOULEUR.Value);
                bouton.OnClick := bouton_clik; // Affectation de procédure et non appel !!!
                Bouton.Tag := Datamodule4.affectation_tCODE_PROD.AsInteger;
    Et ceci, pour utiliser correctement le langage Pascal Object en "Delphi"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure  bouton_clik(sender : TObject);
    var 
      MonIntegerQuiAvantDevaitEtreUnParamètre: Integer;
    begin
      // Is peut être remplacé par InheritsFrom, ...
    If sender is TButton then
      MonIntegerQuiAvantDevaitEtreUnParamètre := (sender as TButton).Tag;
    ..........
    end;
    /
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 192
    Points : 65
    Points
    65
    Par défaut
    user 56gt8,
    j'ai pas compri grand chose de ce que tu ma repondu, le probleme n'est pas dans le parametre mais dans le type de retour a ce que je pense, vu que j'assaigne a l'evenement du buton une fonction sans aucun type de retour

  5. #5
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 192
    Points : 65
    Points
    65
    Par défaut
    j'ai modifié mon code suivant vos instruction,voila le code après modification
    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
     Function TForm_Vente_Caisse.Affecte_Bouton():integer;
    var Bouton : tcxbutton;
    begin
      With Datamodule4.affectation_t do
        begin
          Open;
          first;
           while not EOF do
             begin
             Bouton:=Tcxbutton(Form_Vente_Caisse.FindComponent(Datamodule4.affectation_tNOM_BUTTON.Value));
             If Bouton <> Nil
             Then
               begin
                Bouton.Caption := Datamodule4.affectation_tNOM_PROd.Value;
                Bouton.Colors.Default := graphics.Stringtocolor(Datamodule4.affectation_tCOULEUR.Value);
               // bouton.OnClick := bouton_clik(Datamodule4.affectation_tCODE_PROD.Value);
                bouton.OnClick := bouton_clik; // Affectation de procédure et non appel !!!
                Bouton.Tag := Datamodule4.affectation_tCODE_PROD.AsInteger;
               end;
             next;
             end;
        end;
    end;
     
    procedure  bouton_clik(sender : TObject);
    var
      code_prod: Integer;
    begin
      // Is peut être remplacé par InheritsFrom, ...
    If sender is TcxButton then
      code_prod := (sender as TButton).Tag;
    end;
    voila l'erreur que j'ai maintenant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [DCC Erreur] Vente_Caisse_U.pas(129): E2065 Déclaration forward ou external non satisfaite : 'TForm_Vente_Caisse.bouton_clik'
    NB je suis débutante

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 45
    Points : 49
    Points
    49
    Par défaut
    Je supose que dans la déclaration de ta classe, tu a laissé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure  bouton_clik(codeproduit : integer);
    Comme tu n'a pas, par la suite, écrit de procédure avec ce paramètre, il te dit que cette déclaration n'est pas satisfaite

    De plus, "procedure bouton_clik(sender : TObject);" ne marchera pas. Ca doit etre une methode de classe.
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    TForm_Vente_Caisse = class(TForm)
    (...)
    procedure  bouton_clik(sender : TObject);
    (...)
     
    procedure  TForm_Vente_Caisse.bouton_clik(sender : TObject);
    (...)

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 700
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 700
    Points : 13 146
    Points
    13 146
    Par défaut
    Il y a plusieurs erreurs.

    La compilation du code est séquentiel (Du début à la fin)

    Ta procédure Bouton_Click ne fait pas partie de la Form. Donc:
    1. Soit tu crée un déclaration dans la partie interface,
    2. Soit tu place ta procédure AVANT Affecte_Bouton,
    3. soit tu l'inclus à la class TForm. (le mieux)


    De plus la procédure devrait être suivie de of object si extérieur à la class TForm.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Interface
     
    TForm1 = class(TForm)
    ...
       procedure Button_Click(Sender :TObject);
    ...
    end;
     
    Implementation
      procedure TForm1.Button_Click(Sender :TObject);
      begin
         ...
      end;

  8. #8
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 192
    Points : 65
    Points
    65
    Par défaut
    c'est bon ca marche merciiiiiiiiiiiii beaucoup pour votre aide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure   TForm_Vente_Caisse.bouton_clik(sender : TObject);// c'est ce qui manqué
    var
      code_prod: Integer;
      touche : word;
    begin
      // Is peut être remplacé par InheritsFrom, ...
        If sender is TcxButton then
      code_prod := (sender as TcxButton).Tag;
      Dblcb1.KeyValue := code_prod;
      touche := 13;
      Form_Vente_Caisse.DBLCB1KeyDown(TcxButton(Sender),Touche,[]);
        end;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. affecter une fonction personnalisée à une cellule
    Par Patnel dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/02/2011, 10h38
  2. affecter une fonction a une cellule
    Par bakman dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/12/2010, 15h05
  3. Exécuter une fonction onClick sans cliquer
    Par Le Touriste dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 12/06/2009, 00h13
  4. affecter une fonction à un évènement
    Par Pragmateek dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 04/03/2008, 14h19
  5. Réponses: 6
    Dernier message: 24/04/2007, 17h17

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