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 :

Concaténer une variable contenant le nom du champ à une propriété du champ.


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 12
    Points
    12
    Par défaut Concaténer une variable contenant le nom du champ à une propriété du champ.
    Bonjour,

    Je suis à la recherche d’un moyen d’éditer une fonction qui pourrait interagir avec différent champs mémo. J’aimerai utiliser une variable qui contient le nom du champ mémo.

    Ainsi, je pourrais utiliser une fonction pour plusieurs champs à la fois.



    Pour les connaisseurs de windev. L’équivalence est :



    [varibleNomChamps]+ ‘’.propriétéduchamps’’

  2. #2
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    Salut;

    si j'ai bien compris cela pourrait t'aider

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function affichage_nom_memo : string;
    begin
      Result := Form1.memo1.Name;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowMessage(affichage_nom_memo);
    end;
    Bon codage.

  3. #3
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Si tu souhaite retrouver un TMemo selon son nom (Memo1, Memo2, Memo3, Memo4, etc...) , tu peux utiliser FindComponent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.Button1Click(Sender: TObject);
    Var tmpMemo:TMemo;
    begin
     //exemple pour retrouver Memo2
      tmpMemo := Form1.FindComponent('Memo' + IntToStr(2)) as TMemo;
      If tmpMemo <>Nil then
        tmpMemo.Add( 'blablabla' );
    end;

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par sat83 Voir le message
    Si tu souhaite retrouver un TMemo selon son nom (Memo1, Memo2, Memo3, Memo4, etc...) , tu peux utiliser FindComponent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.Button1Click(Sender: TObject);
    Var tmpMemo:TMemo;
    begin
     //exemple pour retrouver Memo2
      tmpMemo := Form1.FindComponent('Memo' + IntToStr(2)) as TMemo;
      If tmpMemo <>Nil then
        tmpMemo.Add( 'blablabla' );
    end;

    J'ai essayé ta méthode.
    Je pense qu'on c'est pas compris sur la fontionnalité

    Je ne recherche pas un champ mais de pouvoir modifier les propriété d'un champs dont je connais le nom du champ.

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NomChamps.text := 'totot' ;   // version normale
    Ce que j'aimerai faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Public 
          VArNomChamps: String;
     
    VarNomChamps := C1;  // Champs existant dans la form 
     
    VarChamps.text = 'totot';

    bon, j'ai comme même essaie t'adapter ton code a ce que je veux faire mais j'ai un message d'erreur "[DCC Erreur]Params.pas(312): E2096 Identificateur de méthode attendu.

    Je crois que j'ai oublier quelque chose bon je te donne la parti de mon code que j'ai effectuer


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Public
       _NomMemo: string;
        _tmpMemo: Tmemo;
     
    Procedure BTNAjoutVariable(NomBtn: String);
    var IndiceSelStart: integer;
     
    begin
       TFParamSMS._tmpMemo := TFParamSMS.findcomponent(TFParamSMS._NomMemo)as TMemo;
       IndiceSelStart := TFParamSMS._tmpMemo.selstart;
       TFParamSMS._tmpMemo.text:= copy(TFParamSMS._tmpMemo.Text,0,TFParamSMS._tmpMemo.SelStart)+' '+NomBtn+' '+ copy(TFParamSMS._tmpMemo.Text,(TFParamSMS._tmpMemo.SelStart+1),length(TFParamSMS._tmpMemo.Text)+2);
       TFParamSMS._tmpMemo.selstart := IndiceSelStart
    end;

  5. #5
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Bonjour et bienvenue sur Developpez.com,

    Résumons un peu ta demande

    Tu as sur une form différents TMemo dont tu connais le Name, c'est bien ça ?
    Tes TMemo sont créés de façon dynamique ?
    Tu souhaites modifier le contenu de ces TMemo par le biais d'une fonction / procédure ?

    Si tes Memo ne sont pas créé de façon dynamqiue, on peut faire une procédure de modification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure ChangerContenuMemo(leMemo:TMemo;leTexte:string);
    begin
      leMemo.Text:=leTexte
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ChangerContenuMemo(Memo1,'toto');
      ChangerContenuMemo(Memo2,'tata');
    end;
    Je ne sais pas si c'est ce que tu recherches

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    il n'existe pas de fonction pour évaluer du code Delphi contenu dans une chaine par exemple. Si tu veux vraiment faire ça tu dois stocker le nom dans une variable string puis récupérer l'objet via un FindComponent ou (mieux) stocker carrément l'objet dans une variable et l'utiliser directement si ça t'es possible.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par ero-sennin Voir le message
    Bonjour et bienvenue sur Developpez.com,

    Résumons un peu ta demande

    Tu as sur une form différents TMemo dont tu connais le Name, c'est bien ça ?
    Oui
    Citation Envoyé par ero-sennin Voir le message
    Tes TMemo sont créés de façon dynamique ?
    Non

    Citation Envoyé par ero-sennin Voir le message
    Tu souhaites modifier le contenu de ces TMemo par le biais d'une fonction / procédure ?
    oui car les modifications de chaque mémo est dynamique et dépendant d'un ensemble de condition qui sont identique a tous les champs mémo.

    Citation Envoyé par ero-sennin Voir le message
    Je ne sais pas si c'est ce que tu recherches
    Non

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Aka Guymelef Voir le message
    Bonjour,

    il n'existe pas de fonction pour évaluer du code Delphi contenu dans une chaine par exemple. Si tu veux vraiment faire ça tu dois stocker le nom dans une variable string puis récupérer l'objet via un FindComponent ou (mieux) stocker carrément l'objet dans une variable et l'utiliser directement si ça t'es possible.
    Delphi est un langage qui fait de l'objet si je ne me trompe pas.
    Si cela ne fonctionne pas comment importer une classe d'un projet à l'autre, Si on peux pas modifier les propriété d'un champ de façon dynamique.

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Je ne comprend pas ta comparaison. Ce que tu m'énonce c'est de l'ordre de la compilation quand tu écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    TForm1 = class(TForm)
      public
       property Memo1: TMemo read FMemo1 write FMemo1;
    end;
     
    [...]
     
    procedure TForm1.Click(Sender: TObject)
    begin
      Memo1.Text := 'toto';
    end;
    Par contre il n'y a pas moyen d'écrire un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm1.Click(Sender: TObject)
    begin
      'Memo1' + '.Text' := 'toto';
    end;
    Ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm1.Click(Sender: TObject)
    begin
      Eval('Memo1.Text := ''toto''');
    end;
    Tu n'as pas de fonction permettant d'évaluer du code Delphi à l'exécution. La seule possibilité d'évaluer du code est à la compilation.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Aka Guymelef Voir le message
    Je ne comprend pas ta comparaison. Ce que tu m'énonce c'est de l'ordre de la compilation quand tu écris :
    [
    Voila a peut près ce que j'aimerai faire.
    Ce code produit aucune erreur de compilation mais d'exécution.
    J'aimerai pouvoir affecter n'importe quel nom de memo existant dans Form et de pouvoir modifier leur propriété.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Procedure BTNAjoutVariable(NomMemo, NomBtn: String);
     
    var IndiceSelStart: integer;
    begin
       IndiceSelStart := tmemo(NomMemo).selstart;
       tmemo(NomMemo).text:= copy(tmemo(NomMemo).Text,0,tmemo(NomMemo).SelStart)+' '+NomBtn+' '+ copy(tmemo(NomMemo).Text,(tmemo(NomMemo).SelStart+1),length(tmemo(NomMemo).Text)+2);
     
       tmemo(NomMemo).selstart := IndiceSelStart;
     
    end

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    On en revient toujours au même, non tu ne peux pas évaluer du code dans une chaîne au moment de l'exécution. Si tu veux vraiment faire ça tu dois procéder ainsi :

    Si c'est une procédure à l'intérieur de la form alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Procedure TForm1.BTNAjoutVariable(NomMemo, NomBtn: String); 
    var 
      AMemo: TMemo;
      IndiceSelStart: integer;
    begin
      AMemo := TMemo( FindComponent( NomMemo ) );
      if Assigned( AMemo ) then
      begin
       IndiceSelStart := AMemo.selstart;
       AMemo.text:= copy(AMemo.Text,0,AMemo.SelStart)+' '+NomBtn+' '+ copy(AMemo.Text,(AMemo.SelStart+1),length(AMemo.Text)+2);
     
       AMemo.selstart := IndiceSelStart;
      end;
    end
    Ou bien pour une procédure seule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Procedure BTNAjoutVariable(AForm: TForm; NomMemo, NomBtn: String); 
    var 
      AMemo: TMemo;
      IndiceSelStart: integer;
    begin
      AMemo := TMemo( AForm.FindComponent( NomMemo ) ); // tester aussi que AForm est assigné au cas où
      if Assigned( AMemo ) then
      begin
       IndiceSelStart := AMemo.selstart;
       AMemo.text:= copy(AMemo.Text,0,AMemo.SelStart)+' '+NomBtn+' '+ copy(AMemo.Text,(AMemo.SelStart+1),length(AMemo.Text)+2);
     
       AMemo.selstart := IndiceSelStart;
      end;
    end

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Aka Guymelef Voir le message
    On en revient toujours au même, non tu ne peux pas évaluer du code dans une chaîne au moment de l'exécution. Si tu veux vraiment faire ça tu dois procéder ainsi :
    j'utilise des chaine car dans un autre langage(windev) cela fonction de cette maniéré. Mais ce que j'aimerai c'est utiliser les champs mémo comme des objets.

    Citation Envoyé par Aka Guymelef Voir le message
    Si c'est une procédure à l'intérieur de la form alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Procedure TForm1.BTNAjoutVariable(NomMemo, NomBtn: String); 
    var 
      AMemo: TMemo;
      IndiceSelStart: integer;
    begin
      AMemo := TMemo( FindComponent( NomMemo ) );
      if Assigned( AMemo ) then
      begin
       IndiceSelStart := AMemo.selstart;
       AMemo.text:= copy(AMemo.Text,0,AMemo.SelStart)+' '+NomBtn+' '+ copy(AMemo.Text,(AMemo.SelStart+1),length(AMemo.Text)+2);
     
       AMemo.selstart := IndiceSelStart;
      end;
    end
    Lors de la compilation, j'ai des message d'erreur :
    [DCC Erreur] ParamSMS.pas(314): E2076 Forme d'appel de méthode autorisée seulement pour les méthodes de classes
    [DCC Erreur] Param_SMS.dpr(9): F2063 Impossible de compiler l'unité utilisée 'ParamSMS.pas'

  13. #13
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Pour mieux répondre au problème de compilation il vaudrait mieux que tu nous montre le code que tu as écrit pour intégrer ma précédente fonction.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Aka Guymelef Voir le message
    Pour mieux répondre au problème de compilation il vaudrait mieux que tu nous montre le code que tu as écrit pour intégrer ma précédente fonction.

    Voici le code

    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
     
    Procedure TFParamSMS.BTNAjoutVariable(NomMemo , NomBtn: String);
    var 
      AMemo: TMemo;
      IndiceSelStart: integer;
     
    begin
        AMemo := tmemo(tfparamSMS.FindComponent(NomMemo));
    //   tmemo(NomMemo).selstart  := TFParamSMS.findcomponent(TFParamSMS._NomMemo)as TMemo;
    //   IndiceSelStart := tmemo(NomMemo).selstart;
    //   tmemo(NomMemo).text:= copy(tmemo(NomMemo).Text,0,tmemo(NomMemo).SelStart)+' '+NomBtn+' '+ copy(tmemo(NomMemo).Text,(tmemo(NomMemo).SelStart+1),length(tmemo(NomMemo).Text)+2);
    //   tmemo(NomMemo).selstart := IndiceSelStart;
        if Assigned(AMemo) then
        begin
          IndiceSelStart := AMemo.selstart;
          AMemo.text:= copy(AMemo.Text,0,AMemo.SelStart)+' '+NomBtn+' '+ copy(AMemo.Text,(AMemo.SelStart+1),length(AMemo.Text)+2);
          AMemo.selstart := IndiceSelStart;
        end;
     
    end;

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 812
    Points : 13 527
    Points
    13 527
    Par défaut
    FindComponent ne peut pas être appelé sur tfparamSMS qui est la classe de la fiche. D'où l'erreur. (FindComponent n'est pas une méthode de classe)

    Voici aussi une autre façon plus compact d'insérer ton texte dans le mémo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var
      AMemo: TMemo;
      IndiceSelStart: integer;
    begin
      AMemo := tmemo(FindComponent(NomMemo));
      if Assigned(AMemo) then
      begin
        IndiceSelStart  := AMemo.selstart;
        AMemo.SelLength := 0;  //Si la longeur du texte sélectionné n'est pas
                               //mise à zéro, le texte sélectionné sera remplacé!
        AMemo.Seltext   := ' ' +NomBtn +' ';
        AMemo.selstart  := IndiceSelStart;
      end;
    end;

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    FindComponent ne peut pas être appelé sur tfparamSMS qui est la classe de la fiche. D'où l'erreur. (FindComponent n'est pas une méthode de classe)
    SA FONCTIONNE

    Merci beaucoup

    Je Vous remercie tous pour votre aide un bout de chacun à réussi à faire fonctionner ma procédure. Merci beaucoup .

    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
     
    var 
      AMemo: TMemo;
      IndiceSelStart: integer;
     
    begin
        AMemo := tmemo(FindComponent(NomMemo));
        if Assigned(AMemo) then
        begin
          IndiceSelStart := AMemo.selstart;
          AMemo.text:= copy(AMemo.Text,0,AMemo.SelStart){ L'Ini a zero s'effectue la}+' '+NomBtn+' '+ copy(AMemo.Text,(AMemo.SelStart+1),length(AMemo.Text)+2);
          AMemo.selstart := IndiceSelStart;
        end;
     
    end;

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 10/03/2014, 19h40
  2. Réponses: 4
    Dernier message: 28/06/2011, 23h16
  3. [AC-2007] Utilisation d'une variable contenant le nom d'un formulaire
    Par Azuchi dans le forum IHM
    Réponses: 3
    Dernier message: 30/06/2010, 20h26
  4. Réponses: 2
    Dernier message: 09/11/2007, 15h32
  5. Réponses: 4
    Dernier message: 11/10/2007, 18h35

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