Extraire et additionner les chiffres d'un Memo [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,

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

Messages postés
106
Date d'inscription
mardi 13 novembre 2007
Statut
Membre
Dernière intervention
25 octobre 2020
3
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
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
16
Salut,

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

Moi je fais plutôt dans l'imbuvable...
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
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
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
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.
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
@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
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
StrBetween, pardon.


Simon
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
@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.
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
Super ! Je ne l'avais pas vu... Désolé

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

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
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
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
Messages postés
76
Date d'inscription
mardi 18 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2014

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