Est ce possible de faire la somme contenu dans deux listbox1&2 ? [Résolu]

Messages postés
24
Date d'inscription
jeudi 6 janvier 2011
Dernière intervention
24 juin 2017
- 10 mars 2015 à 19:51 - Dernière réponse :  dino34
- 9 mai 2015 à 16:27
Bonjour,

J'ai un fichier texte, que je cherche à faire la somme en se basant sur deux listbox :

Un petit exemple du fichier est mis dans une image :

Je cherche à remplir DONNER3 dans listbox1 et VALEUR dans listbox2, et en élimine DONNER1 et DONNER2.

Une fois les donner transférer dans les listbox correspondant, je ferai la somme dans trois 5 edit :

edit1 reçoit la somme HT qui est égale à 10
edit2 reçoit la somme HT qui est égale à 20
edit3 reçoit la somme HT qui est égale à 30
edit4 reçoit la somme NT qui est égale à 10
edit5 reçoit la somme HT qui est égale à 30


Merci pour votre aide est suggestion


--
Afficher la suite 

Votre réponse

15 réponses

Messages postés
260
Date d'inscription
lundi 27 octobre 2003
Dernière intervention
4 mars 2016
- Modifié par cs_yanb le 11/03/2015 à 13:08
0
Merci
Salut,
OK mais montre nous un peu le code que tu as fais (ou tenter de faire ) pour que l'on corrige ce qui ne va pas et qu'on ai une base de départ...Précise nous aussi le séparateur du fichier texte.
Je vais en dire un peu plus sur les termes pour faire tes recherches si tu n'as rien fait...
TStringList, Delimiter, DelimitedText, IntToStr, StrToInt, case of, array [0..4] of integer, etc...
@+
Commenter la réponse de cs_yanb
Messages postés
24
Date d'inscription
jeudi 6 janvier 2011
Dernière intervention
24 juin 2017
- 11 mars 2015 à 20:01
0
Merci
salut :

je vous remercie beaucoup pour les remarques , au départ j'ai penser à faire copier coller vers listbox 1&2 , alors que listbox n'a pas cette fonction si c'est possible par programmation je ne sais pas .

j'ai mis un exemple de mon fichier dans fichier excel dans une image vu que lorsque tu le met dans le forum tous les données seront concaténer et le texte sera illisible .

il y a un espace entre les quatre champs (donner1 donner2 donner3 valeur).

pour remplissage j'ai commencer par le code cité ci-dessous il
affiche DONNER1 ET DONNER2 dans les deux listbox 1&2 .


var
n: TStringList;
l:integer;
begin
n:=TStringList.Create();
n.LoadFromFile('C:\bureaux\donner.txt');
for l:= 0 to n.Count-1 do
begin
if pos('DONNER3',n[l])>0 then
listbox1.Items.Add(n[l]);
if pos('VALEUR',n[l])>0 then
listbox2.Items.Add(n[l]);

end;
end;


2/ pour le deuxième qui fait le calcul j'ai pensé à ça mais je bloque comment mettre la condition sur laquelle l'addition va se faire :

var
count ,i,j :integer;
s1 ,s2:string;

begin
count := 1;
for i:=0 to ListBox1.Items.Count-1 do begin
s1 := ListBox1.Items[i];
for j:=0 to ListBox2.Items.Count-1 do begin
s2 := ListBox2.Items[j];
if pos('HT,S1')



remarque : je cherche à avoir dans les 5 edit ce qui suit :

en se basant sur l'image que j'ai mis :

HT à deux valeur en 20 dans edit2 je veux avoir 40

HT à deux valeur en 30 dans edit3 je veux avoir 60


edit1 reçoit la somme HT qui est égale à 10
edit2 reçoit la somme HT qui est égale à 20
edit3 reçoit la somme HT qui est égale à 30
edit4 reçoit la somme NT qui est égale à 10
edit5 reçoit la somme NT qui est égale à 30

merci
Commenter la réponse de dino34
Messages postés
260
Date d'inscription
lundi 27 octobre 2003
Dernière intervention
4 mars 2016
- 12 mars 2015 à 07:20
0
Merci
Salut,
voici un truc fait directement en live...donc pas tester...
En général dans les fichiers texte la préférence va à un ";" au lieu de l'espace comme séparateur...
var
ListSrc : TStringList;
ListTemp : TStringList;
I : Integer;
AdVal : array [0..4] of Integer;
begin
ListSrc := TStringList.Create;
ListTemp := TStringList.Create;
try
ListSrc.LoadFromFile('C:\bureaux\donner.txt');
ListTemp.StrictDelimiter := True;
ListTemp.Delimiter := ' ';
ListBox1.Clear;
ListBox2.Clear;
for I := 0 to 4 do
AdVal[I] := 0;
for I := 0 to ListSrc.Count - 1 do
begin
ListTemp.DelimitedText := ListSrc[I];
ListBox1.Items.Add(ListTemp[2]);
ListBox2.Items.Add(ListTemp[3]);
if ListTemp[2] = 'HT' then
case StrToInt(ListTemp[3]) of
10 : AdVal[0] := AdVal[0] + 10;
20 : AdVal[1] := AdVal[1] + 20;
30 : AdVal[2] := AdVal[2] + 30;
end
else
case StrToInt(ListTemp[3]) of
10 : AdVal[3] := AdVal[3] + 10;
30 : AdVal[4] := AdVal[4] + 30;
end;
end;
finally
ListSrc.Free;
ListTemp.Free;
end;
ShowMessage(Format('HT10=%d'#13#10'HT20=%d'#13#10'HT30=%d'#13#10'NT10=%d'#13#10'NT30=%d',
[AdVal[0],AdVal[1],AdVal[2],AdVal[3],AdVal[4]]));
@+
Commenter la réponse de cs_yanb
Messages postés
24
Date d'inscription
jeudi 6 janvier 2011
Dernière intervention
24 juin 2017
- 12 mars 2015 à 14:30
0
Merci
salut ,

encore une fois merci , mais j'ai deux erreur quand je fait la compile :

1/ [Error] Unit1.pas(40): Undeclared identifier: 'StrictDelimiter'

2/ quand je met :

// ListTemp.StrictDelimiter:= True;

il m'affiche :

list index out of bound ( 2 )

j'ai trouver une solution , j'ai mis le fichier texte dans la section code et il est bien afficher maintenant :

 


début

entre de donner:

configuration de donner :

DONNER1 DONNER2 DONNER3 VALEUR
WT1-100 NT1-100 HT 10
WT1-101 NT1-101 HT 20
WT1-102 NT1-102 NT 10
WT1-103 NT1-103 NT 30
WT1-104 NT1-104 HT 30
WT1-105 NT1-105 NT 10
WT1-106 NT1-106 HT 20
WT1-107 NT1-107 HT 30
WT1-108 NT1-108 NT 30

FIN


Messages postés
260
Date d'inscription
lundi 27 octobre 2003
Dernière intervention
4 mars 2016
- 12 mars 2015 à 14:58
Salut,
Ah oui mais non ton fichier texte n'est pas structuré comme je le pensai...
En fait il ne faut que les données dans le fichiers texte pour que cela fonctionne ou sinon il faut mettre un offset de départ et de fin par exemple dans la boucle
for I := 0 to ListSrc.Count - 1 do
mettre à la place de 0 le début des données (le numéro de ligne ici apparemment : 5 => WT1-100) et à la place de "ListSrc.Count - 1" la fin des données...ou faire en automatique la recherche de position de début, fin...en fait le morceau de code que j'ai fait, fait en automatique la séparation des données et l'addition...StrictDelimiter pas connu ? donc vieille version de delphi je pense :p
EDIT // Exemple pour trouver le début et la fin sans sécurité s'il n'y a pas de valeur ( pas tester ) :
var
Deb, Fin : Integer;
...
for I := 0 to 4 do
AdVal[I] := 0;
for I := 0 to ListSrc.Count - 1 do
begin
if Pos('WT1-',ListSrc[I]) <> 0 then
begin
Deb := I;
Break;
end
else
Deb := I;
end;
for I := Deb to ListSrc.Count - 1 do
begin
if Pos('WT1-',ListSrc[I]) = 0 then
begin
Fin := I - 1;
Break;
end
else
Fin:= ListSrc.Count - 1;
end;
for I := Deb to Fin do
begin
...

Voilà de quoi repartir sur de bonne base
@+
Commenter la réponse de dino34
Messages postés
24
Date d'inscription
jeudi 6 janvier 2011
Dernière intervention
24 juin 2017
- 13 mars 2015 à 15:58
0
Merci
salut :

désoler pour le retard et 10000000000 merci ça marche bien .

juste une dernière question :

si je ferai l'addition cité ci-dessous dans le fichier :

WT-109
WT-110
WT-111





début

entre de donner:

configuration de donner :

DONNER1 DONNER2 DONNER3 VALEUR
WT1-100 NT1-100 HT 10
WT1-101 NT1-101 HT 20
WT1-102 NT1-102 NT 10
WT1-103 NT1-103 NT 30
WT1-104 NT1-104 HT 30
WT1-105 NT1-105 NT 10
WT1-106 NT1-106 HT 20
WT1-107 NT1-107 HT 30
WT1-108 NT1-108 NT 30
WT-109 NT1-109 HT 10
WT-110 NT1-110 HT 20
WT-111 NT1-111 NT 30

Fin



et je mettrai le code suivant :


var
Deb, Fin : Integer;
...
for I := 0 to 4 do
AdVal[I] := 0;
for I := 0 to ListSrc.Count - 1 do
begin
if Pos('WT1-',ListSrc[I]) <> 0 then
begin
Deb := I;
Break;
end
else
Deb := I;
end;

for I := Deb to ListSrc.Count - 1 do
begin
if (Pos('WT-',ListSrc[I])<> 0) then
begin
Deb := I;
Break;
end
else
Deb:=I;
end;

for I := Deb to ListSrc.Count - 1 do
begin
if Pos('WT1-',ListSrc[I]) = 0 then
begin
Fin := I - 1;
Break;
end
else
Fin:= ListSrc.Count - 1;
end;
for I := Fin to ListSrc.Count - 1 do
begin
if (Pos('WT-',ListSrc[I])=0) then
begin
Fin := I - 1;
Break;
end
else
Fin:= ListSrc.Count - 1;
for I := Deb to Fin do
begin
...





Merci de voir si ce que j'avais fait est correcte ?

--
Messages postés
260
Date d'inscription
lundi 27 octobre 2003
Dernière intervention
4 mars 2016
- 16 mars 2015 à 08:15
Salut,
plusieurs solutions s'offre à toi, mais avec cette méthode les boucles de début et de fin doivent être répéter pour faire 2 passes sur les données...pour s'en affranchir il serait préférable de rechercher dans la boucle de début et de fin seulement "WT" ensuite de regarder si la première colonne est "WT-" ou "WT1-" ou regarder la position du "-". Ceci permettrai de ne faire qu'une seule passe sur les données et ceci même si "WT" et "WT1" sont dans le désordre. Avoir par exemple pour faire la différence entre les deux données un truc du genre...
var
AdValWT1 : array [0..4] of Integer; //Remplace AdVal...
AdValWT : array [0..2] of Integer;
...
if Pos('-',listTemp[0]) = 3 then //Position de "-" en 3 pour "WT-"
if ListTemp[2] = 'HT' then
case StrToInt(ListTemp[3]) of
10 : AdValWT[0] := AdValWT[0] + 10;
20 : AdValWT[1] := AdValWT[1] + 20;
end
else
case StrToInt(ListTemp[3]) of
30 : AdValWT[2] := AdValWT[2] + 30;
end;
if Pos('-',listTemp[0]) = 4 then //Position de "-" en 4 pour "WT1-"
if ListTemp[2] = 'HT' then
case StrToInt(ListTemp[3]) of
10 : AdValWT1[0] := AdValWT1[0] + 10;
20 : AdValWT1[1] := AdValWT1[1] + 20;
30 : AdValWT1[2] := AdValWT1[2] + 30;
end
else
case StrToInt(ListTemp[3]) of
10 : AdValWT1[3] := AdValWT1[3] + 10;
30 : AdValWT1[4] := AdValWT1[4] + 30;
end;
...

Je pense que tu vas arriver à faire un mixte de tous ca ;)
@+
Commenter la réponse de dino34
0
Merci
salut :

désoler pour le retard , j'avais un problème dans mon PC.

vous avez raison , si je ferai le mixte comment je m'en sortirai ?

j'ai procédé comme suit mais j'ai rencontrai des problèmes , il m'a

affiché seulement les données de ' WT-'

var
Deb, Fin : Integer;
AdValWT1 : array [0..4] of Integer;
AdValWT : array [0..2] of Integer;
...
for I := 0 to 4 do
AdValWT1 := 0;
AdValWT :=0;
for I := 0 to ListSrc.Count - 1 do
begin
if Pos('WT1-',ListSrc[I]) <> 0 then
begin
Deb := I;
Break;
end
else
Deb := I;
end;

for I := Deb to ListSrc.Count - 1 do
begin
if (Pos('WT-',ListSrc[I])<> 0) then
begin
Deb := I;
Break;
end
else
Deb:=I;
end;

for I := Deb to ListSrc.Count - 1 do
begin
if Pos('WT1-',ListSrc[I]) = 0 then
begin
Fin := I - 1;
Break;
end
else
Fin:= ListSrc.Count - 1;
end;
for I := Fin to ListSrc.Count - 1 do
begin
if (Pos('WT-',ListSrc[I])=0) then
begin
Fin := I - 1;
Break;
end
else
Fin:= ListSrc.Count - 1;
for I := Deb to Fin do
begin
ListTemp.DelimitedText := ListSrc[I];
ListBox1.Items.Add(ListTemp[2]);
ListBox2.Items.Add(ListTemp[3]);

if Pos('-',listTemp[0]) = 3 then //Position de "-" en 3 pour "WT-"
if ListTemp[2] = 'HT' then
case StrToInt(ListTemp[3]) of
10 : AdValWT[0] := AdValWT[0] + 10;
20 : AdValWT[1] := AdValWT[1] + 20;
end
else
case StrToInt(ListTemp[3]) of
30 : AdValWT[2] := AdValWT[2] + 30;
end;
if Pos('-',listTemp[0]) = 4 then //Position de "-" en 4 pour "WT1-"
if ListTemp[2] = 'HT' then
case StrToInt(ListTemp[3]) of
10 : AdValWT1[0] := AdValWT1[0] + 10;
20 : AdValWT1[1] := AdValWT1[1] + 20;
30 : AdValWT1[2] := AdValWT1[2] + 30;
end
else
case StrToInt(ListTemp[3]) of
10 : AdValWT1[3] := AdValWT1[3] + 10;
30 : AdValWT1[4] := AdValWT1[4] + 30;
end;
finally
ListSrc.Free;
ListTemp.Free;
end;
ShowMessage(Format('HT10=%d'#13#10'HT20=%d'#13#10'HT30=%d'#13#10'NT10=%d'#13#10'NT30=%d',
[AdValWT1[0],AdValWT1[1],AdValWT1[2],AdValWT1[3],AdValWT1[4]]));
ShowMessage(Format('HT10=%d'#13#10'HT20=%d'#13#10'NT30=%d'#13#10,
[AdValWT [0],AdValWT [1],AdValWT [2]]));

end;



NB: le premier ShowMessage (WT1-): affiche des zéro.

le deuxième ShowMessage (WT-): affiche le calcul correcte.


merci pour votre support .
Commenter la réponse de dino34
0
Merci
salut cs_yanb:

le problème persiste , est ce que tu peux nous aider sur le problème cité en haut .

merci
Commenter la réponse de dino34
Messages postés
260
Date d'inscription
lundi 27 octobre 2003
Dernière intervention
4 mars 2016
- 30 mars 2015 à 14:10
0
Merci
Salut,
Il ne faut rechercher que "WT" au début et plus "WT1-" "WT-" !
var
Deb, Fin : Integer;
...
for I := 0 to 4 do
AdVal[I] := 0;
for I := 0 to ListSrc.Count - 1 do
begin
if Pos('WT',ListSrc[I]) <> 0 then
begin
Deb := I;
Break;
end
else
Deb := I;
end;
for I := Deb to ListSrc.Count - 1 do
begin
if Pos('WT',ListSrc[I]) = 0 then
begin
Fin := I - 1;
Break;
end
else
Fin:= ListSrc.Count - 1;
end;
for I := Deb to Fin do
begin...

@+
Commenter la réponse de cs_yanb
0
Merci
salut cs_yanb :

j'ai effectué comme vous l'avez demandé une seul recherche sur WT mais elle n'affiche que le calcul de WT et WT1 doit être aussi dans le calcul .

est ce que tu peux m'aidez encore une fois .

merci
Messages postés
260
Date d'inscription
lundi 27 octobre 2003
Dernière intervention
4 mars 2016
- 13 avril 2015 à 07:23
Salut,
je ne comprend pas ce qui ne marche pas ou ce que tu veux :p normalement tu devrais avoir le calcul de WT- et ensuite le calcul de WT1-...si je reprend ce que l'on a dit au debut, le code devrait ressembler à ceci
...var
ListSrc : TStringList;
ListTemp : TStringList;
I : Integer;
AdValWT : array [0..4] of Integer;
AdValWT1 : array [0..4] of Integer;
Deb,Fin : Integer;
begin
ListSrc := TStringList.Create;
ListTemp := TStringList.Create;
try
ListSrc.LoadFromFile('C:\bureaux\donner.txt');
ListTemp.Delimiter := ' ';
ListBox1.Clear;
ListBox2.Clear;
for I := 0 to 4 do
begin
AdValWT[I] := 0;
AdValWT1[I] := 0;
end;
for I := 0 to ListSrc.Count - 1 do
begin
if Pos('WT',ListSrc[I]) <> 0 then
begin
Deb := I;
Break;
end;
end;
for I := Deb to ListSrc.Count - 1 do
begin
if Pos('WT',ListSrc[I]) = 0 then
begin
Fin := I-1;
Break;
end;
end;
for I := Deb to Fin do
begin
ListTemp.DelimitedText := ListSrc[I];
ListBox1.Items.Add(ListTemp[2]);
ListBox2.Items.Add(ListTemp[3]);
if Pos('-',listTemp[0]) = 3 then
if ListTemp[2] = 'HT' then
case StrToInt(ListTemp[3]) of
10 : AdValWT[0] := AdValWT[0] + 10;
20 : AdValWT[1] := AdValWT[1] + 20;
30 : AdValWT[2] := AdValWT[2] + 30;
end
else
case StrToInt(ListTemp[3]) of
10 : AdValWT[3] := AdValWT[3] + 10;
30 : AdValWT[4] := AdValWT[4] + 30;
end;
if Pos('-',listTemp[0]) = 4 then
if ListTemp[2] = 'HT' then
case StrToInt(ListTemp[3]) of
10 : AdValWT1[0] := AdValWT1[0] + 10;
20 : AdValWT1[1] := AdValWT1[1] + 20;
30 : AdValWT1[2] := AdValWT1[2] + 30;
end
else
case StrToInt(ListTemp[3]) of
10 : AdValWT1[3] := AdValWT1[3] + 10;
30 : AdValWT1[4] := AdValWT1[4] + 30;
end;
end;
finally
ListSrc.Free;
ListTemp.Free;
end;
ShowMessage(Format('WT'#13#10'HT10=%d'#13#10'HT20=%d'#13#10'HT30=%d'#13#10'NT10=%d'#13#10'NT30=%d',
[AdValWT1[0],AdValWT1[1],AdValWT1[2],AdValWT1[3],AdValWT1[4]]));
ShowMessage(Format('WT1'#13#10'HT10=%d'#13#10'HT20=%d'#13#10'HT30=%d'#13#10'NT10=%d'#13#10'NT30=%d',
[AdValWT[0],AdValWT[1],AdValWT[2],AdValWT[3],AdValWT[4]]));
...
@+
dino34 >
Messages postés
260
Date d'inscription
lundi 27 octobre 2003
Dernière intervention
4 mars 2016
- 18 avril 2015 à 22:50
salut cs_yanb:

désoler encore une fois pour le retard , j'ai tésté votre code sous delphi7:

1/ listbox1 et listbox2 se remplissent des valeurs de WT seulement :

WT-109 NT1-109 HT 10
WT-110 NT1-110 HT 20
WT-111 NT1-111 NT 30

tous les valeurs de WT1 ne sont pas pris en charge c'est pour cette raison le :


ShowMessage(Format('WT1'#13#10'HT10=%d'#13#10'HT20=%d'#13#10'HT30=%d'#13#10'NT10=%d'#13#10'NT30=%d',
[AdValWT1[0],AdValWT1[1],AdValWT1[2],AdValWT1[3],AdValWT1[4]]));


affiche seulement des zéros .

j'ai fait tous les combinaison possible mais j'ai pas trouvé de solution .

merci pour tout.
Messages postés
260
Date d'inscription
lundi 27 octobre 2003
Dernière intervention
4 mars 2016
> dino34 - 20 avril 2015 à 09:07
Salut,
je viens de faire le test en utilisant le dernier code et ton fichier texte du 13 mars 2015 à 15:58 et j'obtiens :
WT
HT10=10
HT20=20
HT30=0
NT10=0
NT30=30
WT1
HT10=10
HT20=40
HT30=60
NT10=20
NT30=60

J'ai modifier aussi le format du showmessage comme toi il y avait une inversion entre le commentaire WT et WT1, mais les résultats sont corrects, il doit y avoir un truc ailleurs pour que tu n'ai pas les mêmes résultats...
@+
Commenter la réponse de dino34
0
Merci
salut cs_yanb:

le problème est résolu , j'ai trouvé l'erreur parce que j'avais mal

compris ton code la première fois ( 'WT' , 'WT').

for I := 0 to ListSrc.Count - 1 do
begin
if Pos('WT',ListSrc[I]) <> 0 then
begin
Deb := I;
Break;
end;
end;
for I := Deb to ListSrc.Count - 1 do
begin
if Pos('WT',ListSrc[I]) = 0 then
begin
Fin := I-1;
Break;


NB: 1000000000000000000 merci pour ton support et patience
Commenter la réponse de dino34

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.