Ya til myen dordonner par ordre alphabetique ls mots ds une stringrid?

Ya til myen dordonner par ordre alphabetique ls mots ds une stringrid? - Delphi/Pascal - Programmation

Marsh Posté le 04-01-2003 à 20:16:44    

Bon voila ...  
j'ai une string grid 4 colonnes  
je me demandais si yavais une option pour ordonner les rangées selon lordre alphabetique de la premiere colonne .
 
Je suppose que non alors :
comment faire une boucle pour ordonner alphabetiquement les mots de la premiere colone ?  
 
 
merci d'avance

Reply

Marsh Posté le 04-01-2003 à 20:16:44   

Reply

Marsh Posté le 05-01-2003 à 09:39:42    

tu peux utiliser cette unité qui a l'avantage de pouvoir trier des dates, des nombres ou des chaines
 


unit sortStringGrid;
 
{ © 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
  if s='' then DecodeDate(now,y,m,d) else
  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
  if s='' then
  DecodeTime(time,h,m,sx,ms)else
  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.

Reply

Marsh Posté le 05-01-2003 à 11:23:06    

Bon je vais tester ca , merci beaucoup!

Reply

Marsh Posté le 05-01-2003 à 11:40:12    

:cry: j'y comprend rien a cet unit  :cry:  
 
 
je voit pas du tout comment l'utiliser .
moi jai une une string grid que jai deja faite et qui s'appelle "grille"
 
 

Reply

Marsh Posté le 05-01-2003 à 13:44:27    

c pas si compliqué quand meme  :D  
 
ODSortGrid(grille,0,odct_NoCaseString,1,grille.rowcount-1,true);
 
voila ça va te trier la colonne 0, sans tenir compte des majusucules/minuscules, en démarrant à la ligne 1 et jusqu'a la fin (c dans le cas ou la ligne 0 représente les en-tetes), et le trie se fera dans l'ordre ascendant soit alphabétique ici

Reply

Marsh Posté le 05-01-2003 à 15:12:16    

:ouch:  C ULTRA COMPLIQUE  :ouch:  
 
mais ca marche alors merci  :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed