Bonjour,
Pour trier le fichier de lignes de texte formatté du type suivant sur la base de comparaisons effectuées sur une profondeur de tri comprise entre les caractères d'indice icar1 et icar2 c'est à dire correspondant soit à une date un libellé ou un code postal :... j'ai voulu simplifier en utilisant le code suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Zqkjlk Mlsldfskd 2004/11/21 kùakùkaka z1 69006 Lyon Bqmslkdu Kdmlq 2001/06/02 dqmlkjsdl d2 83600 Fréjus Qfdl Lkdfmslk 2005/03/15 vdlsmlk s9 33000 Bordeaux Cinzm Uskjd 1992/04/22 kdjqlk q2 01000 Bourg Asmlkfdjm Zkfjmsj 2003/05/14 roizjero r5 67008 Strasbourg Zics Ddqkjmlk 2001/06/02 seriz r8 67001 Strasbourg Bicqmd Fmlksje 1995/01/06 ffjczcjz p7 74008 Annecy Nqkj Isldfskd 2007/11/28 kùakùk k7 04523 Trifoully Charpi Allqk 2003/02/25 pzkeorea a0 45123 Orléans Mslkd Bfmlksfd 1955/07/14 mlsk m9 06012 Nice Ziuyefco Aeuycx 1984/04/08 aqlskjd b9 42561 Firminy... malgré le recours aux variables-relais locales ic1 et ic2 celles-ci ne sont pas prises en compte correctement par la fonction fCompareZ1 encapsulée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 procedure Trier( List: TStringList; Index1, Index2, icar1,icar2 : Integer); var ic1, ic2 : integer; function fCompareZ1(List: TStringList; Index1, Index2: Integer): Integer; var v1, v2: string; begin v1 := List[Index1]; v1 := Copy(v1,ic1,ic2-ic1+1); <- ne marche pas : ic1 et ic2 prennent ici des valeurs aberrantes //v1 := Copy(v1,11,20-11+1); <- marche mais est est sans intérêt v2 := List[Index2]; v2 := Copy(v2,ic1,ic2-ic1+1); <- ne marche pas : ic1 et ic2 prennent ici des valeurs aberrantes //v2 := Copy(v2,11,20-11+1); <- marche mais est est sans intérêt showMessage(v1+' '+v2); if v1 < v2 then result := -1 else if v1 > v2 then result := 1 else result := 0; end; begin ic1:=icar1; ic2:=icar2; List.CustomSort(@fCompareZ1); end;
... Alors qu'avec le code d'essai suivant les paramètres icar1 et icar2 passent directement (sans avoir à utiliser les variables-relais locales ic1 et ic2) et sont correctement pris en compte par la fonction fCompareZ2 encapsulée :... ce deuxième code n'a bien sûr comme seul intérêt que de montrer que dans ce 2ème cas les paramètres passent.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 procedure Essai( List: TStringList; Index1, Index2, icar1,icar2 : Integer); var j : integer; function fCompareZ2(List: TStringList; Index1, Index2: Integer): Integer; var v1, v2: string; begin v1 := List[Index1]; v1 := Copy(v1,icar1,icar2-icar1+1); //<- ok marche v2 := List[Index2]; v2 := Copy(v2,icar1,icar2-icar1+1); //<- ok marche showMessage(v1+' / '+v2); //<- ok marche if v1 < v2 then result := -1 else if v1 > v2 then result := 1 else result := 0; end; begin for j:=0 to List.Count-2 do fCompareZ2(List,Index1, j); end;
... Mais comment, svp, faire passer et accepter ces paramètres dans le code de tri ???
A+
Partager