Extraire et additionner les chiffres d'un Memo

Résolu
nabil351974 Messages postés 75 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 11 mars 2014 - 20 févr. 2013 à 20:46
nabil351974 Messages postés 75 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 11 mars 2014 - 22 févr. 2013 à 09:20
bonsoir,

voilà, j'ai un Memo1 qui contient des chaînes comme :

6010-6012 [3]
2702-2703 [2]
2051-2070 [20], 2091-2180 [90], 2188-2600 [413]
2654 [1]
2-9 [8], 11-20 [10]
2604 [1]



Je veux extraire et additionner seulement les chiffres de chaque ligne qui sont entre crochets [] et mettre le résultat dans un autre Memo(Memo2):

exemple:
3
2
523 (résultat de : 20 + 90 + 413 )
1
18 (résultat de : 8 + 10 )
1


Donc Memo2 recevra:

3
2
523
1
18
1



Merci de votre aide

NABIL1974

11 réponses

pierrotk10d Messages postés 109 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 17 février 2023 3
21 févr. 2013 à 15:28
Bonjour,
Voici une solution simple qui peut être optimisée au niveau des variables dans les fonctions. J'ai mis ces variables pour que ce soit plus lisible.

Function RtnData(cLigne: string): Integer;
Var nDebutData, nFinData, nNbCarData: Integer;
Begin
  nDebutData := Pos('[', cLigne);
  nFinData   := Pos(']', cLigne);
  nNbCarData := nFinData - (nDebutData +1);
  Result := StrToInt(Copy(cLigne, (nDebutData +1), nNbCarData));
end;

Function SommeLigne(cLigne: string): Integer;
Var nTotal, nLen: Integer;
Begin
  nTotal := 0;
  Repeat
    nLen := Length(cLigne);
    nTotal := nTotal + RtnData(cLigne);
    cLigne := Copy(cLigne, Pos(']', cLigne) +1, nLen);
  until Length(cLigne) = 0;
  Result := nTotal;
end;

// ********************************************************************

procedure TForm1.BtnVideMemo2Click(Sender: TObject);   // Vidage du memo2
begin
  Memo2.Clear;
end;

procedure TForm1.BtnFillMemo2Click(Sender: TObject);  // Remplissage du Memo2
Var i: Integer;
begin
   For i := 0 to Memo1.lines.Count -1 do
      Memo2.Lines.Add(IntToStr(SommeLigne(Memo1.Lines[i])));
end;

end.  




pierrot
3
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
20 févr. 2013 à 22:21
Salut,

Tu veux une réponse standard et rigoureuse, ou une méthode imbuvable ?

Moi je fais plutôt dans l'imbuvable...
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
21 févr. 2013 à 09:06
Salut,
Pourquoi ne pas penser le problème autrement et remplir ton memo2 en même temps que le 1 ? Ça me semble plus facile à faire non ? Vu que tu affiche les chiffres dans memo1, tu peux les mettre en mémoire, les additionner et les afficher dans memo2 dès que tu as un changement de ligne dans memo1

Simon
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
21 févr. 2013 à 10:41
Salut,

utilise la fonction pos() pour trouver '[' sur chaque ligne et ainsi extraire la valeur!

Tu peux aussi utiliser la fonction String_copy(taligne, '[', true, ']', true) de l' unité cyStrUtils.pas des compos Cindy!

a+


Composants Cindy pour Delphi
Faites une donation.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
21 févr. 2013 à 11:11
@Mauricio : ou StrBeetwen de la jcl...
J'ai vu que tu avais un compteur d'occurence de substring dans cyStrUtils... Il manque plus qu'un paramètre à String_copy pour atteindre une occurence particulière de la substring !

Simon
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
21 févr. 2013 à 11:12
StrBetween, pardon.


Simon
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
21 févr. 2013 à 11:14
@Simonpelloquin:
"J'ai vu que tu avais un compteur d'occurence de substring dans cyStrUtils"
- Oui, c' est SubString_Count()

"Il manque plus qu'un paramètre à String_copy"
- Tu as SubString_Get()!

a+


Composants Cindy pour Delphi
Faites une donation.
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
21 févr. 2013 à 11:37
Super ! Je ne l'avais pas vu... Désolé

Simon
0
nabil351974 Messages postés 75 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 11 mars 2014
21 févr. 2013 à 14:47
Merci les gars,

j'ai utilisé la fonction pos() que m'a conseillé MAURICIO, ça marche bien sauf quant il s'agit de plusieurs occurrences dans la même ligne, elle capture seulement la 1ère occurrence et loupe les autre.
ex:

2051-2070 [20], 2091-2180 [90], 2188-2600 [413]

ceux qui sont rouges sont loupé.


voici mon code:

function ExtractDelimitedString(const s: string): string;
var
p1, p2: Integer;
begin
p1 := Pos('[', s);
p2 := Pos(']', s);
if (p1<>0) and (p2<>0) and (p2>p1) then begin
Result := Copy(s, p1+1, p2-p1-1);
end else begin
Result := '';
end;
end;

l'appel de la fonction:

procedure TForm1.LMDButton2Click(Sender: TObject);
var i:integer;
begin

for i:= 0 to Memo1.Lines.Count do
begin
Memo2.Lines.Add(ExtractDelimitedString(Memo1.Lines[i]) );
end;

comment faire pour extraire toutes les occurrences de la même ligne et de compter les valeurs de cette ligne?

Merci




NABIL1974
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
21 févr. 2013 à 16:55
Nabil, je me permets d'insister, mais pourquoi ne remplis tu pas le memo2 en même temps que le 1 ?
Au moment où tu mets tes nombres entre crochet, tu les as sous la main pour les aditionner...
Ça te simplifierait la vie (et ton code) !

Simon
0
nabil351974 Messages postés 75 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 11 mars 2014
22 févr. 2013 à 09:20
Bonjour à tous,

[i]"Nabil, je me permets d'insister, mais pourquoi ne remplis tu pas le memo2 en même temps que le 1 ?
Au moment où tu mets tes nombres entre crochet, tu les as sous la main pour les aditionner...
Ça te simplifierait la vie (et ton code) ! "/i

Oui Simon tu as entièrement raison, mais comme j'ai de très longues boucles avec des Query de selection et d'insertion, je me suis perdu dans tout ça!

Merci à tous pour votre aide.

NABIL1974
0
Rejoignez-nous