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
| procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var StrSql, StrFieldName, StrFields, StrSqlDesc : string ;
begin
{ Si le type des données sous jacent est de type chaine, entier, valeur réelle
alors on peut faire le tri,
}
if Column.Field.DataType in [ftString, ftInteger, ftFloat] then begin
strsql := 'select %s from country order by %s ASC';
StrSqlDesc := 'Select %s from country order by %s DESC';
{on récupère l'ensemble des noms des différents champs car plus rapide
qu'un select *
}
StrFields := GetColname;
{On recupère le nom du champ qui participera au tri clause order by CHAMP
}
StrFieldName := Column.FieldName ;
with Query1 do begin
Close; // fermeture
SensTri := GetSensTri(Sql.Text); // sens de tri actuel
SQL.Clear; // suppression du texte de la requete
{suivant le sens de tri actuel on va inverser le tri}
case sensTri of
0 : Sql.Text := Format(StrSqlDesc,[strFields,StrFieldname]);
-1,1 :SQL.Text := Format(strSql,[strFields,StrFieldName]);
end; //case
Open;
StatusBar1.SimpleText := Copy(Sql.Text,1,length(Sql.Text)-2);
DbGrid1.Hint := StatusBar1.SimpleText;
end;// width
end;// if
end;
//------------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
SensTri := 1;
if not Query1.Active then
Query1.Open;
end;
//------------------------------------------------------------------------------
function TForm1.GetColname: string;
var i : integer;
begin
for i := 0 to DBGrid1.Columns.Count -1 do
Result := Result + DBGrid1.Columns[i].FieldName +','+#32;
if Result <> emptyStr then
Result := Copy(Result,1,length(Result)-2);
end;
//------------------------------------------------------------------------------
function TForm1.GetSensTri(S: string): integer;
var i,j : integer;
begin
Result := -1;
i := pos('ASC',s) ; J := pos('DESC',s);
if i > 0 then begin
Result := 0;
Exit;
end;
if J > 0 then begin
Result := 1;
exit;
end;
end; |
Partager