谁能帮我解释一下这段代码的意思。(50分)

  • 主题发起人 主题发起人 cyb115
  • 开始时间 开始时间
C

cyb115

Unregistered / Unconfirmed
GUEST, unregistred user!
我只知道它可以来排序TClientDataSet但不知它是根据什么来排序的。希望谁能帮我解释一下。
procedure SortGrid( Column : TColumn;
const IndexName : string = 'SortGrid' );
var
Shifted : boolean;
{ TODO -ojfk : Make TDataset using Interface }
cds : TClientDataSet;
KeyState : TKeyboardState;
ShiftState : TShiftState;
procedure SetIndexField( const FieldNames : string;
Shifty : boolean;
ColIndex : integer );
var
ccDB : TClientDataSetGrid;
i, j,
AscField,
ColOffset : integer;
DescList,
FieldList,
NewList : TStringList;
IndexDef : TIndexDef;
FieldName,
AllFields,
DescFields : string;
IdxOpts : TIndexOptions;
begin
FieldList := nil;
NewList := nil;
DescList := TStringList.Create;
if Column.Grid is TClientDataSetGrid then
ccDB := TClientDataSetGrid( Column.Grid )
else
ccDB := nil;
try
FieldList := TStringList.Create;
NewList := TStringList.Create;
ListFieldNames( NewList, FieldNames );
IndexDef := GetIndexDef( cds, IndexName );
IdxOpts := [];
if Assigned( IndexDef ) then
begin
ListFieldNames( FieldList, IndexDef.Fields );
if ( ixDescending in IndexDef.Options ) then
DescList.Assign( FieldList ) { All fields descending }
else
if ( IndexDef.DescFields <> '' ) then
ListFieldNames( DescList, IndexDef.DescFields );
{ Some fields descending }
if Shifty then
{ Additive index }
IdxOpts := IndexDef.Options
else
{ Only retain fields currently in index }
begin
if Assigned( ccDB ) then
{ Clear sort orders }
for i := 0 to ccDB.Columns.Count - 1do
ccDB.Arrow[ i ] := atNone;
ListIntersect( FieldList, NewList );
ListIntersect( DescList, NewList );
end;

cds.DeleteIndex( IndexName );
cds.IndexDefs.Update;
end;
{ Index exists }
Include( IdxOpts, ixCaseInsensitive );
for j := NewList.Count - 1do
wnto 0do
begin

FieldName := NewList[ j ];
AscField := FieldList.IndexOf( FieldName );
if AscField <> -1 then
begin
i := DescList.IndexOf( FieldName );
if i <> -1 then
begin
DescList.Delete( i );
if Shifty then
FieldList.Delete( AscField );
end
else
DescList.Add( FieldName );
end { Field already exists in index }
else
FieldList.Add( FieldName );
end;
{ Processing each new field }
if DescList.Count > 0 then
Include( IdxOpts, ixDescending )
else
Exclude( IdxOpts, ixDescending );
if dgIndicator in TDBGrid(Column.Grid ).Options then
ColOffset := 1
else
ColOffset := 0;
DescFields := SemiText( DescList );
AllFields := SemiText( FieldList );
cds.AddIndex( IndexName, AllFields, IdxOpts, DescFields );
cds.IndexDefs.Update;
cds.IndexName := IndexName;
if Assigned( ccDB ) then
if ( Pos( FieldNames, DescFields ) > 0 ) then
ccDB.Arrow[ Column.Index + ColOffset ] := atDown
else
if ( Pos( FieldNames, AllFields ) > 0 ) then
ccDB.Arrow[ Column.Index + ColOffset ] := atUp
else
ccDB.Arrow[ Column.Index + ColOffset ] := atNone;
finally
DescList.Free;
FieldList.Free;
NewList.Free;
end;
{ finally }
end;
{ AddFieldName() }
begin

if Assigned( Column ) and Assigned( Column.Field )
and Assigned( Column.Field.DataSet )
and ( Column.Field.Dataset is TClientDataset ) then
begin
GetKeyboardState( KeyState );
ShiftState := KeyboardStateToShiftState(KeyState);
Shifted := ssShift in ShiftState;
{ TODO -ojfk : Use an indexdef interface }
cds := ( Column.Field.Dataset as TClientDataset );
case Column.Field.FieldKind of
fkData, fkInternalCalc : SetIndexField( Column.FieldName, Shifted,
Column.Index );
fkLookup : SetIndexField( Column.Field.KeyFields, Shifted, Column.Index );
// fkCalculated, fkAggregate : // can'tdo
anything with these
end;
end;
{ Cando
something with it }
end;
{ SortGrid() }
 
后退
顶部