//How to Use:
//procedure TForm1.DBGrid1TitleClick(Column: TColumn);
//begin
// GridTitleSort(column);
//end;
procedure
GridTitleSort(Column: TColumn);
type
TFieldTypeSet =
set
of
TFieldType;
var
s, cFieldName:
string
;
i:
integer
;
DataSet: TDataSet;
GridFieldTypeSet: TFieldTypeSet;
procedure
SetTitle;
var
ii:
integer
;
cStr:
string
;
c: TColumn;
begin
for
ii :=
0
to
TDBGrid(Column
.
Grid).Columns
.
Count -
1
do
begin
c := TDBGrid(Column
.
Grid).Columns[ii];
cStr := c
.
Title
.
Caption;
if
(pos(
'↑'
, cStr) =
1
)
or
(pos(
'↓'
, cStr) =
1
)
then
begin
Delete(cStr,
1
,
2
);
c
.
Title
.
Caption := cStr;
end
;
end
;
end
;
begin
DataSet := Column
.
Grid
.
DataSource
.
DataSet;
GridFieldTypeSet := [ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes, ftTypedBinary, ftFixedChar, ftWideString, ftLargeint, ftVariant];
if
not
(Column
.
Field
.
DataType
in
GridFieldTypeSet)
then
Exit;
//§PÂ_¦r¬qÃþ«¬
SetTitle;
if
Column
.
Field
.
FieldKind = fkLookup
then
cFieldName := Column
.
Field
.
KeyFields
else
if
Column
.
Field
.
FieldKind = fkCalculated
then
cFieldName := Column
.
Field
.
KeyFields
else
cFieldName := Column
.
FieldName;
//=================================AdoDataSet=====================
if
DataSet
is
TCustomADODataSet
then
begin
s := TCustomADODataSet(DataSet).Sort;
if
s =
''
then
begin
s := cFieldName;
Column
.
Title
.
Caption :=
'↑'
+ Column
.
Title
.
Caption;
end
else
begin
if
Pos(cFieldName, s) <>
0
then
begin
i := Pos(
'DESC'
, s);
if
i <=
0
then
begin
s := s +
' DESC'
;
Column
.
Title
.
Caption :=
'↓'
+ Column
.
Title
.
Caption;
end
else
begin
Column
.
Title
.
Caption :=
'↑'
+ Column
.
Title
.
Caption;
Delete(s, i,
4
);
end
;
end
else
begin
s := cFieldName;
Column
.
Title
.
Caption :=
'↑'
+ Column
.
Title
.
Caption;
end
;
end
;
TCustomADODataSet(DataSet).Sort := s;
end
//============================Clientdataset==========================
else
if
DataSet
is
TClientDataSet
then
begin
if
TClientDataSet(DataSet).indexfieldnames <>
''
then
begin
i := TClientDataSet(DataSet).IndexDefs
.
IndexOf(
'i'
+ Column
.
FieldName);
if
i = -
1
then
begin
with
TClientDataSet(DataSet).IndexDefs
.
AddIndexDef
do
begin
Name :=
'i'
+ Column
.
FieldName;
Fields := Column
.
FieldName;
DescFields := Column
.
FieldName;
end
;
end
;
TClientDataSet(DataSet).IndexFieldNames :=
''
;
TClientDataSet(DataSet).IndexName :=
'i'
+ Column
.
FieldName;
Column
.
Title
.
Caption :=
'↓'
+ Column
.
Title
.
Caption;
end
else
begin
TClientDataSet(DataSet).IndexName :=
''
;
TClientDataSet(DataSet).IndexFieldNames := column
.
fieldname;
Column
.
Title
.
Caption :=
'↑'
+ Column
.
Title
.
Caption;
end
;
end
;
end
;