Extraire et additionner les chiffres d'un Memo [Résolu]

nabil351974 76 Messages postés mardi 18 décembre 2007Date d'inscription 11 mars 2014 Dernière intervention - 20 févr. 2013 à 20:46 - Dernière réponse : nabil351974 76 Messages postés mardi 18 décembre 2007Date d'inscription 11 mars 2014 Dernière intervention
- 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
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
pierrotk10d 102 Messages postés mardi 13 novembre 2007Date d'inscription 19 août 2018 Dernière intervention - 21 févr. 2013 à 15:28
3
Merci
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

Merci pierrotk10d 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de pierrotk10d
korgis 424 Messages postés samedi 17 mai 2003Date d'inscription 4 août 2018 Dernière intervention - 20 févr. 2013 à 22:21
0
Merci
Salut,

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

Moi je fais plutôt dans l'imbuvable...
Commenter la réponse de korgis
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 21 févr. 2013 à 09:06
0
Merci
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
Commenter la réponse de sp40
cs_MAURICIO 2233 Messages postés mardi 10 décembre 2002Date d'inscription 15 décembre 2014 Dernière intervention - 21 févr. 2013 à 10:41
0
Merci
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.
Commenter la réponse de cs_MAURICIO
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 21 févr. 2013 à 11:11
0
Merci
@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
Commenter la réponse de sp40
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 21 févr. 2013 à 11:12
0
Merci
StrBetween, pardon.


Simon
Commenter la réponse de sp40
cs_MAURICIO 2233 Messages postés mardi 10 décembre 2002Date d'inscription 15 décembre 2014 Dernière intervention - 21 févr. 2013 à 11:14
0
Merci
@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.
Commenter la réponse de cs_MAURICIO
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 21 févr. 2013 à 11:37
0
Merci
Super ! Je ne l'avais pas vu... Désolé

Simon
Commenter la réponse de sp40
nabil351974 76 Messages postés mardi 18 décembre 2007Date d'inscription 11 mars 2014 Dernière intervention - 21 févr. 2013 à 14:47
0
Merci
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
Commenter la réponse de nabil351974
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 21 févr. 2013 à 16:55
0
Merci
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
Commenter la réponse de sp40
nabil351974 76 Messages postés mardi 18 décembre 2007Date d'inscription 11 mars 2014 Dernière intervention - 22 févr. 2013 à 09:20
0
Merci
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
Commenter la réponse de nabil351974

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.