如何delphidbgrid中的记录排序(sort records in delphi dbgrid)

Delphi DBGrid是一个功能强大的组件,如果您正在开发数据感知应用程序,那么您可能每天都在使用它。下面,我们将了解如何向您的数据库应用程序中添加更多用户肯定会喜欢的功能。...

Delphi DBGrid是一个功能强大的组件,如果您正在开发数据感知应用程序,那么您可能每天都在使用它。下面,我们将了解如何向您的数据库应用程序中添加更多用户肯定会喜欢的功能。

Patient records in folders on a shelf

按照《Delphi数据库编程初学者指南》中描述的概念,下面的示例使用ADO组件(AdoQuery/AdoTable连接到ADOConnection,DBGrid通过数据源连接到AdoQuery)在DBGrid组件中显示数据库表中的记录。

当将所有组件名放在表单上时(DBGrid1、ADOQuery1、AdoTable1等),它们都保留为Delphi命名。

鼠标移动到dbgrid标题区域上

首先,让我们看看如何在鼠标指针移动到DBGrid标题区域时更改鼠标指针。您所要做的就是将代码添加到DBGrid组件的OnMouseMove事件中。

下面的代码只是使用DBGrid组件的MouseCoord属性来“计算”鼠标指针的位置。如果位于DGBrid标题区域上方,则pt.y等于0,这是DBGrid中的第一行(标题区域显示列/字段标题)。

procedure TForm1.DBGrid1MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer);var pt: TGridcoord;begin pt:= DBGrid1.MouseCoord(x, y); if pt.y=0 then DBGrid1.Cursor:=crHandPoint else DBGrid1.Cursor:=crDefault;end;

按列排序单击并更改列标题字体

如果使用ADO方法开发Delphi数据库,并且希望对数据集中的记录进行排序,则需要设置AdoDataset(ADOQuery,AdoTable)的sort属性。

Sort属性是widestring值,指示标准SQL查询的“ORDER BY”部分。当然,您不需要编写SQL查询就可以使用Sort属性。只需将Sort属性设置为单个字段的名称或以逗号分隔的字段列表,每个字段都遵循排序顺序。

下面是一个例子:

ADOTable1.Sort := 'Year DESC, ArticleDate ASC'

DBGrid组件的OnTitleClick事件有一个Column参数,指示用户单击的列。每个列(TColumn类型的对象)都有一个字段属性,指示该列表示的字段(TField),其FieldName属性中的字段包含基础数据集中的字段名称。

因此,要按字段/列对ADO数据集进行排序,可以使用一个简单的行:

with TCustomADODataSet(DBGrid1.DataSource.DataSet) doSort := Column.Field.FieldName; // + ' ASC' or ' DESC'

下面是OnTitleClick偶数处理程序的代码,该处理程序按列单击对记录进行排序。代码一如既往地扩展了这个想法。

首先,我们想以某种方式标记当前用于排序顺序的列。接下来,如果我们单击一个列标题,并且数据集已经按照该列进行了排序,那么我们希望将排序顺序从ASC(升序)更改为DESC(降序),反之亦然。最后,当我们按另一列对数据集进行排序时,我们希望从先前选择的列中删除标记。

为了简单起见,为了标记对记录进行“排序”的列,我们只需将列标题的字体样式更改为粗体,并在使用另一列对数据集进行排序时将其删除。

procedure TForm1.DBGrid1TitleClick(Column: TColumn);{$J+}const PreviousColumnIndex : integer = -1;{$J-}beginif DBGrid1.DataSource.DataSet is TCustomADODataSet thenwith TCustomADODataSet(DBGrid1.DataSource.DataSet) dobegintry DBGrid1.Columns[PreviousColumnIndex].title.Font.Style := DBGrid1.Columns[PreviousColumnIndex].title.Font.Style - [fsBold]; exceptend; Column.title.Font.Style := Column.title.Font.Style + [fsBold]; PreviousColumnIndex := Column.Index; if (Pos(Column.Field.FieldName, Sort) = 1) and (Pos(' DESC', Sort)= 0) then Sort := Column.Field.FieldName + ' DESC' else Sort := Column.Field.FieldName + ' ASC'; end;end;

上面的代码使用类型化常量为排序顺序保留以前“选定”列的值。

  • 发表于 2021-09-10 22:31
  • 阅读 ( 232 )
  • 分类:编程

你可能感兴趣的文章

如何在linux上使用uniq命令

...行。在本指南中,我们将介绍它的多功能性和特性,以及如何充分利用这个漂亮的实用程序。 在linux上查找匹配的文本行 uniq命令是快速、灵活的,而且非常擅长它所做的事情。不过,与许多Linux命令一样,它也有一些怪癖,只...

  • 发布于 2021-04-02 16:25
  • 阅读 ( 190 )

如何在excel中按字母顺序排列工作表页签

...序工作表选项卡将更容易找到您要查找的内容。 相关:如何在Excel中重命名工作表选项卡 除了通过对工作表应用颜色来组织工作表选项卡外,只要您已将自定义名称应用到工作表中,也可以按字母或字母数字对它们进行排序。...

  • 发布于 2021-04-08 18:07
  • 阅读 ( 341 )

快速排序(quick sort)和合并排序(merge sort)的区别

...更好更快,而合并排序保持一致性,而不管数据集的类型如何。快速排序是理想的首选数组,而合并排序是理想的首选链表。 空间复杂性 –快速排序算法中的排序是递归进行的,每个递归调用都需要堆栈位置。它不需要额外的...

  • 发布于 2021-06-25 22:32
  • 阅读 ( 442 )

气泡排序(bubble sort)和选择排序(selection sort)的区别

...理大数据集。有各种排序算法。气泡排序和选择排序是其中的两种。 覆盖的关键领域 1.什么是冒泡排序–定义,功能2.什么是选择排序–定义,功能3.冒泡排序和选择排序的区别是什么–关键区别的比较 关键术语 算法,大数据...

  • 发布于 2021-07-01 07:25
  • 阅读 ( 566 )

可比(comparable)和java中的比较器(comparator in java)的区别

Java中的可比性和比较器的主要区别在于,可比较的基于单个元素对集合进行排序,而比较器基于多个元素对集合进行排序。 Java是一种高级的通用编程语言,有助于构建各种应用程序,如web、桌面、移动和高性能分布式系统。此...

  • 发布于 2021-07-01 17:05
  • 阅读 ( 292 )

排序(sorting)和整理(collating)的区别

...列。它是一个包含一组规则的数据库对象,这些规则确定如何比较、搜索和按字母顺序排序字符串。字符串基本上表示一个可以根据数字的值进行排序的数字。排序规则中的规则确定一个字符串是小于、等于还是大于另一个字符...

  • 发布于 2021-07-13 14:05
  • 阅读 ( 110 )

如何在google表中排序

在查看或分析电子表格时,您可能需要做的一件事是对数据进行排序。幸运的是,在googlesheets中,您可以轻松地按字母、数字或颜色对整个工作表或一系列单元格进行排序。 Table of Contents Sort an Entire Sheet by a Column Sort Only a Ran...

  • 发布于 2021-07-14 10:09
  • 阅读 ( 148 )

使用基于规则的列表处理完成任务

...为shawkle的文本列表管理器。今天,Baker很友好地解释了他如何使用shawkle在TXT中管理他的个人信息。Shawkle是一个聪明的命令行高手,在极客里克特级别上表现得很好,但对于纯文本文件爱好者来说,它是一个非常有用和灵活的工...

  • 发布于 2021-08-01 16:13
  • 阅读 ( 192 )

如何在dbgrid中使用复选框(use checkboxes in a dbgrid)

在Delphi中定制DBGrid的输出有很多方法和理由。一种方法是添加复选框,使结果在视觉上更具吸引力。 默认情况下,如果数据集中有布尔字段,DBGrid会根据数据字段的值将其显示为“True”或“False”。但是,如果选择使用“true...

  • 发布于 2021-09-04 07:22
  • 阅读 ( 153 )

使用delphi的键入文件文件创建数据库

...t record} Seek(F, FileSize(F)) ; 更改和更新 您刚刚学会了如何编写和读取整个成员数组,但如果您只想查找第10个成员并更改电子邮件,该怎么办?下一个过程正是这样做的: procedure ChangeEMail(const RecN : integer; const NewEMail : str...

  • 发布于 2021-09-06 15:11
  • 阅读 ( 170 )
忘却故人
忘却故人

0 篇文章

相关推荐