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 :

Appeler une procédure en connaissant son nom


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut Appeler une procédure en connaissant son nom
    Bonjour,

    Je développe un logiciel avec Delphi 2006, sous WinXP.

    J'ai plus de 350 Labels différents qui sont tous nommés Label_Numero. Le problème c'est qu'à certains moments je dois les vider.

    Je pourrais donc faire :

    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);
    begin
      Label_1.Caption := '';
      Label_2.Caption := '';
      Label_3.Caption := '';
      ...
      Label_348.Caption := '';
      Label_349.Caption := '';
      Label_350.Caption := '';
    end;
    Mais cela n'est pas ce qu'il y a de plus pratique ... je voudrais donc créer une Procedure qui viderait le label.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Procedure TForm1.Non_Selectionne(Numero: string);
    var
      Label_Universel : TLabel;
     
    begin
      Label_Universel.Name := 'Label_' + Numero;
      Label_Universel.Caption := '';
     
    end;
    Malheureusement, cette Procedure n'efface pas les informations des labels ...

    D'avance merci pour vos réponses.

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Février 2003
    Messages
    4 341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 4 341
    Points : 5 953
    Points
    5 953
    Par défaut
    Tu as essayé avec FindComponent en testant si c'est un label et si le nom est bien Label_xxx ?

  3. #3
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    En effet, ça fonctionne très bien !!! Je connaissais pas cette possibilité.

    Pour ceux que ça intéresse, j'ai remplacé l'ancien code par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      TLabel(FindComponent('Label_' + Numero)).Caption := '';
    Merci kwasin et bonne programmation à tous.

  4. #4
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    vous n'avez qu' a mettre le tous dans une boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    For I:=1 to 350 do
      Tlabel(FindComponent('Label_'+IntToStr(I))).Caption :='';

  5. #5
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    salut,
    voilà aussi une autre manière de procéder : tu fais une boucle sur les composant appartenant à ton composant et à chaque fois tu teste s'ils sont de la classe TLabel.
    par exemple, tu peux placer tes 350 Labels dans un TPanel et utiliser un code similaire à celui-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm.MaProcedure;
    var
      i:Integer;
    begin
      for i:= Panel1.ComponentCount - 1 downto 0 do
        if Panel1.Components[i] is TLabel then
          TLabel(Panel1.Components[i]).Caption := '';
    end;

  6. #6
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Merci pour toutes vos suggestions toutes très intéressantes.

    J'ai encore une question ... dans le cas où le checkbox était désélectionné, il fallait vider certains labels. Et grâce à votre aide, ça fonctionne.

    Mais si le checkbox est sélectionné, il faut effectuer une procédure, et il y a une procédure spécifique par label, soit 350 procédures. Qui sont nommés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Procedure Recherche_1(...);
    Procedure Recherche_2(...);
    ...
    Procedure Recherche_349(...);
    Procedure Recherche_350(...);
    J'aimerais donc pouvoir automatiser ces procédures ... malheureusement, je ne trouve pas de solutions. En effet, FindComponent ne fonctionne pas et je n'ai pas trouvé de FindProcedure ...

    Quelqu'un aurait il une idée ?

  7. #7
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Je vais peut-être dire une bétise, mais si tu ne fais qu'une méthode recherche qui prend en paramètre le numéro du label et qui va le chercher avec FindComponent ?

  8. #8
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Merci pour ta proposition Swoög.

    Malheureusement, ce n'est pas possible. Chaque Procedure à ses propres paramètres (de 3 à 15 paramètres diffèrents par procédure).

    Je suis donc dans l'obligation de conserver ces 350 Procédures.

    J'aimerais donc pouvoir créer le même genre de boucle que vous m'avez proposez plus haut dans le topic, mais pour des Procédures.

  9. #9
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    si j'ai bien compris vous voulez affecter pour chaque label une procedure
    a l'un de ces evenement c'est bien ça

  10. #10
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Plus ou moins.

    Il y a 350 CheckBox avec pour chaque CheckBox un Label et une procédure.

    Si le CheckBox n'est pas sélectionné, le Label correspondant est vidé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      TLabel(FindComponent('Label_' + Numero)).Caption := '';
    Si par contre le CheckBox est sélectionné, il doit effectuer une procédure propre à chaque label. Mais comme pour les labels je voudrais ne pas devoir tout réécrire les 350 Procédures qui s'appellent quasiment de la même manière.

    Et donc faire un appel standar :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TProcedure(FindComponent('Statut_' + Numero))(PChar(''+Edit_Domaine.Text+''), 
                             LResult, SizeOf(LResult));
    Mais la procédure que j'ai imaginé ne fonctionne malheureusement pas ...

  11. #11
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    le problemme c que vos procedure n'on pas les meme paramètre

    mais je peut vous données mon idées

    je décalre une procédure globale avec un parametre d'entrer qui est l'indice du checkbox pour les parmetre d'entrer de chaque parametre je vais les charger dans des variable externe a la procédure.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     Procedure Maprocedure(Indice:Integer);
       begin
         case indice of 
        1: 
           // traitement
        2:
       ..
       ...
       ....
     350:
    end;
    end;
    en suit je vai affecter les procedure au checkBox


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
      TCheckBox(FindCompenment('checkbo_'+Numero).Onclick :=
       Maprocedure (TCheckBox(FindCompenment('checkbo_'+Numero).tag);
    je v'ai utilser le tag pour identifier les checkbox

  12. #12
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Merci de l'intérêt que vous portez à ma question.

    Citation Envoyé par aityahia
    le problemme c que vos procedure n'on pas les meme paramètre [...]
    En les retravaillant je peux faire en sorte qu'ils aient tous le même nombre de paramètres, où les XXXXX doivent être changés par le numéro correspondant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Statut_XXXXX(PChar(''+Edit_Domaine.Text+''), LResult, SizeOf(LResult));;
    Statut_MiseEnPage(Label_Statut_XXXXX, LResult);
    Dans ce cas si le CheckBox_1 est sélectionné, on a :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Statut_1(PChar(''+Edit_Domaine.Text+''), LResult, SizeOf(LResult));;
    Statut_MiseEnPage(Label_Statut_1, LResult);
    Si c'est le 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Statut_2(PChar(''+Edit_Domaine.Text+''), LResult, SizeOf(LResult));;
    Statut_MiseEnPage(Label_Statut_2, LResult);
    Et ainsi de suite ... Dans ce cas, comment pourrais je créer une Procedure à laquelle on envoie juste le numéro et qui remplace le numéro au bon endroit.

    Si j'aimerais avoir une telle procédure, c'est pour un gain de temps, et aussi pour l'évolution future du logicielle, ça ira plus vite de réécrire une ligne que 350 lignes de codes.

    Et encore merci pour vos réponses !!!

  13. #13
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    J'ai trouvé dans la FAQ Delphi http://delphi.developpez.com/faq/?pa...rocedureparnom une méthode qui pourrait m'aider dans mon problème, que j'ai adapté à mon logiciel :

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      H : HModule;
      F : Procedure(AString: PChar; ARetVal: PChar; ARetValMax: Integer);
     
    begin
      H := GetModuleHandle(nil);
      if H <> 0 then
      begin
        F := GetProcAddress(H, PChar(Edit_Domaine.Text));
        if Assigned(F) then
          begin
            ShowMessage(F(PChar(''+Edit_Domaine.Text+''), LResult, SizeOf(LResult)));
            Memo1.Lines.Text := LResult;
          end
        Else
          ShowMessage('Procedure non trouvée !');
      end;
    end;
    Mais lors de la compilation, il m'envoi un message d'erreur :

    'string' and 'procedure , untyped pointer or untyped parameter'
    Voici la Procedure que j'essaie d'exécuter par cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Procedure Statut_XXX(AString: PChar; ARetVal: PChar; ARetValMax: Integer);
    begin
       [...]
    end;

  14. #14
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 275
    Points : 493
    Points
    493
    Par défaut
    Bonjour,

    le problème doit venir de ton ShowMessage à qui tu passes une procédure et pas une fonction

  15. #15
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Merci Madfu, en effet il y avait bien un problème avec le ShowMessage. Je l'ai donc supprimé.

    Cependant, lorsque je clique sur le bouton 1, il n'arrive pas à trouver la procédure que je souhaite.

    J'ai beau relire ce code, je ne comprends pas où je peux lui dire de lancer la procédure Statut_46 au lieu de Statut_12 ...

  16. #16
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 275
    Points : 493
    Points
    493
    Par défaut
    Il me manque un peu d'élément, as tu débuggué ton appel à button1_click ? Est-ce après le GetProcAddress que ça plante ? Quel est le message d'erreur ?

  17. #17
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Il n'y a pas d'erreur. Il y a juste un ShowMessage qui s'affiche 'Procedure non trouvée !', comme je l'ai écris dans le code.

    Mon problèmes est que j'ai 350 Procédures qui s'appellent par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Procedure Statut_XXXXX(AString: PChar; ARetVal: PChar; ARetValMax: Integer);
    Où le XXXXX doit être remplacé par un numéro qui va de 1 à 350. Je veux alléger le logiciel ainsi que ces mises à jours futures. C'est à dire que je ne veux qu'une Procédure qui appelle les autres.

    Comme ça je l'appel en disant Procédure_Universelle (numéro 64), il effectue la procédure 64 et d'autres travaux qu'il doit effectuer quelque soit la procédure.

    En d'autres termes, je veux coder l'équivalent des FindComponent pour les Procédures.

  18. #18
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 275
    Points : 493
    Points
    493
    Par défaut
    edit_domaine correspond à la zone qui va recevoir le nom de la procédure c'est ça ?

    Peux-tu m'envoyer un résumé compilable de ton code (procédure appelé et appel dans button1_click) ?

  19. #19
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Il y a d'abord la DLL, qui s'appelle 'TLD_Europe.dll' qui se trouve dans le même répertoire que l'application :

    Voilà, j'ai essayé de résumer un maximum le code, c'est pour ça que ça à pris un "peu" de temps ...

    Bonne compilation, et j'espère que tu trouveras le moyen de pouvoir tout lancer à partir d'une procédure !

  20. #20
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    J'ai compris le problème, il venait de GetProcAddress.

    Pour ceux que ça intéresse, j'ai écris finallement :

    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
    procedure TForm1.Button3Click(Sender: TObject);
    var
      H : HModule;
      F : Procedure(AString: PChar; ARetVal: PChar; ARetValMax: Integer);
     
    begin
      H := LoadLibrary('TLD_Europe.dll');
      if H <> 0 then
      begin
        F := GetProcAddress(H, 'WhoIs_Fr'); //Le  problème venait d'ici ... il fallait mettre le nom de la Procédure importée depuis la dll
        if Assigned(F) then
          begin
            (F(PChar(''+Edit_Domaine.Text+''), LResult, SizeOf(LResult)));
            Memo1.Lines.Text := LResult;
          end
        Else
          ShowMessage('Procedure non trouvée !');
      end;
    end;

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

Discussions similaires

  1. [Formule] Accès à une feuille connaissant son nom
    Par flo_flo dans le forum Excel
    Réponses: 3
    Dernier message: 04/05/2007, 19h22
  2. Réponses: 2
    Dernier message: 16/02/2007, 18h49
  3. Fermer une fenetre en connaissant son nom dans la FAQ
    Par morgan47 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 04/09/2006, 10h41
  4. [Débutant(e)]Instancier une classe connaissant son nom (String)
    Par Invité dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 17/06/2005, 11h05
  5. appeler une fonction connaissant son nom (en string)
    Par Guigui_ dans le forum Général Python
    Réponses: 1
    Dernier message: 20/07/2004, 00h46

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