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 :

Comment retrouver la valeur d'une constante dont le nom est sous forme de chaîne ?


Sujet :

Langage Delphi

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Comment retrouver la valeur d'une constante dont le nom est sous forme de chaîne ?
    Bonjour,

    Je recherche comment retrouver la valeur d'une constante dont le nom m'est passé en paramètre.

    ex:
    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
     
    resourcestring
     rs1 := 'mon texte 1';
     rs2 := 'mon texte 2';
     
    function mafunction(maConst : String):String
    begin
      result := //et c'est là ma question
    end
     
    procedure test;
    var resultat : string;
    begin
      resultat := maFunction('rs1');
    end;
    Merci pour votre aide..

    Cerb

  2. #2
    Débutant

    Inscrit en
    Décembre 2003
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 166
    Points : 120
    Points
    120
    Par défaut
    Si tu connai le nobre de parametre tu peux utiliser ParamStr(index)...

    En sachant que ParamStr(0) est le nom de l'executable ...

  3. #3
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta réponse. mais ce n'est pas le sujet. :-(

    Je ne parle pas de passage de paramètre à l'application, mais de récupération de valeur de constante dont le nom (de la constante ) est passé en paramètre.

  4. #4
    Débutant

    Inscrit en
    Décembre 2003
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 166
    Points : 120
    Points
    120
    Par défaut
    Je ne doit pas bien tout comprendre la mais tu te complique lavie ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MessageDlg(rs1, mtWarning, [mbOK], 0);

  5. #5
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Toujours pas le sujet. :-)

    C'est parcque je n'utilise pas la valeur dans la méthode MessageDlg... mais pour autre chose.

    Je veux récupérer des valeurs de resourcestring dans un autre environnement en appelant une methode de mon unité.

  6. #6
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 103
    Points : 120
    Points
    120
    Par défaut
    Salut,

    et pourquoi pas :
    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
    resourcestring 
     rs1 := 'mon texte 1'; 
     rs2 := 'mon texte 2'; 
     
    function mafunction(maConst : String):String 
    begin 
     
       if maConst='rs1' then result=rs1;
       if maConst='rs2' then result=rs2;
     
       ... etc...
     
    end; 
     
    procedure test; 
    var resultat : string; 
    begin 
      resultat := maFunction('rs1'); 
    end;
    cela dit si tu veux avoir une réponses exploitable il est préférable de donner TOUT l'ennoncé de ta question...

    @+

  7. #7
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    C'est une idée a retenir. Ca me dérange d'avoir a modifier la fonction a chaque ajout de resourceString (on a plus de 2000 resourceString), mais si on a pas le choix .... Merci

    Pour le sujet du contexte, j'ai voulu faire abstraction des détails non significatifs pour éviter d'avoir une question qui fait trois pages et des réponses qui partent dans tout les sens.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 298
    Points : 318
    Points
    318
    Par défaut
    Si tu précisais exactement ton besoin, tu aurais des réponses plus adaptées.

  9. #9
    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
    Salut

    D'une façon générale, l'identifiant d'une constante n'a pas beaucoup d'intérêt pour le programme une fois compilé. Après la compilation, la constante devient soit une valeur littérale soit un pointeur sur une valeur contenue en mémoire.

    En ce qui concerne les resourceString par contre si tu as un "fouineur de ressource" (je ne connais pas le vrai terme, j'utilise par exemple ResHack), tu verras que les noms de chaîne sont transformés en valeur numérique donc le nom est perdu.

    Quel est ton besoin au juste ? on pourra peut-être te proposer une solution alternative (enfin s'il s'agit de ressource issues d 'un programme dont tu détiens les sources modifiables).

    cdlt

    e-ric

  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
    En utilisant des pChar à la place des strings
    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
     
    var
      Form1: TForm1;
     
    resourcestring
      res1 = 'mon texte 1';
      res2 = 'mon texte 2';
     
    implementation
     
    {$R *.dfm}
     
    function mafunction(maConst : pChar):String;
    begin
      result := format('test: %s', [maConst]);
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowMessage(mafunction(pChar(res1)));
    end;

  11. #11
    Membre habitué
    Inscrit en
    Mars 2003
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mars 2003
    Messages : 281
    Points : 187
    Points
    187
    Par défaut
    Citation Envoyé par cpdump
    Si tu précisais exactement ton besoin, tu aurais des réponses plus adaptées.
    il suffit de lire le code donné dans le premier post pour comprendre le besoin ;-)

    Si je peux me permettre de reformuler la question :

    Comment récupérer le contenu d'une ressourcestring quand on a que son nom sous forme de CHAINE.
    en gros comment faire de l'interprété...

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    RessourceStringRecherche := inputbox('Question','Nom de la chaine :','');
    if RessourceStringRecherche<>'' then
         showmessage(  'La valeur de ' + RessourceStringRecherche + ' est : '
                                + #13 + maFunction(RessourceStringRecherche) );

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 298
    Points : 318
    Points
    318
    Par défaut
    Citation Envoyé par RamDevTeam
    il suffit de lire le code donné dans le premier post pour comprendre le besoin ;-)
    Non, cela n'explique pas pourquoi il a besoin de cette fonctionnalité, si ça se trouve il est possible de contourner ce problème pour répondre à son vrai besoin.

  13. #13
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Et si tu passe par une base de donnée; ou même avec un tableau a deux champ (nom du string, valeur) que tu charge au début
    Avec la base de donnée tu peut utilisé la puissance des SQL pour la recherche

    c'est une idée, non
    J’espère que Pierre Castelain n'est pas dans les parages

  14. #14
    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
    La solution que je t'ai donné ci-dessus ne va pas?

  15. #15
    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
    Salut

    Je n'ai pas eu de retour sur ma réponse.
    Est-ce qu'une itération sur les chaîne de ressource via un indice numérique ne pourrait pas faire ton affaire ?

    cdlt

    e-ric

  16. #16
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    @e-ric:
    Merci pour ton explication. Il semble que mon idée première va gentimment tomber à l'eau. Et comme tu l'as deviné, je ne répond que ce matin, puisque c'est au travail que j'utilise Delphi. Pour ton itération, ca peut se faire, mais comment trouver la ResourceString correspondant puisque l'on perd l'identifiant (res1) dans le fichier de ressource ?

    @RamDevTeam:
    Merci pour la reformulation, c'est exactement cela.

    @lil_jam63:
    Idée a creusée, je test cela un peu plus tard dans la journée mais je suis pesimiste. Lorsque tu passe ta chaîne à ta fonction, elle doit déjà être transformée (passage par valeur et pas par addresse ?)...ce qui ne joue pas dans mon cas(cf problème initial).

    @cpdump:
    Désolé de te décevoir, mais quand je vois les premières réponses que j'ai eu (malgé toute la bonne volonté des personnes qui répondent, et un entier respect pour elles), je préfère simplifier la question au début et voir les réponses simples. Si, comme c'est le cas dans ce topic, le problème s'amplifie ou devient complexe, je veux volontier donner toute l'info.

  17. #17
    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 RamDevTeam
    Citation Envoyé par cpdump
    Si tu précisais exactement ton besoin, tu aurais des réponses plus adaptées.
    il suffit de lire le code donné dans le premier post pour comprendre le besoin ;-)

    Si je peux me permettre de reformuler la question :

    Comment récupérer le contenu d'une ressourcestring quand on a que son nom sous forme de CHAINE.
    en gros comment faire de l'interprété...

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    RessourceStringRecherche := inputbox('Question','Nom de la chaine :','');
    if RessourceStringRecherche<>'' then
         showmessage(  'La valeur de ' + RessourceStringRecherche + ' est : '
                                + #13 + maFunction(RessourceStringRecherche) );
    J'avais compris le besoin tel qu'il était formulé. Mais je voulais savoir plus généralement quel était le but de sa demande afin éventuellement de lui proposer une autre approche car son problème, tel qu'il est initialement posé, n'a pas de solution à ma connaissance.

    cdlt

    e-ric

  18. #18
    Membre habitué
    Inscrit en
    Mars 2003
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mars 2003
    Messages : 281
    Points : 187
    Points
    187
    Par défaut
    J'avais compris le besoin tel qu'il était formulé. Mais je voulais savoir plus généralement quel était le but de sa demande afin éventuellement de lui proposer une autre approche car son problème, tel qu'il est initialement posé, n'a pas de solution à ma connaissance.
    Je réagissait (sans aucune animosité) seulement sur les premières réponses qui était franchement à côté de la plaque ainsi qu'au post de cpdump
    Si tu précisais exactement ton besoin, tu aurais des réponses plus adaptées.
    .

    je pense qu'une réponse ressemblant à celle-ci dessous aurait-été plus adaptée :

    La fonction demandée n'est pas techniquement réalisable, car après compilation, les noms de constantes n'existe plus et sont remplacé par des nombres ou pointeurs . Peux tu donner plus de précision afin que l'on puisse te proposer une solution alternative
    Concernant la question initiale, moi non plus, je ne vois pas de solution au problème initialement posé, et ton explication de la transformation de la constante après compilation me conforte dans mon idée.
    Pour ma part, si je dois accéder à des chaines de texte non connus à la compilation, donc non connu par le programme. je ne vois que les solutions évoqués précédement :
    - un tableau en mémoire, dans lequel on copie un fichier texte.
    - une table d'une base de donnée (si l'application utilise une BD)
    - ou un tstrings chargé au démarrage :

    tu stocke la chaine compléte via le tableau Tstrings.objects[]
    et tu récupére la valeur via Tstrings.indexof('MonIdentifiant');


    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
    35
    36
    37
    38
    39
    40
    41
    42
    type Tkey = record
        Value : string;
        end;
    type PKey = ^Tkey;
     
     
    procedure SetKey(aItems : Tstrings; aKey : string; aTexte : string);
    function GetKeyStr(aItems : Tstrings; aItemIndex:integer ) : string;
     
    implementation
     
    procedure SetKey(aItems : Tstrings; aKey : variant; aTexte : string);
    var P : PKey;
    begin
       try
          new(P);
          p.Value := aKey;
          aItems.AddObject(aTexte, TObject(p));
       except
          aItems.AddObject(aTexte, nil);
       end;
    end;
     
    function GetKeyStr(aItems : Tstrings; aItemIndex:integer ) : string;
    var P :Pkey;
    begin
      Result := '';
      try
        if aItemIndex=-1 then
          begin
             result := '';
             p := nil;
          end
        else
          P := Pkey(aItems.Objects[aItemIndex]);
      except
        P:=nil;
      end;
     
      if p<> nil then
        Result := p.Value;
    end;
    pour stocker :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SetKey( items, 'res1', 'Résultat 1');
    pour récupérer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Showmessage( GetKey( items, items.indexof(StrValue) ));

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/07/2013, 23h48
  2. Réponses: 12
    Dernier message: 30/05/2012, 18h48
  3. Réponses: 3
    Dernier message: 17/03/2011, 14h51
  4. Réponses: 7
    Dernier message: 27/05/2008, 11h54
  5. Comment appeler une méthode dont le nom est dans un string?
    Par Ireon dans le forum API standards et tierces
    Réponses: 22
    Dernier message: 13/04/2007, 18h22

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