IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Téléchargé 1 fois
Vote des utilisateurs
0 
0 
Détails
Licence : Non renseignée
Mise en ligne le 31 janvier 2013
Plate-forme : Windows
Langue : Français
Référencé dans
Navigation

Tri rapide d'une grille (TStringGrid)

Exemple de tri par colonne d'un composant TStringGrid à l'aide d'un algorithme de tri rapide (quick sort)
Avatar de Charly910
Membre expert https://www.developpez.com
Le 01/02/2013 à 9:08
Bonjour,

pour trier une colonne, j'utilise une unité d'Olivier Dahan qui fonctionne bien (peut être pas aussi vite qu'avec QuickSort ?) et qui peut trier des valeurs alphabétiques, numériques, des dates ou des heures. Le voici

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
unit SortGrid;
 
{ © Olivier Dahan - odahan@cybercable.fr }
 
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, Grids, StdCtrls;
 
type
 TodColType = (odct_Date,odct_time,odct_DateTime,odct_numeric,odct_CaseString,odct_NoCaseString);
 
Procedure ODSortGrid(grid:TStringGrid;ColToSort:Integer;TypeCol:TodColType;FromRow,ToRow:integer;Ascending:Boolean);
 
implementation
 
Procedure ODSortGrid(grid:TStringGrid;ColToSort:Integer;TypeCol:TodColType;FromRow,ToRow:integer;Ascending:Boolean);
var Ts:TStringList; i:integer; sg:tstringgrid;
 Function ToDate(const s:string):string;
 var y,m,d : word;
 begin
  DecodeDate(StrToDate(s),y,m,d);
  result := FormatFloat('0000',y)+FormatFloat('00',m)+FormatFloat('00',d);
 end;
 Function ToTime(const s:string):string;
 var h,m,sx,ms:word;
 begin
  DecodeTime(StrToTime(s),h,m,sx,ms);
  result := FormatFloat('00',h)+FormatFloat('00',m)+FormatFloat('00',sx)+FormatFloat('00',ms);
 end;
 Function ToDateTime(const s:string):string;
 var p:integer;
 begin
  p:=pos(' ',s);
  if p>0 then
   begin
    Result := ToDate(copy(s,1,p-1))+ToTime(copy(s,p+1,length(s)));
   end else result := '0000000000000000';
 end;
 Function ToNumeric(const s:string):string;
 var p:integer; sx:string;
 const z30 = '000000000000000000000000000000';
 function pad(z:integer):string;
 begin
  if z in [1..30] then result := copy(z30,1,z) else result :='';
 end;
 begin
  sx:='';
  for p:=1 to length(s) do
   if s[p] in (['0'..'9','-',',','.']-[ThousandSeparator]) then sx:=sx+s[p];
  p:=pos(DecimalSeparator,sx);
  if p>0 then
  result := pad(25-length(copy(sx,1,p-1)))+copy(sx,1,p-1)+'.'+copy(sx,p+1,length(sx))+pad(25-length(copy(sx,p+1,length(sx))))
  else result := pad(25-length(sx))+sx;
 end;
begin
 ts:=tstringlist.Create;
 try
  For i:=FromRow to ToRow do
   begin
    Case TypeCol of
     odct_Date : ts.AddObject(ToDate(grid.cells[ColToSort,i]),tobject(i));
     odct_Time : ts.AddObject(ToTime(grid.cells[ColToSort,i]),tobject(i));
     odct_DateTime : ts.AddObject(ToDateTime(grid.cells[ColToSort,i]),tobject(i));
     odct_Numeric : ts.AddObject(ToNumeric(grid.cells[ColToSort,i]),tobject(i));
     odct_CaseString : ts.AddObject(grid.cells[ColToSort,i],tobject(i));
     odct_NoCaseString : ts.AddObject(AnsiUpperCase(grid.cells[ColToSort,i]),tobject(i));
    end;
   end;
  ts.sorted := true;
  sg := TStringGrid.Create(application);
  try
   sg.ColCount := grid.colcount;
   sg.rowcount := ToRow-FromRow+1;
   sg.FixedCols := 0;
   sg.FixedRows := 0;
   if Ascending then
    For i:=0 to ts.count-1 do
     sg.Rows[i] := grid.Rows[integer(ts.objects[i])]
    else
    For i:=ts.count-1 downto 0 do
     sg.Rows[(ts.count-1)-i] := grid.Rows[integer(ts.objects[i])];
   For i:=FromRow to ToRow do
    Grid.Rows[i] := sg.Rows[i-FromRow];
  finally
   sg.free;
  end;
 finally
  ts.free;
 end;
end;
 
end.


Tu pourrais peut être faire un mix des 2, car ton exemple est plus complet ?

A+
Charly
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.