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 :

[D6 Perso] Conversion de chaînes


Sujet :

Langage Delphi

  1. #1
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut [D6 Perso] Conversion de chaînes
    Bonjour à tous,

    dans le projet que je suis en train de réaliser, je dois lire et extraire des informations dans des fichiers *.dfm.

    Seulement, les informations qui y sont stockées sont codées de la manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ID = 'S'#233'lection'
    En fait, les caractères spéciaux contenus dans des chaînes sont écrit avec "#"+le code ASCII du caractère...

    J'aimerais savoir si il existe une procédure déjà toute faite qui permette de passer de cette forme vers la forme normale, c'est à dire "Sélection" (sans "#" ni code ASCII)

    Je pense que cela doit exister, puisque delphi le fait lorsqu'il sauvegarde les *.dfm...

    J'aurais en fait besoin des deux fonctions, pour passer indifférement d'une forme vers l'autre...

    Merci d'avance
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  2. #2
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Je pense pas, c'est à toi de le gérer.
    Etant donné que lorsqu'on sort de la 1ere moitié de la table ascii, les tables sont différentes selon les fontes, delphi est obligé de spécifier un code et non un car. (qui pourrait être différend selon la fonte utilisée...).
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  3. #3
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par TicTacToe
    delphi est obligé de spécifier un code et non un car. (qui pourrait être différend selon la fonte utilisée...).
    j'ai fait le test, et ça ne se passe pas comme ça...

    Delphi sauvegarde bien le code ASCII du caractère. Et il y a aussi sauvegarde de la font dans une propriété séparée. Ce n'est que lors de l'affichage dans le composant que le code est substitué par une représentation graphique, dépendante de la font

    la syntaxe du dfm est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      object Label1: TLabel
        ...
        Caption = 'S'#233'lection'
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -11
        Font.Name = 'Arial'
        Font.Style = []
        ParentFont = False
      end
    on voit bien que la font est sauvegardée séparément

    Alors ? Comment fait delphi pour passer d'une forme à l'autre ?

    Le grand problème est que l'utilisateur ne va pas saisir des "#1234" lorsqu'il va remplir un TEdit (p.ex.). Mais lorsque je voudrai sauvegarder ce qu'il a entré, je devrai convertir ces symboles "é", "è" etc. vers des suites de "#xxx"

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  4. #4
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    c'est justement grace à la définition de la fonte, que delphi affiche le code dans la fonte correspondante.
    Si il était stocké un car. spécial sous forme ascii, avec l'éditeur delphi par exemple, en lucida console, tu écrirais un car. ascci correspondant au lucida console, il sera relu avec la fonte définie (arial par exemple) et je suis pas sur qu'il t'afficherait le même car. (bon c'est un mauvais exemple car ces 2 tables sont relativement compatibles...)
    non ?
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  5. #5
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    euh vi, je suis d'accord

    mais ça n'empêche pas que moi, quand l'utilisateur entre une chaîne dans un TEdit (p.ex. 'y'a un caractère spécial ici'), et que je veux l'enregistrer dans le format des fichiers *.dfm, avant de l'écrire je dois la transformer en 'y''a un caract'#123're sp'#124'cial ici'

    ou bien je me gourre quelque part ?
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  6. #6
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Chuis d'accord aussi avec toi, mais j'ai pas bien saisi le but final alors
    tu veux transformer

    'y'a un caractère spécial ici'

    en

    'y''a un caract'#123're sp'#124'cial ici'

    ??
    (tu veux contruire un dfm via ton prog par hasard )
    et tu cherche s'il y a pas une fonction auto pour faire ca ?

    si c'est le cas, je crois que oui, ca existe et il me semble meme que j'ai déjà utilisé ca un jour, je fais des recherches dans les sources (c'etait pour enregistrer des form quickrep pour un générateur d'état)...
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  7. #7
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par TicTacToe
    tu veux contruire un dfm via ton prog par hasard
    et tu cherche s'il y a pas une fonction auto pour faire ca ?
    c'est droit ça !

    désolé de ne pas avoir su me faire comprendre plus vite

    en fait le prog doit extraire les infos d'un dfm, permettre leur édition, puis pour finir sauvegarder le dfm modifié...


    Merci de ton aide
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  8. #8
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    OK, alors j'ai déjà eu à faire ca, comme je le disais pour un générateur d'état, j'ai 2 fonctions qui devraient t'interesser:

    Convertir en composant en chaine
    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
    function ComponentToString( Component : TComponent ) : string;
    var
       BinStream : TMemoryStream;
       StrStream : TStringStream;
       S : string;
    begin
         BinStream := TMemoryStream.Create;
         try
           StrStream := TStringStream.Create( S );
           try
             BinStream.WriteComponent( Component );
             BinStream.Seek( 0, soFromBeginning );
             ObjectBinaryToText( BinStream, StrStream );
             StrStream.Seek( 0, soFromBeginning );
             Result := StrStream.DataString;
           finally StrStream.Free end;
         finally BinStream.Free end;
    end;
    Convertir un chaine en composant
    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
    function StringToComponent( Component : TComponent; const SValeur : string ) : TComponent;
    var
       StrStream : TStringStream;
       BinStream : TMemoryStream;
    begin
         StrStream := TStringStream.Create( SValeur );
         try
           BinStream := TMemoryStream.Create;
           try
             ObjectTextToBinary( StrStream, BinStream );
             BinStream.Seek( 0, soFromBeginning );
             try
               Result := BinStream.ReadComponent( Component );
             except Result := NIL end;
           finally BinStream.Free end;
         finally StrStream.Free end;
    end;
    Il faut que le composant soit créé en amont...

    Je ne sais plus du tout si les codes ascii sont OK, à vérifier !
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  9. #9
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Ok, je suis en train d'essayer d'adapter ton code...

    Le gros problème vient du fait que j'ai uniquement à traiter des chaînes...

    A aucun moment je ne manipule des instances de TComponent ! donc c'est rapé pour les "ObjectBinaryToText" & autres BinStream....

    Je crois que je vais me faire des routines perso, bien bourrins, sinon je m'en sortirai pas... J'espère ne pas avoir de problèmes avec les SBCS<->MBCS...


    Enfin, merci quand même
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    je te propose 2 solutions:
    - la 1ere assez peu élégante mais qui fonctionne :
    enchainer les StringReplace !

    il faut que tu connaisse à l'avance les caractères à remplacer.
    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var s:string;
    begin
    StringReplace(s,'é','''#'+ord('é')+'''',rdReplaceAll);
    StringReplace(s,'è','''#'+ord('è')+'''',rdReplaceAll);
    ...
    - la 2e solution, plus générique et élégante:
    tester si le code ascii d'un caractère de la chaine est supérieur à 127 (limite pour les caractères codés sur 7 bits) et s'il l'est, le remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var x:integer;
    s,temp:string;
    begin
    temp:='';
    for x:=1 to length(s) do
        if ord(s[x])>127 then temp:=temp+'''#'+ord(s[x])+''''
                                else temp:=temp+s[x];
     
    //temp contient la chaine convertie
    je n'ai pas essayé de compiler ces morceaux de code mais ça devrait fonctionner

  11. #11
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    dans l'idée c'est ça

    mais ça doit gérer le MBCS (Multi Byte Character Set -> Caractères japonais & cie), donc je peux pas indexer les caractères de la chaîne avec '[' et ']', vu que je ne sais pas sur combien d'octets chacun est codé...

    Mais ça n'a plus trop d'importance, je viens de remarquer que delphi 6 arrive à lire les caractères spéciaux dans les dfm même s'ils ne sont pas écrit avec #Code.... Quand il les écrit, je pense qu'il les convertit pour qu'on sache à quel caractère ASCII on a réellement à faire, sans ambiguité.... Mais à la lecture il s'en fout pas mal... pour autant qu'il n'y ait pas de saut de ligne

    Ce qui me chagrine, c'est de ne pas avoir réussi à retrouver les algos qui font ces conversions dans les sources de la VCL.... J'aurais bien aimé

    Maintenant, il reste à faire l'autre sens: passer d'une forme 'une cha'#111'ne' à la forme une chaîne
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  12. #12
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par Pill_S
    Maintenant, il reste à faire l'autre sens: passer d'une forme 'une cha'#111'ne' à la forme une chaîne
    Fini ! et même pas si difficile, moi qui en faisait tout un fromage....

    Merci TicTacToe pour les conseils


    topic bouclé
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/05/2006, 22h22
  2. [OS Perso] Récupérer une chaîne de caractères
    Par log2n dans le forum Programmation d'OS
    Réponses: 31
    Dernier message: 14/02/2006, 13h56
  3. [Crystal reports Version 8.x] Conversion Type chaîne en date
    Par Audrey Stelle dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 22/10/2005, 14h58
  4. Conversion de chaîne en entier
    Par SkYsO dans le forum Langage
    Réponses: 4
    Dernier message: 30/08/2005, 11h43

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