Copier chaine d'un TMemo [Résolu]

Signaler
Messages postés
76
Date d'inscription
mardi 18 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2014
-
Messages postés
76
Date d'inscription
mardi 18 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2014
-
Bonsoir à tous,

j'ai un petit souci sur un traitement à partir d'un Tmemo.
Sur ma fiche un Memo1 dans lequel il y a des mots et des chiffres.

exemple:

Jojo, 5100
Robert, 2701
Foufou, 2651
Sara, 1, 21-29, 31-60, 990-1000

je veux copier les mots comme :Jojo,Robert,Foufou,Sara dans un Memo2

et seulement les chiffres dans un autre Memo3.
Memo2=
Jojo (1ère ligne)
Robert (2e ligne)
Foufou (3e ligne)
Sara (4e ligne)

et
Memo3=
5100
2701
2651
1, 21-29, 31-60, 990-1000

comment le faire svp?

Merci





NABIL1974

11 réponses

Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
30
Quand on traite ce genre de données, il faut être un minimum standard et rigoureux pour eviter à avoir à pondre des méthode imbuvables.

bon par contre oui, la première virgule semble être le déclencheur de coupure.

on peu considérer la donnée comme étant "clef", "valeur"

soit la fonction suivante :

procedure splitDatas(Lines, Keys, Values: TStrings);
var N, P1, P2, L: integer;
    S, K, V: string;
begin
  Keys.BeginUpdate;
  Values.BeginUpdate;
  try
    Keys.Clear;
    Values.Clear;

    for N := 0 to Lines.Count - 1 do
    begin
      S  := Lines[N];
      P1 := 1;
      P2 := pos(',', S);
      L  := Length(S);
      K  := '';
      V  := '';
      // no invalid row
      if P2 <> 0 then
      begin
        // copy Key
        K := copy(S, P1, P2-P1);

        P1 := P2+1;
        P2 := L;
        // trim left
        while (S[P1] in #9) and (P1 <= L) do
          inc(P1);
        // trim right
        while (S[P2] in #9, #10, #13) and (P2 > 1) do
          dec(P2);

        if (P1 <= P2) and (P2<>0) then
          // copy Value
          V := copy(S, P1, P2-P1+1);

        // no null key and value
        if (K <> '') and (V <> '') then
        begin
          Keys.Add(K);
          Values.Add(V);
        end;
      end;
    end;
  finally
    Values.EndUpdate;
    Keys.EndUpdate;
  end;
end;


utilisation :

splitDatas(MemoDatas.Lines, MemoKeys.Lines, MemoValues.Lines);


________________________________________________________
besoin de câbles audio, vidèo, informatique pas cher ?
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
12
Salut
dans le cas particulier que tu donnes, tu peux essayer un truc comme cela :
procedure TForm1.Trucmuche;
var z:string;
begin
memo2.clear;
memo3.clear;
for i:=0 to memo1.Lines.Count-1 do
  begin
    z := memo1.lines[i];
    memo2.lines.add(copy(z,1,pos(',',z)-1);
    memo3.lines.add(trim(copy(z,pos(',',z)+1,length(z))));
  end;
end;


à vérifier car je n'ai pas testé !


Dubois77
site perso
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
12
tu as du rectifier toi même : il fallait mettre :
var z:string; i:integer;


Dubois77
site perso
Messages postés
76
Date d'inscription
mardi 18 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2014

Bonjour,
Merci pour ta réponse, mais cette fonction copie toutes les lignes avec les caractères et les chiffres.

NABIL1974
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
12
bonjour,

fait un peu à l'arrache mais ça semble marcher :

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, test: integer;
  ligne, concaN, concaC: string;
begin

  for i := 0 to Memo1.Lines.Count - 1 do
  begin
    for j := 1 to length(Memo1.Lines.Strings[i]) do
    begin
      ligne := Memo1.Lines.Strings[i];

      case TryStrToInt(Ligne[j], test) of
        true: concaN := concaN + Ligne[j];

        false: concaC := concaC + Ligne[j];
      end;

      if (Ligne[j] = ' ') or (j = length(Ligne)) then
      begin
        if concaN <> '' then
          Memo2.Lines.Add(concaN)
        else
          if concaC <> '' then
            Memo3.Lines.Add(concaC);
            
        concaN := '';
        concaC := '';
      end;
    end;
  end;
end;





cantador
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
15
Hi guys,

Allez, voici le mien :

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  s: string;
  CommaPos: Integer;
  P: PChar;
begin
  Memo2.Clear;
  Memo3.Clear;
  for i := 0 to Memo1.Lines.Count - 1 do
  begin
    s := Memo1.Lines[i];
    CommaPos := Pos(',', s);
    s[CommaPos] := #0;
    Memo2.Lines.Add(s);
    P := @s[CommaPos + 2];
    Memo3.Lines.Add(P);
  end;
end;


Delphi, à agiter avant de servir...
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
12
Merci pour ta réponse, mais cette fonction copie toutes les lignes avec les caractères et les chiffres.

c'est doc que ton memo1 de départ ne contient pas ce que tu donnes en exemple :
Jojo, 5100
Robert, 2701
Foufou, 2651
Sara, 1, 21-29, 31-60, 990-1000


dans la procédure , c'est la virgule qui est testée donc obligatoire !!

Dubois77
site perso
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
12
Nabil, je me permets d'insister : ton memo1 contient quoi exactement ?
car avec ce que tu donnes dans ta question :

Jojo, 5100
Robert, 2701
Foufou, 2651
Sara, 1, 21-29, 31-60, 990-1000


et la proc qui suit :

procedure TForm1.Trucmuche;
var z:string; i:integer;
begin
memo2.clear;
memo3.clear;
for i:=0 to memo1.Lines.Count-1 do
  begin
    z := memo1.lines[i];
    memo2.lines.add(copy(z,1,pos(',',z)-1));
    memo3.lines.add(trim(copy(z,pos(',',z)+1,length(z))));
  end;
end;

j'ai testé, ça fonctionne parfaitement le résultat dans les memo2 et memo3 sont conformes à ce que tu veux avoir dans ta première question.


Dubois77
site perso
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
12
preuve à l'appui :





Dubois77
site perso
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
12
Bonjour,

Dans cet exercice tout le monde a bon, mais il faut
voir celui qui a su généraliser au maximum la procédure et
dans cette optique, f0xi est le champion,
car rien n'est codé en dur..

l'avantage ?

Sa méthode peut-être intégrer
dans un autre programme sans difficulté en adaptant simplement
les paramétrages.

bravo !

merci à nabil351974 d'accepter cette réponse

cantador
Messages postés
76
Date d'inscription
mardi 18 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2014

Bonsoir,

Merci les gars pour votre précieuse aide.ça m'a vraiment aidé!

Comme a dit cantador tout le monde a bon.

encore une fois merci à tous.




NABIL1974