用ClientDataSet和dbgrid 如何通过点击dbgrid的标题进行排序
解决方案 »
- 如果列出电脑存在的串口?
- 请教在tcpserver的onExecute方法中创建显示新form
- if (SDL_BYTEORDER = SDL_BIG_ENDIAN) then这句什么意思?
- 谁有QReport3.5以上 for delphi6的,请给我个 急
- QUICKREPORT中的QREXPR控件
- 关于数据库的连接的问题?我是初学者,望各位大侠指点!
- 怎样使窗体可以最小化到工具栏?(像oicq那样)
- 在DELPHI5.0里,怎样用TQuery组件,批量更新服务器上的数据?
- 双击一控件,怎样能获取该控件的名称!如双击DBEdit1,怎样把它的名字赋值给一变量!
- 我刚开始学Delphi,感到与c有太大的区别。以前学c能编不少小程序,但学Delphi却好像没法下手,请问各位有什么好的学习方法?谢谢!
- 用Query查询ORACLE数据库显示在DBGrid中但不能修改?
- 各位朋友,一个公司让我去开发短信增值业务SP类型的软件,我delphi初学,都包括什么技术含量呀?感谢
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;