在Form里添加两个public变量 Fdns,descs:string;编写DBGrid的OnTitleClick事件 procedure TForm1.GridOnTitleClick(Column: TColumn); var fdn,disp,flag,ins1:string; function GetIndexName:string; var s1:string; begin s1:='I'+DateTimeToStr(Now)+IntToStr(Random(999)); s1:=AnsiReplaceText(s1,' ',''); s1:=AnsiReplaceText(s1,'_',''); s1:=AnsiReplaceText(s1,':',''); Result:=s1; end; begin { if Column.Index>ClientDataSet1.Fields.Count-1 then begin showmessage('不成'+IntToStr(Column.Index)+','+IntToStr(ClientDataSet1.Fields.Count)); exit; end; } if not DBGrid1.DataSource.DataSet.Active then begin ShowMessage('没有打开'+DBGrid1.DataSource.DataSet.Name); exit; end; if DBGrid1.DataSource.DataSet.RecordCount=0 then exit; if ClientDataSet1.IndexDefs.Count>0 then fdns:=ClientDataSet1.IndexDefs.Items[ClientDataSet1.IndexDefs.Count-1].Fields; if ClientDataSet1.IndexDefs.Count>0 then descs:=ClientDataSet1.IndexDefs.Items[ClientDataSet1.IndexDefs.Count-1].DescFields; fdn:=ClientDataSet1.Fields[Column.Index].FieldName; disp:=ClientDataSet1.Fields[Column.Index].DisplayLabel; if pos('↓',disp)>0 then begin flag:='↑';//如果正续排列 if pos(fdn,fdns)=0 then fdns:=fdns+';'+fdn;//如果没有正序,则添加 if pos(fdn,descs)=0 then descs:=descs+';'+fdn;//增加反序 end else if pos('↑',disp)>0 then begin flag:='';//如果无序 fdns:=AnsiReplaceText(fdns,fdn,''); descs:=AnsiReplaceText(descs,fdn,''); end else begin flag:='↓';//如果反序 if pos(fdn,fdns)=0 then fdns:=fdns+';'+fdn;//增加索引 if pos(fdn,descs)=0 then descs:=AnsiReplaceText(descs,fdn,'');//去除反续 end; fdns:=AnsiReplaceText(fdns,' ',''); while pos(';;',fdns)>0 do fdns:=AnsiReplaceText(fdns,';;',';'); if copy(fdns,1,1)=';' then delete(fdns,1,1); if copy(fdns,length(fdns),1)=';' then delete(fdns,length(fdns),1); descs:=AnsiReplaceText(descs,' ',''); while pos(';;',descs)>0 do descs:=AnsiReplaceText(descs,';',';'); if copy(descs,1,1)=';' then delete(descs,1,1); if copy(descs,length(descs),1)=';' then delete(descs,length(descs),1); disp:=flag+fdn; ClientDataSet1.DisableControls; ins1:=GetIndexName; while ClientDataSet1.IndexDefs.Count>0 do ClientDataSet1.DeleteIndex(ClientDataSet1.IndexDefs.Items[0].Name); ClientDataSet1.IndexName:=''; ClientDataSet1.AddIndex(ins1,fdns,[ixCaseInsensitive],descs,'',0); ClientDataSet1.IndexName:=ins1; ClientDataSet1.Fields[Column.Index].DisplayLabel:=flag+fdn; ClientDataSet1.First; ClientDataSet1.EnableControls; end;
Fdns,descs:string;编写DBGrid的OnTitleClick事件
procedure TForm1.GridOnTitleClick(Column: TColumn);
var fdn,disp,flag,ins1:string;
function GetIndexName:string;
var s1:string;
begin
s1:='I'+DateTimeToStr(Now)+IntToStr(Random(999));
s1:=AnsiReplaceText(s1,' ','');
s1:=AnsiReplaceText(s1,'_','');
s1:=AnsiReplaceText(s1,':','');
Result:=s1;
end;
begin
{ if Column.Index>ClientDataSet1.Fields.Count-1 then
begin
showmessage('不成'+IntToStr(Column.Index)+','+IntToStr(ClientDataSet1.Fields.Count));
exit;
end; }
if not DBGrid1.DataSource.DataSet.Active then
begin
ShowMessage('没有打开'+DBGrid1.DataSource.DataSet.Name);
exit;
end;
if DBGrid1.DataSource.DataSet.RecordCount=0 then exit;
if ClientDataSet1.IndexDefs.Count>0 then fdns:=ClientDataSet1.IndexDefs.Items[ClientDataSet1.IndexDefs.Count-1].Fields;
if ClientDataSet1.IndexDefs.Count>0 then descs:=ClientDataSet1.IndexDefs.Items[ClientDataSet1.IndexDefs.Count-1].DescFields;
fdn:=ClientDataSet1.Fields[Column.Index].FieldName;
disp:=ClientDataSet1.Fields[Column.Index].DisplayLabel;
if pos('↓',disp)>0 then
begin
flag:='↑';//如果正续排列
if pos(fdn,fdns)=0 then fdns:=fdns+';'+fdn;//如果没有正序,则添加
if pos(fdn,descs)=0 then descs:=descs+';'+fdn;//增加反序 end
else if pos('↑',disp)>0 then
begin
flag:='';//如果无序
fdns:=AnsiReplaceText(fdns,fdn,'');
descs:=AnsiReplaceText(descs,fdn,'');
end
else
begin
flag:='↓';//如果反序
if pos(fdn,fdns)=0 then fdns:=fdns+';'+fdn;//增加索引
if pos(fdn,descs)=0 then descs:=AnsiReplaceText(descs,fdn,'');//去除反续
end;
fdns:=AnsiReplaceText(fdns,' ','');
while pos(';;',fdns)>0 do fdns:=AnsiReplaceText(fdns,';;',';');
if copy(fdns,1,1)=';' then delete(fdns,1,1);
if copy(fdns,length(fdns),1)=';' then delete(fdns,length(fdns),1);
descs:=AnsiReplaceText(descs,' ','');
while pos(';;',descs)>0 do descs:=AnsiReplaceText(descs,';',';');
if copy(descs,1,1)=';' then delete(descs,1,1);
if copy(descs,length(descs),1)=';' then delete(descs,length(descs),1);
disp:=flag+fdn; ClientDataSet1.DisableControls;
ins1:=GetIndexName;
while ClientDataSet1.IndexDefs.Count>0 do ClientDataSet1.DeleteIndex(ClientDataSet1.IndexDefs.Items[0].Name);
ClientDataSet1.IndexName:='';
ClientDataSet1.AddIndex(ins1,fdns,[ixCaseInsensitive],descs,'',0); ClientDataSet1.IndexName:=ins1;
ClientDataSet1.Fields[Column.Index].DisplayLabel:=flag+fdn;
ClientDataSet1.First;
ClientDataSet1.EnableControls;
end;