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 :

Appel de procédure par contenu de variable


Sujet :

Langage Delphi

  1. #1
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut Appel de procédure par contenu de variable
    Salut, je cherche un moyen d'appeler une procedure dont le nom est contenu dans une cellule de strinGrid, exemple:


    si maVariable=cellule(1,1) alors cellule(1,5)

    Je sais pas si je suis assez clair mais en gros si ma variable est égal au texte de la cellule (1,1) alors j'apelle la procedure dont le nom se trouve dans la cellule(1,5).

    Alors est ce que c'est possible de la faire, si oui, comment?
    Merci.
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    C'est possible sous trois conditions :
    - Les procédures/fonctions doivent être des méthodes d'objet.
    - Elles doivent être dans la section publiée.
    - Elle doivent toutes avoir le même format d'appel.

    Alors il est possible de faire ce que tu veux à l'aide de la fonction MethodAddress :
    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
     
      TForm1 = class(TForm)
        ...
      public
        { Déclarations publiques }
        ...
        // le mot clef Published doit être ajouté manuellement
      Published
        Function Fonction1(x,y:Integer):Integer;
        Function Fonction2(x,y:Integer):Integer;
      end;
     
    ...
     
    function TForm1.Fonction1(x, y: Integer): Integer;
    begin
      Result:=x+y;
    end;
     
    function TForm1.Fonction2(x, y: Integer): Integer;
    begin
      Result:=x-y;
    end;
     
    procedure TForm1.Button4Click(Sender: TObject);
    Var Proc:Function(x,y:Integer):Integer Of Object;
    begin
      @Proc:=MethodAddress(Edit1.Text);
      If @Proc<>Nil Then
        ShowMessage(IntToStr(Proc(2,4)));
      Else
        ShowMessage('Méthode non trouvée !');
    end;
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  3. #3
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Merci nono pour ton expliquation et ton bout de code, par contre dans mon cas je travaille qu'avec des procedures, donc j'ai légerement modifié ton code pour mon utilisation et apparement, je ne peux pas l'adapter pour une procedure, j'ai le message d'erreur suivant:
    Instruction attendue mais expression de type 'pointer' trouvée
    Voilà le bout de code que j'ai:

    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
     
      Published
        { Déclarations publiées }
        procedure essai;
        procedure essai2;
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.essai;
    begin
      showmessage('essai');
    end;
     
    procedure TForm1.essai2;
    begin
      showmessage('essai2');
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    Var
      Proc:procedure;
    begin
      @Proc:=MethodAddress(Edit1.Text);
      If @Proc<>Nil Then
        @proc
      Else
        ShowMessage('Procedure non trouvée !');
    end;
    Maintenant je reformule ma question, existe t'il une fonction pour appeler une procedure par son adresse?
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  4. #4
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Apres quelques recherches je suis tombé sur enumProc mais le soucis est que ça se repete indefiniment, je m'explique, quand j'apel ma procedure ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.Button1Click(Sender: TObject);
    Var
      Proc : procedure;
    begin
      @Proc:=MethodAddress(Edit1.Text);
      If @Proc<>Nil Then
        enumWindows(@proc,0)
      Else
        ShowMessage('Procedure non trouvée !');
    end;
    avec edit1.text = essai2, j'ai bien ma fenetre qui s'affiche avec essai2 mais quand je clique sur ok, elle réapparait, et cela indéfiniment, y'a t'il une autre manière de le faire?

    Biensur je pourrais bricoler tous ça en transformant mes procedures en fonctions mais je préfererais faire un truc "propre".
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  5. #5
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Tu as fais un petit oubli en adaptant le code : le "Of Object" est important :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.Button1Click(Sender: TObject); 
    Var 
      Proc:procedure Of Object; 
    begin 
      @Proc:=MethodAddress(Edit1.Text); 
      If @Proc<>Nil Then 
        @proc 
      Else 
        ShowMessage('Procedure non trouvée !'); 
    end;
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  6. #6
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Merci nono, je commençais a partir dans l'assembleur par contre petite rectification il faut enlever le @ quand on appel la procedure, ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Var 
      Proc : procedure Of Object;
    begin
      @Proc:=MethodAddress(Edit1.Text);
      If @Proc<>Nil Then
        Proc
      Else
        ShowMessage('Procedure non trouvée !');
    end;
    De plus, quand tu dis que les fonctions et procedures doivent etre published, cela veux dire que je ne peux pas par exemple rassembler ces procedures et fonctions dans une unit séparée, a moins de créer une class descendant de TObject juste pour ça et auquel cas je l'appelerais ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @Proc := maClasse.MethodAddress(Edit1.Text);
    peut tu confirmer ou infirmer stp?
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  7. #7
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Citation Envoyé par lil_jam63
    De plus, quand tu dis que les fonctions et procedures doivent etre published, cela veux dire que je ne peux pas par exemple rassembler ces procedures et fonctions dans une unit séparée, a moins de créer une class descendant de TObject juste pour ça et auquel cas je l'appelerais ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @Proc := maClasse.MethodAddress(Edit1.Text);
    peut tu confirmer ou infirmer stp?
    Tu as tout compris, c'est comme cela qu'il faut faire si tu veux mettre tes procédures dans une unité séparée. Juste un détail, il faudra quand même créer une instance de la classe ( maClasse de type TmaClasse dans ton cas ) pour pouvoir appeler maClasse.MethodAddress();
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  8. #8
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    C'étais sous-entendu biensur , je te remercie beaucoup.
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  9. #9
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    Ce principe peut être utilisé également avec des procédures, il suffit d'utiliser GetProcAddress (comme pour utiliser une dll) sans oublier d'exporter la liste des procédures disponibles. En fait, on fait comme si le programme était une dll.

  10. #10
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Merci Pierre, c'est effectivement une manière de procéder et que j'utilise deja dans mon application avec une dll mais j'avais pas du tout pensé que je pouvais l'utiliser au sein même de mon application, merci beaucoup pour votre aide.
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

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

Discussions similaires

  1. [Prototype] Updater : récupérer tout le contenu du variable $_POST sans passer par parameters
    Par ilalaina dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 07/10/2009, 16h01
  2. Réponses: 26
    Dernier message: 24/06/2009, 09h32
  3. [POO] Appeler une fonction par son nom dans une variable
    Par whitespirit dans le forum Langage
    Réponses: 16
    Dernier message: 18/06/2008, 11h23
  4. contenu d'une variable définit par une autre variable
    Par PuppeT mAsTer dans le forum Langage
    Réponses: 4
    Dernier message: 04/07/2006, 19h32
  5. Appel de procédures stockées par vbs
    Par fguigui dans le forum Oracle
    Réponses: 3
    Dernier message: 12/06/2006, 12h08

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