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 :

Echapper un caractère


Sujet :

Langage Delphi

  1. #1
    Invité
    Invité(e)
    Par défaut Echapper un caractère
    Bonjour à tous.
    Je rencontre un problème au boulot.

    J'ai une chaine :

    sChaine := Format('%s %s "%s" ', [info1, info2, info3]);

    Jusque là pas de soucis. Mais la chaine info3 peut contenir des guillemets.
    Ici, si Info3= 'param="3" ' le résultat sChaine est tronqué, forcément.

    En C on a l'anti slash... mais en delphi ?

    Des idées?

    Merci d'avance.

  2. #2
    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 comprends pas trop ce que tu veux faire ?

    Pour utiliser des apostrophes (ou cotes) dans uen chaine il faut la doubler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    S := 'Exemple d''utilisation d''appostrophes dans uen chaine';
    Si le contenue de la variable est une chaine de caracteres manipulé a l'execution, cela ne pose aucun de problemes.
    Sauf bien sur si derriere tout ca on a un interpreteur de code pascal ....
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  3. #3
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 841
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 841
    Points : 15 263
    Points
    15 263
    Par défaut
    Salut,

    euh, j'ai pas tout compris, là... Enfin, si, mais je ne vois pas le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.Button1Click(Sender: TObject);
    var
      schaine, info1, info2, info3 : string;
    begin
      info1 := 'bidon';
      info2 := 'deux mots';
      info3 := 'tralala="tsointsoin"';
      sChaine := Format('%s %s "%s" ', [info1, info2, info3]);
      ShowMessage(schaine);  // -> bidon deux mots "tralala="tsointsoin""
      sChaine := Format('%s %s %s ', [info1, info2, info3]);
      ShowMessage(schaine);  // -> bidon deux mots tralala="tsointsoin"
    end;
    Mes 2 cts,
    --
    jp
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  4. #4
    Invité
    Invité(e)
    Par défaut
    Oui, mais là ce ne sont pas des quotes mais des guillemets.

    La chaine résultat, sChaine doit pouvoir ressembler à ceci :
    sChaine := 'Salut les amis, comment ça va, "Bien?" ';

    Peut importe la raison du "bien" ou plutôt des guillemets (je vais vous passer les détails )

    Ma chaine est bien sûr constituée de plusieurs paramètres, je la construit à la volée.
    sChaine := Format('%s %s "%s"', [info1, info2, info3]);

    Si info3 contient un guillemet (par exemple ' Très " bien'), ca ne fonctionne plus.






    J'ai des remords avec mon exemple pourri. Il n'est pas plus simple que le cas réel.
    En fait je créé une StringList.
    J'ai ma stringLit.CommaText := Format('%s, %s, "%s"', [a,b,c]);
    "c", le dernier paramètre peut être n'importe quoi. C'est la ligne contenu dans un log. En particulier , j'ai des valeurs de paramètres. PAram="3" ... etc...
    Dans ce cas, c'est tronqué (forcément " param="3"", le compilateur ne s'y retrouve pas).
    Je voudrais que la syntaxe param=\"3\" soit comprise la le compilateur (chose courante dans d'autres langages)

    Pourquoi, à la base, je veux entourer mon dernier %s par des guillemets? Car le tout est affecté à un TStringGrid qui n'apprécie pas trop les espaces (ligne tronquée).

    Voilà.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Très bien l'exemple. Je le modifie pour illustrer mon problème. Ca va être plus clair :

    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
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      schaine, info1, info2, info3 : string;
    begin
      info1 := '"bidon"';
      info2 := '"deux mots"';
      info3 := 'tralala="tsointsoin"';
      sChaine := Format('%s %s "%s" ', [info1, info2, info3]);
     
      StringGrid1.Rows[1].CommaText := sChaine;
     
     // ShowMessage(schaine);  // -> bidon deux mots "tralala="tsointsoin""
    //  sChaine := Format('%s %s %s ', [info1, info2, info3]);
    //  ShowMessage(schaine);  // -> bidon deux mots tralala="tsointsoin"
    La 3eme colonne contient uniquement tralala=

    Buggg !!!
    Et sans les " c'est encore pire, car il fait une colonne par espace. C'est poru ça que j'ai modifié

    info1 := '"bidon"';
    info2 := '"deux mots"';

  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
    C'est bien ce que je dit
    tu confonds execution et compilation.

    Oui le compilo ne s'y retrouve pas .. or PAram3 (ou c) est affecté a l'execution, donc le compilo est deja passsé par la.

    D'autre par, le caractere de chaine est la cote ' et non pas le guillement " comme dans certaint langages.
    donc tant que tu n'utilise pas de cotes, et ce AVANT la compilation (c'est a dire sous forme de chaine textuelle dans le code) il n'y a aucun soucis.

    Sauf :
    - Si tu utilise un composant d'interpretation/Compilation/Execution dynamique de code pascal (ie Scripts) a l'execution
    - Si tu utilise cette chaine comme support a la generation de code d'u nautre langage, de requettes SQL, bref de tout autre syntaxues utilisant les guillemets comme caracteres de chaine.

    A noter quand meme que dns les langages utilisant les guillemets, ils utilise le double formatage de chaine : cote/guillement, donc en commencant ta chaine par des cotes, tu n'as pas de soucis lors de l'itilisation des guillements.

    Sinon si ton probleme viens d'un contexte de gestion de fichiers logs, il est fort possible que l'erreur vienne du buffer d'ecriture. Si le fichier n'est pas fermé (ou le buffer vidé) apres chaques ecriture, une erreur cloturant l'application brutalement, ne permet pas de fermer proprement le fichier donc, de vider le buffer.

    Le hasard faisant que le dernier caractere affiché corresponde aux " est surprenant mais tout a fait envisageable.

    Pad'Bol
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  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 Neukoln Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      StringGrid1.Rows[1].CommaText := sChaine;
    et pourquoi pas directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      StringGrid1.Cells[1, 1] := Info1;
      StringGrid1.Cells[1, 2] := Info2;
      StringGrid1.Cells[1, 3] := Info3;
    [Edit] : Modification du code
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  8. #8
    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 Aide delphi :: CommaText
    La propriété CommaText permet de définir ou d'obtenir toutes les chaînes de l'objet TStrings dans une seule chaîne délimitée par des virgules.

    En récupérant CommaText, toute chaîne de la liste contenant des espaces, des virgules ou des apostrophes est placée entre guillemets; les guillemets à l'intérieur des chaînes sont répétés. Par exemple, si la liste contient les chaînes suivantes:

    Chai,ne 1
    Chai"ne 2
    Chaine 3
    Chaine4

    CommaText renvoie:

    "Chai,ne 1","Chai""ne 2","Chaine 3",Chaine4
    donc, suffit de doubler les " :
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  9. #9
    Invité
    Invité(e)
    Par défaut
    car StringGrid1.Rows[1] est du type TStrings, et pas string. C'est une liste (qui correspond aux colonnes).

    CommaText est un moyen simple (et de bon goût) affecter toutes les valeurs.

    Donc là... j'avoue que je ne vois pas comment m'en sortir.


  10. #10
    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
    remonte la discussion, nos messages se sont croisés et j'ai editer mon post.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  11. #11
    Invité
    Invité(e)
    Par défaut
    remonte la discussion, nos messages se sont croisés et j'ai editer mon post.
    Oui je viens de voir ça. MErci pour ta réactivité


    donc, suffit de doubler les " :
    J'avais essayé mais ça ne fonctionnait pas.
    Avec ton exemple, si... je regarde dans mon appli.

  12. #12
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 841
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 841
    Points : 15 263
    Points
    15 263
    Par défaut
    Yep !
    Joue avec ça :
    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      schaine, info1, info2, info3 : string;
    begin
      info1 := '"bidon"';
      info2 := '"deux mots"';
      info3 := 'tralala="tsointsoin"';
    //  sChaine := Format('%s %s "%s" ', [info1, info2, info3]);
    //  ShowMessage(schaine);  // -> bidon deux mots "tralala="tsointsoin""
      sChaine := Format('%s %s %s ', [info1, info2, info3]);
    //  ShowMessage(schaine);  // -> bidon deux mots tralala="tsointsoin"
      StringGrid1.Cells[0, 1] := Info1;
      StringGrid1.Cells[1, 1] := Info2;
      StringGrid1.Cells[2, 1] := Info3;
      StringGrid1.Rows[2].CommaText := sChaine;
    end;
    1re rangée : bidon et deux mots sont guillemétés ;
    2de rangée : pas guillemétés.
    Dans les 2 cas, la 3e colonne contient tralala="tsointsoin"
    --
    jp
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  13. #13
    Invité
    Invité(e)
    Par défaut
    Voilà. J'ai réussis à isoler mon problème. Je passe par une TStringList intermédiaire dans mon appli, et ça coince.

    Ceci recréé le problème et ne le solutionne 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
    20
    procedure TForm1.Button2Click(Sender: TObject);
    var
      FileLine : string;
      ALine: TStringList;
    begin
      {une ligne brut de pomme, extraite du ficbier}
      FileLine := '20070914104646,INFO203,systeme,_,T89990ARC,3001, "(10.201.1.232) Réception DataAvailable Handler: <!value mod="3" parm="710" instance="0" curr="4:3" />';
      ALine:= TStringList.Create;
      try
        {la ligne est assignée à la stringList. De cette manière, chaque valaur}
        {est accessible par indexe. ALine[0], ALine[4]...}
        ALine.CommaText := FileLine;
        ShowMessage(ALine.CommaText);
     
        StringGrid1.Cells[1,1] :=   '"'+ALine[6]+'"';
      finally
        ALine.Free;
      end;
     
    end;

  14. #14
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileLine := '20070914104646,INFO203,systeme,_,T89990ARC,3001, "(10.201.1.232) Réception DataAvailable Handler: <!value mod="3" parm="710" instance="0" curr="4:3" />';
    Ouaip ... sauf que je ne vois toujours pas de "" dans ta chaine ....
    donc a priori c'est normal que ca "plante"

    Essaye plutot avec ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileLine := '20070914104646,INFO203,systeme,_,T89990ARC,3001, ""(10.201.1.232) Réception DataAvailable Handler: <!value mod=""3"" parm=""710"" instance=""0"" curr=""4:3"" />';
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  15. #15
    Invité
    Invité(e)
    Par défaut
    C'est pas si simple, hein?
    On croit tout savoir sur les chaines et puis...
    Bientôt le w/e, ca va me faire du bien.

    Effectivement, ta ligne était presque bonne. En fait, ca fonctionne avec :

    FileLine := '20070914104646,INFO203,systeme,_,T89990ARC,3001, "(10.201.1.232) Réception DataAvailable Handler: <!value mod=""3"" parm=""710"" instance=""0"" curr=""4:3"" />"';


    Je "double quotais" le caractère du début de chaine (en gras) comme toi.
    Clorish, merci infiniment pour ton aide.
    Je te verse ma journée de salaire


    A bientôt


    ps: Pb résolu.

    ps2:
    Neukoln
    Invité de passage
    Je peux rester un peu?

  16. #16
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 841
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 841
    Points : 15 263
    Points
    15 263
    Par défaut
    Clorish, merci infiniment pour ton aide.
    Je te verse ma journée de salaire
    Et moi ch'suis qu'un blaireau ?
    --
    jp
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  17. #17
    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
    ok j'ai trouvé la syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileLine := '20070914104646,INFO203,systeme,_,T89990ARC,3001, "(10.201.1.232) Réception DataAvailable Handler: <!value mod=""3"" parm=""710"" instance=""0"" curr=""4:3"" />"';
    Donc, ComaText decoupe la chaine en N souchaine en utilisant le caractere de separation : Virgule.
    toutes les chaines contenant les caracteres : Espace, Guillemet, virgule, appostrophe, etc ... debute et se termine par ".
    Pour gerer les " dans la chaine, il faut doubler ce caractere ....

    En fait, je te conseille de respecter la syntaxe suivante : "<chaine>", "<chaine>", ... et en doublant les " dans les chaines.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  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
    Citation Envoyé par Neukoln Voir le message
    C'est pas si simple, hein?
    On croit tout savoir sur les chaines et puis...
    En fait si .. tout etait dis dans la doc ... j'ai juste lut de travers

    Citation Envoyé par Delphi :: ComaText
    En récupérant CommaText, toute chaîne de la liste contenant des espaces, des virgules ou des apostrophes est placée entre guillemets; les guillemets à l'intérieur des chaînes sont répétés.
    Mais t'as raison sur un point : Vive le WE

    Citation Envoyé par Jipété Voir le message
    Et moi ch'suis qu'un blaireau ?
    T'en fais pas ... j'ai toujours rien recu
    Mais promis .. on partage
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  19. #19
    Invité
    Invité(e)
    Par défaut
    En fait, je te conseille de respecter la syntaxe suivante : "<chaine>", "<chaine>", ... et en doublant les " dans les chaines.
    Tu as tout à fait raison.

    Pardon Jipété d'avoir heurté ta sensibilité.
    Je suis vraiment heureux d'avoir obtenu de l'aide sur ce forum. Donc merci à TOUS !

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

Discussions similaires

  1. Echapper des caractères avec VBA pour requete SQL
    Par mpereg dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/04/2008, 03h41
  2. Echapper un caractére + Lancer un script VBS
    Par FinalSpirit dans le forum WinDev
    Réponses: 6
    Dernier message: 01/10/2007, 13h46
  3. Echappement de caractères
    Par Mengué georges dans le forum JDBC
    Réponses: 1
    Dernier message: 31/05/2007, 17h03
  4. QueryString Echappement du caractère &
    Par lapanne dans le forum ASP
    Réponses: 2
    Dernier message: 12/03/2007, 10h49
  5. [Conception] Echappement de caractères
    Par nicoaix dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 11/04/2006, 19h32

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