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

Lazarus Pascal Discussion :

Migration Delphi-Lazarus : problème d'encodage de caractères [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 29
    Points : 28
    Points
    28
    Par défaut Migration Delphi-Lazarus : problème d'encodage de caractères
    Bonjour,

    Toujours débutant et maintenant en retraite, j'essaie de convertir mes vieilles applis perso - faites en Delphi 3 et 7 - en Lazarus 1.8 installé ces jours-ci.

    J’ai un fichier contenant des notes que j’ouvre dans une StrinGrid.
    Quand je l’ouvre avec l’exe Delphi, dans toutes les cellules de la StringGrid, les lettres accentuées sont correctement lues.
    Quand je l’ouvre avec l’appli Lazarus, dans les cellules, à la place des é, è, à, ë, ù, il y a des ? que je remplace avec une fonction qui change tous les ? en é et je sauvegarde.
    (Je sais que c’est idiot de remplacer tous les é, à, ù etc… par é, mais il fallait bien essayer qq chose );;;

    par ex : num?ros corrigé donne bien numéros dans l’exe Lazarus, et est bien relu numéro à la réouverture.
    Mais alors, dans l’exe Delphi c’est lu numĀ©ros …
    Sachant que j’ai au minimum 3000 cellules à corriger à la main (sur 15.000)
    Au secours… Faut-il tout réécrire et abandonner Delphi ???

    J'ai lu la FAQ et quelques forums, mais n'ai rien compris, parce que si vous, vous savez de quoi vous parlez, moi pas...

    Pour expérimenter j'ai placé sur la StringGrid un bouton et un Edit dans lequel j'ai copié le contenu d'une cellule :

    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
    procedure TRepert.Bouton1Click(Sender: TObject);
    var s:string;
    begin
       Edit1.Text := Grille.Cells[7,2];                           // Ensuite j'ai utilisé une boucle pour toutes les cellules [I, J]
       s := Edit1.Text;
       Edit1.Text := Widestring(StrReplace ('?', 'é',s));  // Widestring ou pas c'est pareil = change bien Tous les ? en é
       Grille.Cells[7,2]:= Edit1.Text;
       Edit1.Text:='';
    end; 
     
    function StrReplace(Substr,replace,s:string):string;
    {============================================================================}
    {remplace toutes les sous-chaines Substr par replace                         }
    { ex : StrReplace ('toto', 'tata', 'le toto est ..') renvoie 'le tata est ..'}
    {============================================================================}
    var ChaineSource,ChaineCible:string;
        i,TailleChaineRemplacement:integer;
    begin
      ChaineSource:=s;
      ChaineCible:='';
      TailleChaineRemplacement:=length(Substr);
      while pos(Substr,ChaineSource)>0 do  //tant que l'on trouve une sous-chaine
      begin
        i:=pos(Substr,ChaineSource)-1;      // position de la sous-chaine à remplacer
        ChaineCible:=ChaineCible+copy(ChaineSource,1,i)+replace;
        delete(ChaineSource,1,i+TailleChaineRemplacement);    //on retire de chaineTemp
      end;
      Result:=ChaineCible+ChaineSource;
    end;
    Et si ça fait pareil pour toutes mes BD, etc... je suis mal parti...

    A vous lire avec attention.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 420
    Points : 1 102
    Points
    1 102
    Par défaut
    Bonjour,

    1/ Je penses que tu aurais du ouvrir une autre discussion pour cette question. [tourlourou EDIT = traité, merci]

    2/ Penses aux balises Code [tourlourou EDIT = traité, merci]

    3/ Les fonctions à utiliser dans LAZARUS sont UTF8ToWinCP et WinCPToUTF8 pour passer de l'encodage ANSI Windows utilisé par Delphi (avant 7 je crois) vers l'encodage UTF8 utilisé par LAZARUS.

    Cordialement

  3. #3
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2012
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 035
    Points : 2 053
    Points
    2 053
    Par défaut
    J’ai un fichier contenant des notes que j’ouvre dans une StrinGrid.
    Tu peux aussi faire une copie de tes fichiers et les convertir en UTF8 pour les utiliser avec Lazarus.

  4. #4
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Bonjour

    Les fichiers textes que tu ouvres dans le stringgrind sont certainement en ansi. Essaye simplement d'ouvrir ton fichier dans NotePad++ https://notepad-plus-plus.org/fr/ et convertis le en UTF8 sans bom cela devrait résoudre le problème des caractères accentués sans passer par une fonction.

    Nom : 2018-10-31_140551.jpg
Affichages : 887
Taille : 26,6 Ko

    Si tu as beaucoup de fichier tu peux essayer cet outils https://www.rotatingscrew.com/utfcast-express.aspx

    ou sous windows dans powershell tu peux tenter ce script : % foreach($i in ls -name DIR/*.txt) { get-content DIR/$i | out-file -encoding utf8 -filepath DIR2/$i } en changeant DIR et DIR2 par tes dossiers "source" et "cible"

    Bonne fin de dimanche
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 29
    Points : 28
    Points
    28
    Par défaut
    Bonjour,
    Merci pour vos réponses.

    Acaumes : tu as raison, j’aurais dû ouvrir une autre discussion… Je m’en suis rendu compte après…

    mm_71 et BeanzMaster : J’ai essayé la conversion en UTF-8 avec Notepad++ qui donne effectivement un résultat quant au texte, mais ensuite, l’ouverture dans la StringGrid est plutôt cocasse… Tous les string sont décalés harmonieusement dans les cellules…

    Je n’ai pas encore essayé avec des textes ouverts dans des memo. Chaque chose en son temps.

    powershell qui ne m’est pas du tout familier. Autre sujet de découverte… pour le fichier C:\TOOLS\PTT\Memo.txt

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    % foreach($i in ls -name C:\TOOLS\PTT/Memo.txt) { get-content C:\TOOLS\PTT/$i | out-file -encoding utf8 -filepath C:\TOOLS\PTT\AA/$i }

    Message erreurs :

    Au caractère Ligne:1 : 14
    + % foreach($i in ls -name C:\TOOLS\PTT/Memo.txt) { get-content C:\TOOL ...
    +              ~~
    Jeton inattendu « in » dans l’expression ou l’instruction.
    Au caractère Ligne:1 : 13
    + % foreach($i in ls -name C:\TOOLS\PTT/Memo.txt) { get-content C:\TOOL ...
    +             ~
    Parenthèse fermante « ) » manquante dans l’expression.
    Au caractère Ligne:1 : 47
    + % foreach($i in ls -name C:\TOOLS\PTT/Memo.txt) { get-content C:\TOOL ...
    +                                               ~
    Jeton inattendu « ) » dans l’expression ou l’instruction.
        + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : UnexpectedToken
    J'ai des progrès à faire.

    A vous lire

    Cordialement

  6. #6
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2012
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 035
    Points : 2 053
    Points
    2 053
    Par défaut
    Tous les string sont décalés harmonieusement dans les cellules…
    Une copie d'écran serait la bienvenue.

  7. #7
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Bonjour, pour le script powershell c'est de ma faute. À la place ouvre l'éditeur de script PowerShell ISE et copie ces lignes :
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $sourceFolder = " C:\TOOLS\PTT"
    $destFolder = "C:\TOOLS\PTT\AA"
     
    $files = Get-ChildItem $sourceFolder -Filter *.txt
     
    for ($i=0; $i -lt $files.Count; $i++) {
        $outfile = Join-Path $destFolder $files[$i].Name 
        Get-Content $files[$i].FullName | Where-Object { !($_ -match 'step4' -or $_ -match 'step9') } | Set-content  $outfile -Encoding UTF8
    }

    Et lance-le avec l'icône Exécuter ou la touche F5.

    Par contre je n'ai pas testé, quand le dossier de destination n'est pas créé avant. Donc, assure-toi que le dossier de sortie existe.

    Normalement la conversion devrait s'effectuer sans problème.

    Comme le dis mm_71 donne-nous une capture du StringGrid lorsque tu charges ton fichier, pour voir ce fameux décalage.

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  8. #8
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2012
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 035
    Points : 2 053
    Points
    2 053
    Par défaut
    pour voir ce fameux décalage.
    Question bête: Même après la conversion en UTF8 est-ce que notepad++ remplace les sauts de ligne windows chr()10 chr(13) par ceux de linux chr(10) ?

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 29
    Points : 28
    Points
    28
    Par défaut
    Bonjour, (Bonsoir ?)

    Voici les captures demandées : Nom : Image1.jpg
Affichages : 948
Taille : 109,5 KoNom : Image2.jpg
Affichages : 961
Taille : 130,6 KoNom : Image3.jpg
Affichages : 877
Taille : 80,9 KoNom : Image4.jpg
Affichages : 879
Taille : 150,1 KoNom : Image5.jpg
Affichages : 923
Taille : 36,5 Ko

    Un problème est lié au fait que le classement alphabétique est faussé dans la première colonne de la grille et qu'on n'y retrouve pas le même StringGrid.itemIndex selon l'encodage que dans le ComboBox qui est lié et qui sert à y rechercher une entrée... Et que quoi que j'ai pu faire, la grille reste inutilisable après conversion.
    Ce n'est pas grave, j'ai refait entièrement le programme en écrivant deux fois moins de lignes de code ... (C'était ma première appli avec Delphi 3). et corriger les accents de la première colonne ne me demandera que qq heures pas plus...
    Les autres appli, c'était pour mon boulot, des miliers de fichiers patients, des comptes rendus, etc... c'est pas grave. Même si un contrôleur venait à me cherche des poux ...

    mm_71 : Je ne sais pas répondre à ta question... Pour cela j'ai joint les copies Image4 et Image5 (avant/après) du Notepad++

    Merci de l'intérêt que vous portez à ce problème.

    A vous lire.

    Cordialement.

  10. #10
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2012
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 035
    Points : 2 053
    Points
    2 053
    Par défaut
    mm_71 : Je ne sais pas répondre à ta question... Pour cela j'ai joint les copies Image4 et Image5 (avant/après) du Notepad++
    La seconde copie d'écran y répond, on voit un petit rectangle devant les les lignes et ça c'est un caractère non représentable et il y-a gros à parier que c'est un chr(13).

    Regarde test fichiers avec un éditeur hexadécimal, à la fin de chaque ligne il doit y avoir 10 13, en supprimant tous les chr(13) des fichiers ça devrait aller mieux.

  11. #11
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Bonsoir

    Ton fichier Memo.rep que l'on peut voir sur ta capture, il a été créé comment ? tu l'as enregistré depuis une application que tu avais écrite via un record ? tous les "null" me paraisse bizarre, cela ne semble pas être un fichier 100% texte écrit à la main.
    Pour le script que je t'ai passé bizarre également qu'il ne trouve pas ton lecteur "C". Essayes d'enlevé le premier espace que j'ai laissé trainé dans $sourceFolder = " C:\TOOLS\PTT" et surtout lance le depuis Powershell ISE mais pas attention dans le shell directement, tu du dois le taper dans l'éditeur de script en cliquant sur le bouton "nouveau" le 1er à gauche, puis le lancer.

    Nom : 2018-11-07_204523.jpg
Affichages : 798
Taille : 48,6 Ko
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  12. #12
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    après la conversion en UTF8 est-ce que notepad++ remplace les sauts de ligne windows chr()10 chr(13) par ceux de linux chr(10) ?
    Non, et heureusement, car les sauts de ligne n'ont aucun rapport avec l'encodage, ils sont liés à des choix anciens des systèmes (UNIX ou WINDOWS).
    A ma connaissance Lazarus gère ça très bien, mais si on veut faire ses propres traitements de lecture ou écriture il faut mieux accepter facultativement en lecture et écrire les 2 caractères CR+LF pour être plus compatible.

    Sachez aussi qu'il y a dans Lazarus tout ce qu'il faut pour convertir les sources et autres fichiers (un par un) en changeant leurs jeux de caractères, ou aussi d'ailleurs le(s) caractère(s) de fin de ligne.
    Notepad++ n'est donc pas indispensable pour cela.
    Clic-droit sur un source, Paramètres du fichier, Encodage : affiche l'encodage actuel
    Si on choisit alors un autre encodage, on nous demande s'il faut "changer le fichier" et si on répond Oui le fichier est converti.
    Peut-être que les suggestions "Changer le fichier"/"Ouvrir avec un autre encodage" ne sont pas très claires et qu'il faudrait mieux "Enregistrer dans le nouvel encodage (O/N)". La traduction est toutefois correcte. A l'occasion je soumettrai la proposition d'amélioration.

    Enfin rappelons que l'unité LazUTF8 contient une quantité de fonctions sur chaînes de caractères, qui permettent de convertir l'encodage par programme, et aussi de détecter l'encodage existant quand il y a des caractères accentués ou spéciaux.
    Je n'ai pas trouvé d'outil Lazarus existant permettant de convertir un ensemble de fichiers comme le fait BeanzMaster avec PowerShell, mais ça doit prendre 15 minutes à écrire et pourrait à mon avis être plus facile à maîtriser que PowerShell.

    Pour finir, un petit rappel pour les "vieux" Delphistes : l'Unicode n'est pas une originalité de Lazarus. Delphi XE fonctionne aussi avec (depuis plus de 7 ans), et pose les mêmes problèmes de migration. Il ne faut pas s'accrocher au codage ANSI ou ISO-8859 qui est obsolète et convertir autant que possible les applications et leurs données en UTF-8.
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 29
    Points : 28
    Points
    28
    Par défaut
    mm_71 et : Hélas non !
    Avec le fichier modifié par Notepad++, lorsque, dans la première colonne de la grille, je passe d'une ligne à l'autre, les textes passent d'une cellule à la voisine de façon continue, comme s'il n'y avait pas de barrière entre chaque cellule...
    J'ai examiné mon fichier avant et après modif avec un WinHex récent sans rien noter de spécial.

    BeanzMaster : En appliquant bien tes directives, Le fichier modifié depuis Powershell ISE, n'est pas déchiffrable. Cf. image.
    il n'y a plus de correspondance entre les string du record...

    C'est bien un Record, créé au début par l'appli et ensuite chargé dans l'appli par du code dans FormCreate.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      const
    titres:array[0..12]of string = ('......)  etc.
    Tintinux : Merci de t'y intéreser.

    Mon fichier n'est pas un fichier Delphi, c'est un fichier (record) créé à partir d'une appli Delphi 3.

    Cordialement.
    Images attachées Images attachées  

  14. #14
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2012
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 035
    Points : 2 053
    Points
    2 053
    Par défaut
    mm_71 et : Hélas non !
    Avec le fichier modifié par Notepad++, lorsque, dans la première colonne de la grille, je passe d'une ligne à l'autre, les textes passent d'une cellule à la voisine de façon continue, comme s'il n'y avait pas de barrière entre chaque cellule...
    J'ai examiné mon fichier avant et après modif avec un WinHex récent sans rien noter de spécial.
    Pourtant dans ta copie d'écran on voit clairement qu'il se trouve des caractères non représentables qui semblent à l'origine du décalage ?

    Si les données ne sont pas trop privées tu pourrais en mettre un extrait à télécharger pour qu'on voie ce qui se passe ?

    Nom : Image2a.jpg
Affichages : 785
Taille : 19,8 Ko

    Mon fichier n'est pas un fichier Delphi, c'est un fichier (record) créé à partir d'une appli Delphi 3.
    Là il faudrait le convertir en texte ou en stringlist parce qu’ici il inclut une brouette de caractères qui n'ont rien à voir avec du texte.

  15. #15
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    euh j'ai bien lu fichier de record ?
    est tu sur d'avoir les meme type que lors du D3 la taille des entier a change si je me souviens bien
    le format de chaine aussi ... on peut voir la structure du record ?
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  16. #16
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut,

    C'est un record ? ou ton fichier est définit par un tableau car titres:array[0..12]of string =(....) ici je suppose que ce sont les titres de tes colonnes dans le TStringGrid; non ?
    Si c'est un record c'est normal que la conversion "Brut de pomme" en UTF-8 ne fonctionne pas. Ca ce n'est pas un fichier texte 100% même si tous les champs de ton record sont des "string" Dans le cas présent une autre méthode s'impose.

    ton record devrait ressembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Type
       TContact = record
           identite      : String[64];
           TelPrive      : String[14];
           TelDomicile : String[14];
           TelMobile    : String[14];
           TelFax        : String[14];
           UrlWeb      : String[128];
           EMail         : String[128];
           .....
       end;
    Pourrais tu également nous fournir la structure exacte de ton "record", le code qui t'as servi à enregistrer tes données et le code qui te sert à les charger.

    Bonne soirée
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 29
    Points : 28
    Points
    28
    Par défaut
    Bonsoir,

    Pour répondre à vos interrogations voici la copie de l'implémentation sous Lazarus.

    mm_71 : un court extrait du fichier original Memo.rep dont j'ai retiré les items trop privés.
    L'extension .rep ne plaisant pas aux pièces jointes j'ai modifié en .txt. Il est à renommer Memo.rep

    Anapurna :

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    type
    Personne = record
      Identite : string [70];
      Prive : string [20];
      Bureau : string [20];
      Fax : string [20];
      Portable : string [20];
      NET : string [100];
      EMail : string [100];
      Adresse : string [250];  {250 étant souvent insuffisant j'ai ajouté "Notes"}
      Notes : string [250]; 
      Autres1 : string [20];
      Autres2 : string [20];
      Autres3 : string [20];
      Autres4 : string [20];
    end;
    FichierPersonnes = file of Personne; 
     
     
    BeansMaster :
     
    procedure TForm1.FormCreate(Sender: TObject);
    const
    titres:array[0..12]of string = ('Identité', 'Privé',
    'Bureau', 'Fax', 'Portable', 'NET', 'EMail', 'Adresse',
    'Notes', 'Autres1', 'Autres2', 'Autres3', 'Autres4');
    var
     i, j:integer;
     quelquun : Personne;
     fichier : FichierPersonnes;
     n : integer;
     
      begin
       for i:=0 to  12 do
       StringGrid1.Cells[i,0]:=titres[i]; 
       AssignFile(fichier, 'C:\Tools\Ptt\Memo.rep');   
       Reset(fichier);
       n:=1;                                 // n=2 Pour laisser la première ligne vide
     
      while not eof(fichier) do  
       begin
        read(fichier, quelquun);
         with StringGrid1, quelquun do
          begin
           Cells [0,n] := Identite;
           Cells [1,n] := Prive;
           Cells [2,n] := Bureau;
           Cells [3,n] := Fax;
           Cells [4,n] := Portable;
           Cells [5,n] := NET;
           Cells [6,n] := EMail;
           Cells [7,n] := Adresse;
           Cells [8,n] := Notes;
           Cells [9,n] := Autres1;
           Cells [10,n] := Autres2;
           Cells [11,n] := Autres3;
           Cells [12,n] := Autres4;
     
           if Cells [0,n]<>'' then
           StringGrid1.RowCount:= StringGrid1.RowCount+1; // Sinon OutOfRange
     
         for j:= 1 to  StringGrid1.RowCount-1 do
           ComboBox1.Items.Add(Cells[0,j]);      //Sauf les deux premières lignes qui restent inaccessibles ???
           ActiveControl:=ComboBox1;
     //      StringGrid1.Row:= 2;            // Initialisée avec 4 Rows dans Inspecteur Objets     
         end;
       inc(n);
      end;
      System.Close(fichier);
     
    end;  
     
     
    procedure TForm1.EnregistrerClick(Sender: TObject);
    var
    quelquun : Personne;
    fichier : FichierPersonnes;
    ligne : integer;
     
    begin
    System.Assign(fichier, 'C:\Tools\Ptt\Memo.rep');
    Rewrite(fichier);
    for ligne := 1 to StringGrid1.RowCount-1 do
      with StringGrid1.Rows[ligne], quelquun do
      begin
       Identite := strings[0];
       Prive := strings[1];
       Bureau := strings[2];
       Fax := strings [3];
       Portable := strings [4];
       NET := strings [5];
       EMail := strings [6];
       Adresse := strings[7];
       Notes := strings[8];
       Autres1 := strings[9];
       Autres2 := strings[10];
       Autres3 := strings[11];
       Autres4 := strings[12];
     
       write(fichier, quelquun);
       end;
      System.Close(fichier);
     
    end;
    Pour tout dire ,,, j'en ai un peu ma claque ! J'ai mal au crâne !
    Essayez d'ajouter une ligne intercalaire (en décalant par le bas) et vous verrez
    comment le contenu des cellules "Adresse" et "Notes" se dispatchent dans les autres cellules
    à cause des "renvois à la ligne" qui sont pris pour des fin de cellule (où qq chose comme ça)...
    (Dans mon appli "Adresse" et "Notes" sont renseignés à part dans des Memo dont le contenu est renvoyé dans les
    cellules correspondantes de la Grille...) Mais ce devrait être dans un autre topic...

    Cordialement.Pièce jointe 426027

  18. #18
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut

    Je viens de faire une petite app voila le résultat

    Nom : 2018-11-10_224750.jpg
Affichages : 831
Taille : 115,8 Ko

    Tous est dans le zip : memorep.zip

    Petite suggestions évites les with truc1, truc2 do cela peut posé des problèmes. Essayes également de suivre les recommandations d'écriture du code comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Type 
      Personne = record
    devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Type 
      TPersonne = record
    Cela évite les confusions avec les variables ou nom de méthodes par exemples.

    Essayes également de mieux diviser ton code. Dans mon exemple j'ai créé une procedure "LoadData" pour charger les données. Tu peux même éviter la boucle for qui remplit le combobox (je ne l'ai pas fait dans l'exemple)

    en modifiant le code dans loaddata par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Var
      identite : string;
    begin
     ...
     ComboBox1.Items.Clear; 
     With StringGrid1 do
     begin   
         Identite := CP1252ToUTF8(Personne.Identite); 
         Cells[0,n] := Identite; 
         ComboBox1.Items.Add(Identite);  
         ...
     end;
    Ton problème n'était pas grand chose tes données étant en ANSI (codepage 1252) une petite conversion suffisait. Mais tu ne pouvait pas deviner ou se trouvait La fonction adéquate (cf unit LConvEncoding).

    Tu peux supprimer le fichier "memo.txt" du serveur de DVP (cf "gérer les pièces jointe") et les images en modifiant tes précédents messages, vu qu'il y a des données personnelles.

    Bonne fin de soirée
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  19. #19
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2012
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 035
    Points : 2 053
    Points
    2 053
    Par défaut
    Selon chardet ton fichier record est encodé en Windows-1254et pas en UTF-8 donc souci, il faudrait convertir.
    Ajoute dans uses
    et ensuite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Cells [0,n] := CP1254ToUTF8(Identite),
    Cells [0,n] := CP1254ToUTF8(Prive),
    Etc...
    Une fois la grille remplie tu peux ajouter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      StringGrid1.SaveToFile('/home/moi/Bureau/test.txt');
      StringGrid1.SaveToCSVFile('/home/moi/Bureau/test0.txt');
    Pour voir plus clairement ce que ça a donné.

  20. #20
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2012
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 035
    Points : 2 053
    Points
    2 053
    Par défaut
    Bon... Le temps que j'aille prendre un café et beanzmaster a donné la réponse. Seule différence, chardet m'a donné Windows-1254 et pas 1252 ?

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

Discussions similaires

  1. problème d'encodage de caractères spéciaux
    Par anti-conformiste dans le forum Langage
    Réponses: 3
    Dernier message: 14/12/2006, 09h42
  2. [mssql8sp3] problème d'encodage de caractères
    Par arnolem dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 24/10/2006, 17h31
  3. Réponses: 3
    Dernier message: 24/10/2006, 11h05
  4. Problème d'encodage de caractères
    Par Felmorian dans le forum ASP
    Réponses: 1
    Dernier message: 04/07/2006, 17h36

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