**********抢分行动*********** 碰到问题查不到,花了半天时间作了一个,不敢独享。 ADO类的数据集有Sort,但是TClientDataSet没有,故作。procedure SortCDS(Column:TColumn); function FindColumn(Grid:TDbGrid;Name:string):TColumn; var i:integer; begin Result:=nil; for i:=0 to Grid.Columns.Count-1 do if Grid.Columns.Items[i].FieldName=Name then Result:=Grid.Columns.Items[i]; end; var DataSet:TClientDataSet; ASC:boolean; Clm:TColumn; begin DataSet:=TClientDataSet(Column.Field.DataSet); if Assigned(DataSet) and (not DataSet.IsEmpty) then begin if DataSet.IndexName=Column.Fieldname then ASC:=StrPos(PChar(Column.Title.Caption),'▼')<>nil; Clm:=FindColumn(TDbGrid(Column.Grid),DataSet.IndexName); if Assigned(Clm) then begin DataSet.DeleteIndex(DataSet.IndexName); Clm.Title.Caption:=Copy(Clm.Title.Caption,1,Length(Clm.Title.Caption)-2); end; if Asc then begin DataSet.AddIndex(Column.Fieldname,Column.FieldName, [ixCaseInsensitive,ixDescending]); Column.Title.Caption:=Column.Title.Caption+'▲'; end else begin DataSet.AddIndex(Column.Fieldname,Column.FieldName,[ixCaseInsensitive]); Column.Title.Caption:=Column.Title.Caption+'▼'; end; DataSet.IndexName:=Column.Fieldname; end; end;
图标用imaglist参考下面:
procedure TMainForm.ListViewColumnClick(Sender: TObject;
Column: TListColumn);
begin
if nSortCol= Column.Index then
AscSort:= not AscSort
else
AscSort:= True;
nSortCol := Column.Index;
ListView.AlphaSort;
end;procedure TMainForm.ListViewCompare(Sender: TObject; Item1,
Item2: TListItem; Data: Integer; var Compare: Integer);
CONST
(* ListView1 Column Headers *)
COLUMN_FILENAME = 0;
COLUMN_SIZE = 4;
COLUMN_ATTR = 3;
COLUMN_MODIFYDATE = 5;
var
size1,size2:integer;
Result: INTEGER;
begin
ListView.HeaderSortColumn:=nSortCol;
case nSortCol of
COLUMN_FILENAME:
Result := CompareText(Item1.Caption,Item2.Caption);
COLUMN_SIZE:
begin
size1 := StrToInt( Item1.SubItems.Strings [ nSortCol - 1 ] );
size2 := StrToInt( Item2.SubItems.Strings [ nSortCol - 1 ] );
Result := ( size1 - size2 );
end;
else
Result := CompareText(Item1.SubItems[nSortCol - 1],Item2.SubItems[nSortCol - 1]);
end; IF AscSort THEN
Compare :=Result;
else
Compare := -Result;
end;图标只有你自己找了:)
图标必须自己画上去吗?有没有更方便的方法?代码case中COLUMN_SIZE=4中那部分有什么用?
2、定义列的大小
碰到问题查不到,花了半天时间作了一个,不敢独享。
ADO类的数据集有Sort,但是TClientDataSet没有,故作。procedure SortCDS(Column:TColumn);
function FindColumn(Grid:TDbGrid;Name:string):TColumn;
var
i:integer;
begin
Result:=nil;
for i:=0 to Grid.Columns.Count-1 do
if Grid.Columns.Items[i].FieldName=Name then
Result:=Grid.Columns.Items[i];
end;
var
DataSet:TClientDataSet;
ASC:boolean;
Clm:TColumn;
begin
DataSet:=TClientDataSet(Column.Field.DataSet);
if Assigned(DataSet) and (not DataSet.IsEmpty) then
begin
if DataSet.IndexName=Column.Fieldname then
ASC:=StrPos(PChar(Column.Title.Caption),'▼')<>nil;
Clm:=FindColumn(TDbGrid(Column.Grid),DataSet.IndexName);
if Assigned(Clm) then
begin
DataSet.DeleteIndex(DataSet.IndexName);
Clm.Title.Caption:=Copy(Clm.Title.Caption,1,Length(Clm.Title.Caption)-2);
end;
if Asc then
begin
DataSet.AddIndex(Column.Fieldname,Column.FieldName,
[ixCaseInsensitive,ixDescending]);
Column.Title.Caption:=Column.Title.Caption+'▲';
end
else begin
DataSet.AddIndex(Column.Fieldname,Column.FieldName,[ixCaseInsensitive]);
Column.Title.Caption:=Column.Title.Caption+'▼';
end;
DataSet.IndexName:=Column.Fieldname;
end;
end;