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 :

Convertir STRING --> Type PROCEDURE


Sujet :

Langage Delphi

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 2
    Points
    2
    Par défaut Convertir STRING --> Type PROCEDURE
    Bonjour,

    Je cherche des solutions à un problème.

    Dans une classe, j'ai des attributs privés (attr1, attr2) et j'utilise des property en tant que getters et setters. En parsant un fichier XML, je récupère des STRING qui sont le nom des attributs de ma classe. En faisant une manipulation, j'ai ainsi le nom de la procedure associée à chaque attribut mais je l'est ai en STRING. Et il n'est pas possible de faire appel alors à ces procédures!!! Puisque un est de type procedure alors que moi j'ai un type string. Y a t il un moyen de faire une conversion de type dans ce cas.

    En résumé, comment peut on appeler une procédure dont on a juste le nom en String ??

    Ca serait sympa si quelqu'un avait une soultion pour moi... Merci

  2. #2
    Membre averti
    Profil pro
    xxxxxxxxxxx
    Inscrit en
    Juin 2004
    Messages
    308
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : xxxxxxxxxxx

    Informations forums :
    Inscription : Juin 2004
    Messages : 308
    Points : 407
    Points
    407
    Par défaut
    Bonjour,

    Je te suggère de jeter un oeil à l'unité typinfo.pas, et notamment à la fonction GetMethodProp...

    Bon courage.

  3. #3
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Ce que tu cherche a faire c'est la base RTTI.
    Une petite recherche sur ce mot clef t'ouvrira certaines portes ...

    Par contre, je prefere personelement associer un code a chaques procedures/property et utiliser ce code.

    A la limite, tu peux aussi utiliser des strings ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Procedure ExecuteProcedure(ProcName : String);
    Begin
    if ProcName = "Proc1" then Proc1;
    [...]
    End;
    Astuce pour coder un case sur des chaines :
    Tu peux utiliser un case sur les ID d'une TStringListe au prealablement remplit des differentes chaines possible a tester.

    Ne pas oublier de faire un lowerCase sur la partie gauche et Droite du tests ... a moins que tu ne desire conserver le respect des majuscules.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Ouais mais dans ton cas la, je rajoute autant de cas qu'il y a de chaine, ce qui ne m'interesse pas!
    La je regarde les RTTI ouai, avec la méthode donnée dans la 1ere réponse...
    Je fais des essais pour voir ce que ca donne. Je reviens par ici pour dire les résultats. Si qlq1 a d'autres idées, je suis preneur..

    a + tard

  5. #5
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 564
    Points : 3 968
    Points
    3 968
    Par défaut
    Si les procédures ont toutes la même signature (même paramètres dans le même ordre), il est possible de créer simplement un conteneur indexé par le nom des procédures.
    Ce qui t'évitera de passer par les TypInfo et autres joyeusetés.

    Précise ton besoin.

    cdlt

  6. #6
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par l'elu
    Ouais mais dans ton cas la, je rajoute autant de cas qu'il y a de chaine, ce qui ne m'interesse pas!
    Par curiosité : en quoi ca gene ?

  7. #7
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par e-ric
    Si les procédures ont toutes la même signature (même paramètres dans le même ordre), il est possible de créer simplement un conteneur indexé par le nom des procédures.
    ou d'utiliser les dispInterfaces .....
    D'ailleur on peut meme s'en servir avec des fonctions de parametres differents.

    Citation Envoyé par e-ric
    Ce qui t'évitera de passer par les TypInfo et autres joyeusetés.
    +1
    Disons que avant de chercher a utiliser les rtti, je chercherais si ya pas moyens moins hard.
    Si je peux eviter les rtti, je m'en porte pas plus mal

    Citation Envoyé par e-ric
    Précise ton besoin.
    ++1

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Alors en fait,

    Je récupère des chaines dans un fichier XML (monAttrtexte). Comme je vous l'indique, ces chaines sont le nom (en chaine) d'attribut appartenant à une des mes classes (monAttrib). A partir de la, j'ai une valeur à mettre dans l'attribut possédant ce nom.
    Donc j'ai besoin de chopper mon attribut a partir de son nom en string.
    Avec une methode pour accéder a mes attributs privés (FmonAttr), il me suffit d'ajouter un F a ma chaine du nom monAttrtexte et je le nom de ma methode d'accession a l'attribut. Reste maintenant a manipuler cette methode pour affecter la valeur a l'attribut!!

    Voila exacteemnt ce que j ai a faire...

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Voila ma classe simplifiée... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    TImport = class (TObject)
      protected
        { Déclarations privées }
        DateDelEcriture: TDateTime;
        DeviseEcriture: string;
        CompteGeneral: string;
      public
        { Déclarations publiques }
        property FDateDelEcriture : TDateTime read DateDelEcriture;
        property FDeviseEcriture: string read DeviseEcriture;
        property FCompteGeneral: string read CompteGeneral;
      ...
    Et je recupère un string : DateDelEcriture
    J'ajoute un F avant et j'ai le nom de ma property: FDateDelEcriture mais en string.
    Faut que je puisse affecté une valeur maintenant... donc pouvoir appeler la methode!!

    Voila de plus amples précisons...

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Je viens d em'appercevoir que j'ai mis qlq betises dans le code d'avant, il a mal été simplifié!!

    rectification com je veux des setters en fait...

    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
    TImport = class (TObject)
    protected
     { Déclarations privées }
     DateDelEcriture: TDateTime;
     DeviseEcriture: string;
     CompteGeneral: string;
     procedure SetDateDelEcriture(Date: TDateTime);
     procedure SetDeviseEcriture(Devise: string);
     procedure SetCompteGeneral(Compte: string);
    public
     { Déclarations publiques }
     property FDateDelEcriture : TDateTime read DateDelEcriture write SetDateDlEcriture;
     property FDeviseEcriture: string read DeviseEcriture write SetDeviseEcriture;
     property FCompteGeneral: string read CompteGeneral write SetCompteGeneral;
    ...
    Voila apres le but reste le meme, mettre une valeur dans mes attributs dont j'ai que le nom...

  11. #11
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    j'opterais pour l'usage d'uen methode generique, bien plus legere que la gestion par RTTI :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Procedure SetProperty(PropertyName : String);
    Begin
    If PropertyName = "CompteGeneral" Then self.CompteGeneral = <Valeur>
    [..]
    end;
    A optimiser bien sur ...

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Ouai, pour le moment je vais faire un truc comme ca avec différents cas et puis je verrais plus tard si j'ai le temps de faire mieux je me pencherai plus sur les rtti...

    Si d'autres personnes ont résolu ce problèmen je prends quand meme les solutions

    Merci à Tous ^^

  13. #13
    Membre averti
    Profil pro
    xxxxxxxxxxx
    Inscrit en
    Juin 2004
    Messages
    308
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : xxxxxxxxxxx

    Informations forums :
    Inscription : Juin 2004
    Messages : 308
    Points : 407
    Points
    407
    Par défaut
    Sérieusement, je ne vois pas ce que vous avez contre RTTI ; surtout avec l'excellent article de Laurent Dardenne

  14. #14
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 564
    Points : 3 968
    Points
    3 968
    Par défaut
    Je pense que tu ne vas avoir le choix dans ta situation, le plus simple sera de passer par les typinfo et RTTI. Les propriétés doivent être alors déclarées published.

    On peut envisager d'autres solutions mais il y a un peu plus de travail. N'ayant pas Delphi sur place, je ne peux pas bricoler de solution, désolé.

    Remarque stylistique : les propriétés ne commencent pas par F, on donne un nom à la propriété et on préfixe ce nom par F pour le champ privé correspondant s'il existe (préconisation de Borland).

  15. #15
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    LA donnée qui correspond au nom de la property a remplire doit forcement etre de type string (ie chaine de caracteres) ou bien cela peut etre un chiffre ?

    Parce que sinon on peut se baser sur un systeme a base de tableau ....
    Mais si il faut de toute maniere interpreter la valeur chaine literale pour lui associer un ID numerique c'est pas la peine ....

  16. #16
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par e-ric
    On peut envisager d'autres solutions mais il y a un peu plus de travail. N'ayant pas Delphi sur place, je ne peux pas bricoler de solution, désolé.
    Il en existe des simple si on se base sur un Index et non sur un nom ...

    Citation Envoyé par e-ric
    Remarque stylistique : les propriétés ne commencent pas par F, on donne un nom à la propriété et on préfixe ce nom par F pour le champ privé correspondant s'il existe (préconisation de Borland).
    ++++1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Type
      MaClass = Class
      private
        _UnVarStrictementPrivee : Integer;
        FUneProperty : Integer;
        Function GetUneProperty : Integer;
        Procedure SetUneProperty(Val : Integer);
      Published
        Property UneProperty : Integer Read GetProperty Write SetProperty;
        //Property UneProperty : Integer Read FProperty Write FProeprty;
      End;
    A noter que les var publique d'une classe n'existe pas a mon gout. Mieux vaut passer par une property quitte a la lier en lecture et ecriture a une var private. C'est plus sur et moins contraingnant en cas d'amelioration du code

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Non les données auront des formats divers (datetime, ...) donc pas que des string.

  18. #18
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    je ne parlais pas des données a remplir mais de la donnée unique qui sert a designer la property.

    Actuelement tu defini un couple : NomProperty(String) et Valeur(DateTime/String/Intgeger...)

    Si NomProperty peut etre un Integer j'ai peut etre des solutions a te proposer

  19. #19
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Si j'ai bien compris ce que tu dis :

    Moi pour le moment j'ai ca :
    property fctDate: TDateTime read DateDelEcriture write SetDateDelEcriture;

    Toi tu voudrais savoir si un truc comme ca passe:
    property 222: TDateTime read DateDelEcriture write SetDateDelEcriture;

    C'est ca ??

    Mais sinon je ne vais pas passer par ces property en fait, car j'accede aux éléments directement car je suis dans la meme unité...

    Voila

  20. #20
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 564
    Points : 3 968
    Points
    3 968
    Par défaut
    Citation Envoyé par Clorish
    A noter que les var publique d'une classe n'existe pas a mon gout. Mieux vaut passer par une property quitte a la lier en lecture et ecriture a une var private. C'est plus sur et moins contraingnant en cas d'amelioration du code
    C'est aussi une recommandation de Borland, qui découle directement du principe d'encapsulation.


    e-ric

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. convertir du type string au type double
    Par nafroutabs dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 15/09/2008, 11h27
  2. convertir un tableau de type string en type double
    Par saraenim dans le forum Windows Forms
    Réponses: 8
    Dernier message: 12/05/2008, 16h45
  3. Réponses: 2
    Dernier message: 19/05/2007, 21h51
  4. Conversion string -> type procedure
    Par ludovic tambour dans le forum Langage
    Réponses: 5
    Dernier message: 11/05/2005, 20h53
  5. Convertir un string en type property ou object
    Par bencot dans le forum Langage
    Réponses: 2
    Dernier message: 20/11/2004, 21h18

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