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 :

Implémentation de procedure sur evenement pour composant dynamique


Sujet :

Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2009
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 56
    Points : 44
    Points
    44
    Par défaut Implémentation de procedure sur evenement pour composant dynamique
    Bonjour,

    Je suis devant un petit souci.

    Je crée des composants dynamiques dans une form
    créée elle aussi dynamiquement.

    Je voudrais appeler une fonction au changement du contenu
    d'une combobox, je ne sais pas comment définir cette fonction
    et où la déclarer.

    Voici la portion de code pour créer la combobox :

    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
     
           //Créer des combobox dynamiques
            TCombo[Cpt1] := TComboBox.Create(TContainer);
            With TCombo[Cpt1] Do
            Begin
              left:=150;
              top:=posVertic+30;
              width:=120;
              parent:=TContainer;
              Caption:=DefText;
              Text:=valint+':'+SsText;
              name:='ComboBox_'+IntToStr(Cpt1);
              enabled:=true;
              visible:=true;
              posCbb := posVertic+30;
              OnChange := Calcul(self);
            End;
    J'ai défini une procédure appelée "procedure Calcul(sender: TObject)"

    Le compilateur m'indique : Types incompatibles:'TNotifyEvent' et 'procedure, untyped pointer or untyped parameter'

    Je n'y comprends rien

    Merci pour vos tuyaux

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Enlève le Self

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    OnChange := Calcul;

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2009
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 56
    Points : 44
    Points
    44
    Par défaut
    Merci pour ta réponse.

    Je viens de faire la correction mais ça me provoque une erreur
    car je ne sais pas où déclarer cette procédure, qui est une
    méthode de la Form que j'ai créée dynamiquement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       //Fenetre créée automatiquement
        TConteneur := TForm.Create(self);
        With TConteneur Do
        Begin
          top := 100;
          left := 100;
          Caption := "Fenetre de mise à jour";
          Width := 400;
        End;
    Je sais qu'une méthode d'une form se déclare à l'initialisation
    mais ma form est créée en plein milieu de l'application sous
    certaines conditions. Donc je ne peux pas déclarer cette méthode
    à l'initialisation de la form principale. En effet, la form dynamique
    n'existant pas, elle n'est pas reconnue.

    J'ai essayé d'insérer procedure Calcul(Sender: TObject) dans le corps
    de With TConteneur Do mais cela ne fonctionne pas.

    Merci.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Les Anonymes ne sont pas applicables au Gestionnaire d’Événements

    Méthodes anonymes dans Delphi - Méthodes anonymes en tant qu'événements
    Toutefois, la réciproque n'est pas vraie : vous ne pouvez pas affecter une méthode anonyme à un pointeur de méthode normal. Les références de méthode sont des types managés, mais les pointeurs de méthode sont des types non managés. Ainsi, pour des raisons de fiabilité des types, l'affectation de références de méthode à des pointeurs de méthode n'est pas supportée. Par exemple, les événements sont des propriétés de méthode évaluées en pointeur , vous ne pouvez donc pas utiliser une méthode anonyme pour un événement. Pour de plus amples informations sur cette restriction, voir la section relative à la liaison des variables.

    Je pense que "reference to" (syntaxe pour indiquer le support d'une méthode autorisant les anonymes" et "of object" (syntaxe pour déclarer une méthode objet pour les Events) ne sont pas directement compatible !



    Et cela n'est que depuis Delphi 2009

    Tu as deux solutions :
    - soit Calcul est une fonction de self
    - soit Calcul est une méthode de classe

    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
        FormContainer := TForm.Create(self);
        With FormContainer Do
        Begin
          top := 100;
          left := 100;
          Caption := "Fenetre de mise à jour";
          Width := 400;
     
          ComboArray[Cpt1] := TComboBox.Create(FormContainer);
          With ComboArray[Cpt1] Do
          Begin
             Items.Add('Salut');
             OnClick := TBidule.ClickEventHandler;
          end;
        End;
    Evite T dans les noms des variables, T indique que c'est une définition de Type
    Si tableau, déclare plûtôt un TabCombo ou ComboArray,
    Idem tout simple FormContainer


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type
      TBidule = class(TObject)
      public
        class procedure ClickEventHandler(Sender: TObject);
      end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class procedure TBidule.ClickEventHandler(Sender: TObject);
    begin
      if Sender is TButton then
         ShowMessage('Un Bouton a été cliqué');
      else 
        if Sender is TComboBox then
          with Sender as TComboBox do
            ShowMessage(Format('La Combo %s a été cliqué sur l''élement %d = %s', [Name, ItemIndex, Items[ItemIndex]]));

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 763
    Points : 13 381
    Points
    13 381
    Par défaut
    La question est : pourquoi veux-tu instancier un TForm ?

    Tu peux tout à fait créer ta fiche dans l'EDI avec des composants et méthodes de base, l'instancier par code et ajouter d'autres contrôles à la volée.

    Je pense qu'il y a une incompréhension au niveau des fiches auto-créées

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Il est aussi possible de créer un objet hérite de TForm SANS passer par l'IDE, de lui mettre des méthodes et propriétés, il faut juste utiliser CreateNew au lieu de Create pour indiquer une création de fenêtre SANS DFM

  7. #7
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2009
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 56
    Points : 44
    Points
    44
    Par défaut
    Bonjour,

    Tout d'abord merci pour vos réponses.

    Pour répondre à vos questions posées :

    - Je veux créer une TForm de toutes pièces pcq c'est une des
    consignes que j'ai eues de mon responsable (ne me demandez
    pas pourquoi je ne sais pas )

    Je teste les solutions et je vous fais un retour

    Merci

  8. #8
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2009
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 56
    Points : 44
    Points
    44
    Par défaut
    Bonjour,

    J'ai fini par créer une form simple avec des boutons. J'ai préféré ne pas
    me torturer les méninges en manipulant les classes car ça me parait compliqué
    pour ce que je voulais faire au départ.

    La form simple que j'ai créée avec l'EDI a été finalement très utile pour
    y inclure les procédures que je voulais intégrer.

    Merci pour vos réponses, je prendrai de la graine quand j'en aurai besoin.


Discussions similaires

  1. Procedure sur Evenement Key_enter
    Par olivier021072 dans le forum Débuter
    Réponses: 3
    Dernier message: 30/10/2011, 16h42
  2. gestion d'un evenement sur composant dynamique
    Par darkman13130 dans le forum C++Builder
    Réponses: 2
    Dernier message: 19/03/2009, 15h16
  3. événement sur composants dynamiques
    Par kirua2150 dans le forum Delphi
    Réponses: 5
    Dernier message: 02/05/2007, 03h33
  4. Evenement pour plusieurs controles creed dynamiquement
    Par sovo dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 23/10/2006, 17h14
  5. Réponses: 24
    Dernier message: 06/03/2006, 17h46

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