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 :

Stockage d'un mémo dans une chaîne


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Avatar de joreveur
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 293
    Par défaut Stockage d'un mémo dans une chaîne
    Bonjour
    sur un petit exemple quand j'essaie d'échanger la valeur de 2 memo en passant par une chaine je n'ai pas de soucis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.Button1Click(Sender: TObject);
    var swap:string;
    begin
    swap:=memo1.Text;
    memo1.text:=memo2.Text;
    memo2.Text:=swap;
    end;
    quand j'essaie caractère par caractère ça ne fonctionne pas sur les caractère accentués. ils sont supprimés ...

    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.Button2Click(Sender: TObject);
    var i:integer;
        swap1,swap2:string;
     
    begin
      swap1:=memo1.Text;
      swap2:=memo2.Text;
      memo1.clear;
      for i:=1 to length(swap2) do
          memo1.text:=memo1.text+swap2[i];
      memo2.clear;
      for i:=1 to length(swap1) do
          memo2.text:=memo2.text+swap1[i];
    end;
    or justement j'ai besoin de cette deuxième méthode.

    Une idée ?

    voila tout le code de mon exemple
    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
    unit Unit1;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Memo1: TMemo;
        Memo2: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    procedure TForm1.Button1Click(Sender: TObject);
    var swap:string;
    begin
    swap:=memo1.Text;
    memo1.text:=memo2.Text;
    memo2.Text:=swap;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    var i:integer;
        swap1,swap2:string;
     
    begin
      swap1:=memo1.Text;
      swap2:=memo2.Text;
      memo1.clear;
      for i:=1 to length(swap2) do
          memo1.text:=memo1.text+swap2[i];
      memo2.clear;
      for i:=1 to length(swap1) do
          memo2.text:=memo2.text+swap1[i];
     
     
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      memo1.text:='ce sera bientôt l''été';
      memo2.text:='le printemps à Pâques';
    end;
     
    end.
    merci de vos conseils et bonne journée

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 158
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 158
    Par défaut
    Yop !
    Citation Envoyé par joreveur Voir le message
    quand j'essaie caractère par caractère ça ne fonctionne pas sur les caractère accentués. ils sont supprimés ...
    Le problème des caractères multi-bytes, le retour

    Essaye de faire l'échange en utilisant des bytes (mais je ne vois pas comment "attribuer" les bytes à la propriété "text" des mémos...)

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 173
    Billets dans le blog
    9
    Par défaut
    Bonjour ! Chez moi (Lazarus 1.4.4, Windows), la solution suivante fonctionne. Mais il y a peut-être mieux.

    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
    uses
      LazUTF8;
     
    procedure TForm1.Button3Click(Sender: TObject);
    var
      i: integer;
      swap1, swap2: UTF8String;
    begin
      swap1 := Memo1.Text;
      swap2 := Memo2.Text;
     
      Memo1.Lines.BeginUpdate;
      Memo1.Clear;
      for i := 1 to UTF8Length(swap2) do
        Memo1.Text := Memo1.Text + UTF8Copy(swap2, i, 1);
      Memo1.Lines.EndUpdate;
     
      Memo2.Lines.BeginUpdate;
      Memo2.Clear;
      for i := 1 to UTF8Length(swap1) do
        Memo2.Text := Memo2.Text + UTF8Copy(swap1, i, 1);
      Memo2.Lines.EndUpdate;
    end;
    L'appel des méthodes BeginUpdate et EndUpdate n'est pas absolument nécessaire, mais permet d'améliorer l'affichage et aussi la vitesse de l'opération.

  4. #4
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Bonsoir,

    En utilisant un stream, je n'ai aucun problème (Lazarus 1.4.4 sous Win7)

    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.Button1Click(Sender: TObject);
    var
      MS: TMemoryStream;
    begin
       MS:= TMemoryStream.Create;
       try
          Memo1.Lines.SaveToStream(MS);
          Memo1.Text:= Memo2.Text;
          MS.Position:= 0; // se remettre au début du stream
          Memo2.Lines.LoadFromStream(MS);
       finally
          MS.Free;
       end;
    end;
    Cordialement
    Thierry

    EDIT : Oups, je viens de me rendre compte que le vrai problème est le passage par caractères ! Désolé.

  5. #5
    Rédacteur

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Bonjour ! Chez moi (Lazarus 1.4.4, Windows), la solution suivante fonctionne. Mais il y a peut-être mieux.

    Bonsoir,

    C'est effectivement la piste pour la solution du problème. Dans un futur proche, Lazarus aura terminé sa mue vers l'internationalisation (UTF8 essentiellement) comme Delphi l'a fait il y a plusieurs années.
    Il faut par conséquent oublier le traitement comme on le pratiquait avec les caractères ASCII
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  6. #6
    Membre émérite

    Homme Profil pro
    Rédacteur technique (retraité)
    Inscrit en
    Octobre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rédacteur technique (retraité)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 168
    Par défaut Composition d'une chaîne UTF8 octet par octet
    On peut "composer" une chaîne UTF8 octet par octet mais il ne faut pas le faire directement dans une propriété chaîne d'un composant.

    En effet, le Writer d'une propriété chaîne UTF8 d'un composant LCL peut effectuer un contrôle de validité de la chaîne pour éliminer les séquences illégales, ce qui ne manquera pas d'arriver si des caractères multi-octets sont écrits octet par octet.

    Par exemple ceci ne marche pas car Edit2.Text se voie affecter successivement tous les états intermédiaires de la chaîne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Edit2.Clear;
    For I := 1 To Length(Edit1.Text) Do Begin
      Edit2.Text := Edit2.Text + Edit1.Text[I];
    end;
    A la place il faut travailler sur une variable chaîne ordinaire qui ne fait pas ce contrôle et ceci fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var S : String;
    ...
    S := '';
    For I := 1 To Length(Edit1.Text) Do Begin
      S := S + Edit1.Text[I];
    end;
    Edit2.Text := s;
    Testé avec Lazarus 1.4.4 ET 1.6RC1.

  7. #7
    Rédacteur

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par DomDA91 Voir le message
    On peut "composer" une chaîne UTF8 octet par octet mais il ne faut pas le faire directement dans une propriété chaîne d'un composant.

    A la place il faut travailler sur une variable chaîne ordinaire qui ne fait pas ce contrôle et ceci fonctionne...

    Testé avec Lazarus 1.4.4 ET 1.6RC1.
    Très juste Cependant, j'aurais tendance à déconseiller cette pratique, car il me semble qu'il vaut mieux éviter de fonder son travail sur une implémentation obsolète d'encodage des caractères. Lazarus va vers UTF8 (ou, pour le moins vers Unicode) et il est fort à parier que l'on pourra (prochainement ?) traiter les caractères de manière transparente sans s'occuper de savoir s'il s'agit d'1, 2 ou d'un nombre variable d'octets pour les représenter. Plus simplement, il vaut mieux travailler sur des caractères sans préjuger de leur implémentation.
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  2. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  3. Réponses: 23
    Dernier message: 16/11/2002, 19h41
  4. [TP]lire une ligne de l'ecran et la stocker dans une chaine
    Par Bleuarff dans le forum Turbo Pascal
    Réponses: 26
    Dernier message: 02/07/2002, 10h08
  5. Réponses: 3
    Dernier message: 12/06/2002, 21h15

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