DBGrid排序

delphi DBGrid排序的两种方法(自己代码中,测试成功的) 在delphi有些第三方控件确实有自带的排序功能,可是对于原始的DBGrid控件不存在自动排序功能,下面是两种不同显示的排序方法。我自己写成函数,可以调用。(自己程序中测试成功的) 立即下载

给DBGrid加入排序功能

在实际数据库管理系统中,用户对表中数据的操作,最频繁的莫过于浏览查询了,而查询中若能提供为某字段建立的排序功能,则非常有利于用户对“关键数据”的了解。

Windows的用户都知道,在“我的电脑”或“资源管理器”中打开任一文件夹,若以“详细资料”方式查看,系统会显示出该文件夹下的子文件夹和文件相关信息,如:名称、类型 、大小、修改时间,用户只需要单击标题栏中的相应项,则系统自动按该项进行“升序”(或“降序”)的排列显示,这样用户便能轻松查看相应的文件夹或文件对象的内容。

受此启发,考虑能不能在显示数据的Grid表格中完成如此功能呢?答案是肯定的。下面以在Delphi中的实现方法为例,通过具体内容,介绍该功能的实现。

步骤如下:

一、先建立一数据表

该表以Delphi 中最常用的Paradox为类型,取名为Student,反映(在职)学生的基本情况。该表各字段定义如下:

--------------------------------------------

字段名    类型      大小

序号     Short型     / (Key*)

学号     Alpha型     6

出生日期   Date型      /

性别     Alpha型     2

婚否     Logical型    /

英语     Number型     /

高数     Number型     /

PASCAL    Number型     /

备注     Memo型      20

-------------------------------------------

保存后,随意往表中输入3至5条记录内容。

注:①表中必须建立关键索引(为首字段建立)。此处为“序号”字段;
 with table1 do
 begin
 close;
 Exclusive := true;
 DatabaseName := '';
 TableName := '';
 Open;

{建立主索引 }
 AddIndex('','ID',[ixPrimary]);

{建立次索引 }
 AddIndex('NameIndex','ID;Name',[]);

 close;
 end;

②该表中使用了Paradox常用的几种字段类型,但尚未全部包含。

二、建立项目,实现功能

1.新建一项目,并为表单添加相关控件,各控件主要属性如下表:

2.建立各Click的事件代码

Button1(打开表)的Click事件代码如下:

procedure TForm1.Button1Click(Sender: TObject);

begin

Table1.Open; // 打开Table1关联的表Student

end;

Button2(关闭表单)的Click事件代码如下:

procedure TForm1.Button2Click(Sender: TObject);

begin

Application.Terminate;

end;

DBGrid1的TitleClick事件代码如下:

procedure TForm1.DBGrid1TitleClick(Column: TColumn);

//注:本过程参数Column包含的信息量非常多

begin

MySort(DBGrid1,Column);

end; //调用字段排序

其中,MySort(DBGrid1,Column)为自定义的排序过程,具体代码见下述。

3.建立通用处理模块

为使该功能具有“通用性”,将其定义为一过程。

首先,预声明过程及建立两个全局私有变量:

...

Type

...

procedure MySort(DBGrid0:TDBGrid; Column: TColumn);//预声明过程

private

{ Private declarations }

psIndexName:string; //记录当前索引名称

plAscend:boolean; //记录当前索引名称的索引状态

public

{ Public declarations }

end;

...

其次,该过程完整代码如下:

procedure TForm1.MySort(DBGrid0:TDBGrid; Column: TColumn);

var

//本模块使用到的psIndexName, plAscend两个变量见上定义

mode:char; //记录是“升序”还是“降序”

ColName:string; //记录当前字段名

iCol:Integer; //记录当前列号

begin

with DBGrid0.DataSource.DataSet as TTable do //Table0

begin

//检测当前工作表是否已打开

if not Active

then begin

MessageBeep(0);

Application.MessageBox('工作表尚未打开!','停止',MB_OK+MB_ICONSTOP);

Abort

end;

//检测当前字段是否“能排序”。以下字段类型不能排序

case Column.Field.DataType of

ftBoolean,

ftBytes,

ftBlob, //Binary

ftMemo,

ftGraphic,

ftFmtMemo, //Formatted memo

ftParadoxOle: //OLE

begin

MessageBeep(0);

Application.MessageBox(Pchar('项目"'+Column.FieldName+'"'+'不能排序!'),'停止

',MB_OK+MB_ICONSTOP);

Abort

end;

end; //case

mode:='0';

iCol:=Column.Field.FieldNo-1;

try

ColName:=Column.fieldname;

if psIndexName=Column.fieldname

then begin //与原来同列

if plAscend //升序

then begin

mode:='2';

IndexName:=ColName+'2'; //应“降序”

end

else begin

mode:='1';

IndexName:=ColName+'1'; //应“升序”

end;

plAscend:=not plAscend;

end

else begin //新列

IndexName:=ColName+'2';

plAscend:=false;

psIndexName:=ColName;

end;

except

on EDatabaseError do //若未有索引,则重新建立

begin

Messagebeep(0);

//以下新建索引

IndexName:='';

Close;

Exclusive:=true;

if mode='1'

then AddIndex(ColName+'1',ColName,[ixCaseInsensitive],'')//

else //包括'0'

AddIndex(ColName+'2',ColName,[ixDescending,ixCaseInsensitive],'');

Exclusive:=false;

Open;

try //try 1

if mode<>'1'

then begin

mode:='2';//转换

plAscend:=false;

end

else plAscend:=true;

IndexName:=ColName+mode;

psIndexName:=ColName;

except

on EDBEngineError do

IndexName:='';

end //try 2

end

end;

First;

end; //with

DBGrid0.SelectedIndex:=iCol;

end;//End of MySort

本过程已对所有可能的错误进行了相应的检测及处理,代码是比较完整的。因此,把该过程放入你相应的单元中,对每一个DBGrid,只要传递不同的DBGrid及Column参数,就能实现对应数据表的自动排序处理,而事先只为某字段建立一关键索引即可,其它Secondery Indexes的建立均在程序中自动完成,但会为每一个建立了索引的字段生成了一些附加文件(如*.XG?,*YG?等)。当然若有必要,可以在表单关闭前将所有的附加文件删除。

delphi DBGrid_添加点击排序功能 dbgrid 添加点击字段名自动排序功能,注意空数据时候需要加入判断。 立即下载

相关推荐

工业4.0 底层逻辑

工业4.0 的概念已经被滥用了,它与物联网,工业物联网等概念一样,几乎什么都往里面装。演变成了一句口号和愿景。许多人并不清楚工业4.0的底层逻辑到底是什么?如何遵循工业4.0 的思想构建新一代智能制造系统?并没用清晰地展示工业4.0的技术路线图。

姚家湾博客 1993

巧用DBGrid控件的Sort属性实现“点击标题栏自动排序功能

巧用DBGrid控件的Sort属性实现“点击标题栏自动排序功能 很多朋友在使用DBGrid控件时,抱怨没有点击标题栏便可自动排序的功能,实际上通过ADOQuery或其它数据集组件的Sort属性配合DBGrid的OnTitleClick事件,可以方便地实现此功能。因为Sort属性可以让活动数据集按指定的字段进行排序,也可以选择排序方式(升序/降序),所以我们只要在OnTitleClick事件中设

fyl_077的专栏 997

AD9361 FIR 滤波器设计

matlab 得到滤波器系数

weixin_44630490的博客 1万+

对DBGrid的数据进行排序和过滤

这个是显示数据常用的操作,按道理看看CB的帮助就很容易找到答案,可是还有很多的人利用构造新的SQL重新检索的方法实现,实在是非~常~的不理解,利用ADO控件的Sort、Filter或者ClientDataSet的index、filter可以很容易在本地实现且效率很高的处理方式为什么不留意呐。附CB帮助的内容:过滤的://State = CA OR State = MAADO

萤火虫之光 1488

陆地观测卫星数据服务平台深度体验:高分、中巴、资源系列影像的检索与下载技巧

本文深度解析国产陆地观测卫星数据服务平台的使用技巧,重点介绍高分、中巴、资源系列卫星影像的检索与下载方法。通过权限体系解析、高级检索策略、数据预处理等实战技巧,帮助用户高效获取高质量遥感数据,适用于环境监测、资源调查等多种应用场景。

eee77的博客 980

三极管稳压电路仿真分析

Z1的负极连接到三极管的基极,三极管发射极E是输出,形成了一个射极跟随器,也就是说,E极的电压随着B电压变化而变化,但BE之间有一个压降,一般硅管0.7V左右,假设B极是6.7V,那E极就是6.7-0.7=6V,所以就有一个公式VOUT=Vz-Vbe,可以根据VOUT来选择合适的稳压管。从稳压管的SPEC中我们可以看到,Vz@Izt这个参数,指在Izt=20mA时,稳压管的稳压值Vz=5.1V,也就是说流过稳压管的电流在20mA以上,稳压效果最佳。三极管导通之后,E点电压会升高,当升高到Vbe。

U_YAO的博客 2322

DBGrid点击标题栏实现自动排序功能

通过ADOQuery控件的Sort属性,配合DBGrid的OnTitleClick事件,可以方便地实现此功能。Sort属性可以让活动数据集按指定的字段进行排序,与SQL语句Order后面的写法一样(升序ASC/降序DESC)。 Form1; ADOConnection1: TADOConnection; ADOQuery1: TADOQuery; DataSource1: TDataSource;...

weixin_44823889的博客 517

【RT-DETR有效改进】利用MobileNetV3替换Backbone(轻量化网络结构,提点)

本文给大家带来的改进机制是,其主要改进思想集中在结合硬件感知的网络架构搜索(NAS)和NetAdapt算法,以优化移动设备CPU上的性能。它采用了新颖的架构设计,包括反转残差结构和线性瓶颈层,以及新的高效分割解码器Lite Reduced Atrous Spatial Pyramid Pooling(LR-ASPP),以提升在移动分类、检测和分割任务上的表现。实验表明,MobileNets在资源和准确性的权衡方面表现出色,并在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中展现了其有效性。

Snu77的博客 2748

LAZARUS 在DBgridEH的控件里,点击列标题排序

LAZARUS 在DBgridEH的控件里,点击列标题排序

720

华为OD机试真题 新系统2026-04-15 Python&JS 实现【失灵的键盘】

有一个键盘有2个按键失灵了,按下这些键时会连续输出其他键对应的字符两次。具体如下: 1. 按下j键一次,屏幕上显示uu(两个连续的u);  按下b键一次,屏幕上显示t(两个连续的t) 2. u键和t键是好的,按下u键一次时,屏幕只会显示一次u(正常按键);按下t键一次时,屏幕只会显示一次t(正常按键) 3. 假定屏幕上连续显示两个t一定是按了一次b键,而不是两次t键;假定按键t之后不会紧接着按键b,即tttt转义为两个b,而不可能是tb

MISAYAONE的博客 523

华为OD面试手撕真题 - 最大数

华为OD面试手撕真题 最大的数 提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解

qq_45776114的博客 340

delphi dbgrid_如何在Delphi DBGrid中对记录进行排序

delphi dbgrid Delphi DBGrid is such a powerful component that you're probably using it every day if you're developing data-aware applications. Below, we'll take a look at how to add some more features...

cumao2792的博客 1395

SpringBoot+Vue+kkFileView实现文档管理(文档上传、下载、在线预览)

上面在使用OpenOffice实现doc、excel、ppt等文档的管理和预览。除此之外可用kkFileView实现包括且更多文档的预览。

BADAO_LIUMANG_QIZHI的博客 1万+

DBGrid单击标题自动排序

procedure TForm1.DBGrid1TitleClick(Column: TColumn);var s,cFieldName:string; i:integer; DataSet:TDataSet;begin Try DataSet:=Column.Grid.DataSource.DataSet; if not DataSet.Act

jinzhili的专栏 1140

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

如何用DBGrid实现排序

我找到了使用 ADOQUERY 控件实现的方法,可做参考: 巧用DBGrid控件的Sort属性实现“点击标题栏自动排序功能 很多朋友在使用DBGrid控件时,抱怨没有点击标题栏便可自动排序的功能,实际上通过ADOQuery或其它数据集组件的Sort属性配合DBGrid的OnTitleClick事件,可以方便地实现此功能。因为Sort属性可以让活动数据集按指定的字段进行排序,也可以选择排序方式(

普森备忘录 3259

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

bcb中点击DBGrid标题进行排序

DBGrid,标题进行排序

bobWu 的 学习日记 2883

Delphi DBGrid重新排序

两种方式可以实现: 第一种

u012411236的专栏 689

关于DBgrid排序的问题

自用极品代码: 添加定义: C/C++ code <!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> TField *FSortField; void __fastcall SetSortFie

ZENITH 747

Delphi DBGrid 按标题排序,按Shift + 鼠标左健多选

Delphi DBGrid 按标题排序,按Shift + 鼠标左健多选

1063

最全面的DBGrid点击标题实现排序

 最全面的DBGrid标题排序实现方法:procedure TSrv_SJSetForm.DBGridEh1TitleClick(Column: TColumnEh);var s,cFieldName:string; i:integer; DataSet:TDataSet; procedure setTitle; var ii:integer; cStr:str

小宇飞刀的BLOG 924

以ADO数据集相连的DBGrid按单一字段排序通用过程

//适用范围:与ADO数据集相连的DBGrid按单一字段排序//传入参数:Column(排序字段对应的DBGridColumn),DefaultSort(缺省排序串)//使用建议:在DBGrid的OnTitleClick中直接调用之。第一次单击某Column标题栏时,按改字段升序排列,连续第二次单击时改为降序,连续第三次单击时,改为缺省方式排序(如PrimaryKey等)procedure Sor...

weixin_34162228的博客 104

DBGrid单击表头排序

procedure TMainFrm.DBGrid2TitleClick(Column: TColumn);var flag:Boolean; tempstr:string;begin tempstr:=Column.Title.Caption; if Pos('▲',tempstr)>0 then flag:=False else flag:=True; if (Pos('▲...

weixin_30696427的博客 199

单击dbgrid的title进行排序

我找到了使用 ADOQUERY 控件实现的方法,可做参考:巧用DBGrid控件的Sort属性实现"点击标题栏自动排序功能很多朋友在使用DBGrid控件时,抱怨没有点击标题栏便可自动排序的功能,实际上通过ADOQuery或其它数据集组件的Sort属性配合 DBGrid的OnTitleClick事件,可以方便地实现此功能。因为Sort属性可以让活动数据集按指定的字段进行排序,也可以选择排序方式(升序 ...

注重长远 天天积累 cqujsjcyj 265

点击DBGrid的Title对查询结果排序

欲实现点击DBGrid的Title对查询结果排序,想作一个通用程序,不是一事一议,例如不能在SQL语句中增加Order by ...,因为SQL可能原来已经包含Order by ...,而且点击另一个Title时又要另外排序,目的是想作到象资源管理器那样随心所欲。procedure TFHkdata.SortQuery(Column:TColumn);var  SqlStr,myFieldName

xiaomaoxia的专栏 735
上一篇: Delphi制作客户端系统功能组件分离的架构设计
下一篇: 正则表达式
softworkman
博客等级 码龄21年 1粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值