当前位置: 首页 > news >正文

DBGridEh 的排序

DBGridEh 可以点列抬头使得记录按该列排序

不需要写代码,只需要设置好,它就能排序。

网上的文章一般写了如何设置。但一般都少说了一条。

先说如何设置:

1. OptionsEh.AutoSortMarking 设置为 True,如果是设计期属性面板,就是打勾;

2. 如果要按多个字段排序,则:OptionsEh.dghMultiSortMarking 打勾;

3. SortLocal 打勾;

4. 如果是设计期,为 DBGridEh 创建固定字段(Columns),选中要排序的字段,在其属性面板找到:

4.1. Title.TitelButton 打勾;

4.2. Title.SortMarker 可以选择默认值,也就是没排序箭头。但当执行完排序,这个箭头会显示出来。

5. 重点来了:如果这个 DBGridEh 对应的 DataSet 是 ClientDataSet,就需要在它所在的单元 uses EhlibCDS

为啥要 uses EhlibCDS

请参考以下这段话:

EhLib已经实现了能在TQuery, TADOQuery 和TClientDataSet对象中排序数据的类。简单地通过 uses 子句添加 Ehlib...(EhlibBDE,EhlibADO,EhlibCDS)的单元之一到你的工程的任意单元中,与它们相连的数据网格将自动对该数据集进行排序。 EhLibBDE, EhLibADO, EhLibCDS 通过在单元数据集中调用 RegisterDatasetFeaturesEh 过程来实现初始化。
对于其它数据集类型,你必须编写、并注册可以实现该数据集排序的新对象。书写过程 T[你的数据集]DatasetFeaturesEh.ApplySorting ,你可以存取那些使用了 SortMarkedColumns 属性的列以实现直接排序。你可以查看 DbUtilsEh 单元中的示例以明白如何编写T[你的数据集]DatasetFeaturesEh 类及查看 EhLibBDE 单元以明白如何注册 T[你的数据集]DatasetFeaturesEh 类。

大概意思:DBGridEh 实际上是依靠它对应的 DataSet 去排序的。TDataSet 本身没有实现排序功能,但它的子类,比如 TClientDataSet 实现了排序功能。因此,如果要它自动排序,需要引用它提供的对应该 DataSet 的排序单元。如果你使用的 DataSet 不是它支持的,就要自己去实现,并注册。

概念

Delphi 的数据敏感控件,比如 DBGrid 或者 DBGridEh,通过 DataSource 指向一个 DataSet;数据敏感控件本身仅仅是用于数据的显示,它并不拥有数据,也不管理数据。所有对数据的操作,都是在操作 DataSet。

因此,表面上看,点击的 DBGridEh 的字段抬头后,里面的数据排序了。但实际上,是它背后的 DataSet 里面的数据排序了。

进一步的测试

有人想要点击 DBGridEh 的字段抬头排序以后,还想要在排序后可以取消排序,恢复 DBGridEh 里面的记录的原来的排列顺序。

基于以上排序的原理,可以知道,排序实际上是对 DataSet 而言的。因此,使用以下代码测试:

procedure TForm1.Button3Click(Sender: TObject);
beginShowMessage(ClientDataSet1.IndexFieldNames);ShowMessage(ClientDataSet1.IndexName);
end;

程序运行后,用户点击 DBGridEh 的字段抬头排序之前,点击 Button3 执行上述代码,弹出来的对话框是空的。

用户点击 DBGridEh1 的字段抬头排序之后,运行上述代码,可以看到:

1. ClientDataSet1.IndexFieldNames 仍然是空的;

2. ClientDataSet1.IndexName 为:SortIndexEh

说明当用户点击 DBGridEh 的字段抬头,DBGridEh 自动为记录排序时,实际上它是为它对应的 ClientDataSet1 增加了一个索引!

因此,取消排序就简单了:
procedure TForm1.Button4Click(Sender: TObject);
beginClientDataSet1.IndexName := '';
end;

执行完上述代码,可以看到,DBGridEh1 里面的记录顺序确实恢复到了排序之前的顺序。

进一步讨论

其实,有必要取消排序,恢复到原始混乱的排序吗?

对用户来说,其实他需要的是各种排序。比如先按照名字排序,看完了,可能想按照性别排序来看。看完了,可能想按照年龄排序来看。因此,只需要对各个字段设置为可以点抬头排序就好了。实在想不出来有什么需求,是要看原始混乱排序的顺序的。

相关文章:

DBGridEh 的排序

DBGridEh 可以点列抬头使得记录按该列排序 不需要写代码,只需要设置好,它就能排序。 网上的文章一般写了如何设置。但一般都少说了一条。 先说如何设置: 1. OptionsEh.AutoSortMarking 设置为 True,如果是设计期属性面板&…...

spring-boot-starter-parent和spring-boot-dependencies介绍

springboot项目的pom文件中&#xff0c;我们经常看见这样(下图)两种springboot的版本依赖管理方式&#xff1b;图片中的这两种依赖声明方式任意用其中一种都可以。文章后面会简单阐述一下区别和使用场景。 事例中完整的pom文件 <?xml version"1.0" encoding&quo…...

缓存穿透解决方案之布隆过滤器

布隆过滤器可以快速判断数据是否存在&#xff0c;避免从数据库中查询数据是否存在&#xff0c;减轻数据库的压力 布隆过滤器是由一个初值为0的bit数组和N个哈希函数&#xff0c;可以用来快速的判断某个数据是否存在 当我们想要标记某个数据是否存在时&#xff0c;布隆过滤器会…...

pptx和ppt有什么区别?了解两者之间的微妙差异

在现代办公和学习环境中&#xff0c;PowerPoint已成为我们生活中不可或缺的一部分。随着技术的不断进步&#xff0c;PowerPoint的格式也在不断更新。对于许多初学者&#xff0c;可能会对PPT和PPTX这两种格式感到困惑。本文旨在深入探讨PPTX与PPT之间的主要差异&#xff0c;帮助…...

LabVIEW水下温盐深数据一体化采集与分析

LabVIEW水下温盐深数据一体化采集与分析 开发一个基于LabVIEW的水下温盐深数据一体化采集与分析系统&#xff0c;实现海洋环境监测的自动化和精确化。通过集成温度、盐度和深度传感器&#xff0c;结合USB数据采集卡&#xff0c;利用LabVIEW软件开发的图形化界面&#xff0c;实…...

适配器模式 详解 设计模式

适配器模式 适配器模式是一种结构型设计模式&#xff0c;其主要作用是解决两个不兼容接口之间的兼容性问题。适配器模式通过引入一个适配器来将一个类的接口转换成客户端所期望的另一个接口&#xff0c;从而让原本由于接口不匹配而无法协同工作的类能够协同工作。 结构 适配…...

探索rsync远程同步和SSH免密登录的奥秘

目录 集群分发脚本xsyncscp&#xff08;secure copy&#xff09;安全拷贝rsync 远程同步工具集群分发脚本 SSH免密登录免密登录原理SSH免密登录配置生成公钥和私钥授权测试 在现代科技飞速发展的时代&#xff0c;数据的备份和迁移成为了一个重要的课题。其中&#xff0c;rsync远…...

JavaScript new、apply call 方法

new、apply、call、bind JavaScript 中的 apply、call和 bind 方法是前端代码开发中相当重要的概念&#xff0c;并且与 this 的指向密切相关 new new 关键词的主要作用 就是执行一个构造函数、返回一个实例对象 根据构造函数的情况&#xff0c;来确定是否可以接受参数的传递…...

助力智能化农田作物除草,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建农田作物场景下玉米苗、杂草检测识别分析系统

在我们前面的系列博文中&#xff0c;关于田间作物场景下的作物、杂草检测已经有过相关的开发实践了&#xff0c;结合智能化的设备可以实现只能除草等操作&#xff0c;玉米作物场景下的杂草检测我们则少有涉及&#xff0c;这里本文的主要目的就是想要基于DETR模型来开发构建玉米…...

O(1)转移线性dpLeetCode 2369. 检查数组是否存在有效划分

一、题目 1、题目描述 给你一个下标从 0 开始的整数数组 nums &#xff0c;你必须将数组划分为一个或多个 连续 子数组。 如果获得的这些子数组中每个都能满足下述条件 之一 &#xff0c;则可以称其为数组的一种 有效 划分&#xff1a; 子数组 恰 由 2 个相等元素组成&#xf…...

【力扣hot100】刷题笔记Day17

前言 今天竟然不用开组会&#xff01;天大的好消息&#xff0c;安心刷题了 46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 回溯&#xff08;排列&#xff09; class Solution:def permute(self, nums: List[int]) -> List[List[int]]:# 回溯def backtrack():if len(…...

leetcode日记(34)通配符匹配

这道题做了很久很久……一开始我想用的方法是使用双指针&#xff0c;分别指向两数组&#xff0c;然后依次按照题目中的规则遍历&#xff0c;做了很久发现时间超限了&#xff01;这是我最后超时的代码&#xff01; class Solution { public:bool isMatch(string s, string p) {…...

一张图读懂人工智能

一、生成人工智能的概念和应用&#xff0c;以及如何使用大型语言模型进行聊天和创造原创内容。这项技术将会对人类和企业产生深远影响。 计算机获得学习、思考和交流的能力&#xff0c;被称为生成人工智能。生成人工智能可以立即获得人类所有知识的总和&#xff0c;并回答任何…...

5.37 BCC工具之uflow.py解读

一,工具简介 uflow工具用于跟踪方法的进入和退出事件,并打印一个可视化的流程图,显示方法是如何进入和退出的,类似于带有断点的跟踪调试器。这对于理解Java、Perl、PHP、Python、Ruby和Tcl等高级语言中的程序流非常有用,这些语言为方法调用提供了USDT探测。 二,代码示例…...

R语言简介,R语言开发环境搭建步骤,R基础语法以及注释详解

R语言是一种用于统计计算与绘图的编程语言&#xff0c;由新西兰奥克兰大学的统计学家罗斯伊哈卡和罗伯特杰特曼于1993年发明。R语言是一种自由、免费、源代码开放的软件&#xff0c;属于GNU系统的一个分支&#xff0c;如今被广泛地应用于统计分析、数据挖掘等领域。 R语言的特…...

【Django】执行查询—检索对象

检索对象 以下述模型为基础&#xff0c;讨论检索对象的方式方法&#xff1a; from datetime import datefrom django.db import modelsclass Blog(models.Model):name models.CharField(max_length100)tagline models.TextField()def __str__(self):return self.nameclass …...

Python:练习:编写一个程序,写入一个美金数量,然后显示出如何用最少的20美元、10美元、5美元和1美元来付款

案例&#xff1a; python编写一个程序&#xff0c;写入一个美金数量&#xff0c;然后显示出如何用最少的20美元、10美元、5美元和1美元来付款&#xff1a; Enter a dollar amout:93 $20 bills: 4 $10 bills: 1 $5 bills:0 $1 bills:3 思考&#xff1a; 写入一个美金数量&…...

模板方法模式 详解 设计模式

模板方法模式 模板方法模式是一种行为型设计模式&#xff0c;它定义了一个算法的骨架&#xff0c;将一些步骤延迟到子类中实现。这种模式允许子类在不改变算法结构的情况下重新定义算法的某些步骤。 结构 抽象类&#xff08;Abstract Class&#xff09;&#xff1a;负责给出一…...

Node.js_基础知识(http模块)

网络基础 URL的组成结构&#xff1a;协议名: // 主机名 [:端口号] [/路径] [?查询字符串]协议默认端口&#xff1a; http&#xff1a;80&#xff0c;开发常用端口有 3000、8080、8090、9000https: 443 如果端口被其他程序占用&#xff0c;可以使用 资源监视器 找到占用端口的…...

matlab工具包

matlab安装yalmip和cplex出错 - 知乎 (zhihu.com) Cplex的安装和使用实例-CSDN博客 一条龙教程&#xff1a;Matlab下使用yalmip(工具箱)cplex&#xff08;求解器&#xff09;_使用yalmip和cplex求解器进行建模和求解的步骤如下:-CSDN博客 啊啊啊&#xff0c;好开心&#xff…...

Go语言怎么用Jaeger_Go语言Jaeger链路追踪教程【实用】

Jaeger客户端初始化报nil pointer dereference因未设置有效tracer&#xff0c;须在main开头调用opentracing.SetGlobalTracer&#xff1b;HTTP透传需用opentracing.HTTPHeadersCarrier&#xff1b;Tag/Log值禁用nil指针&#xff1b;UDP连Agent失败应检查端口、Docker网络及改用…...

为什么研发团队更需要代码知识库,而不是只要一个代码助手?

当下&#xff0c;几乎所有企业的研发主管都在为团队采购类似 GitHub Copilot 这样的 AI 代码补全工具。确实&#xff0c;这些工具能让程序员编写基础代码的速度提升 30% 以上。然而&#xff0c;拉长周期来看&#xff0c;团队的整体交付效率并没有发生本质飞跃&#xff0c;甚至在…...

mysql如何设计积分系统_mysql流水账与余额对账

流水表必须带唯一业务单号trade_no并建唯一索引&#xff0c;用INSERT IGNORE或ON DUPLICATE KEY UPDATE防重&#xff1b;余额统一用BIGINT存最小单位&#xff0c;所有增减走原子UPDATE&#xff1b;对账分实时&#xff08;查最近N条&#xff09;与离线&#xff08;每日全量SUM比…...

实时AI视频生成已突破24fps?2026奇点大会现场Demo实测:端侧部署方案、WebGPU加速路径与iOS/Android兼容性避坑指南

第一章&#xff1a;实时AI视频生成已突破24fps&#xff1f;2026奇点大会现场Demo实测&#xff1a;端侧部署方案、WebGPU加速路径与iOS/Android兼容性避坑指南 2026奇点智能技术大会(https://ml-summit.org) 在2026奇点大会主会场A3展台&#xff0c;Luma Labs联合高通与苹果工…...

专科大二学生的变成学习规划和愿景

自我介绍专科大二学生&#xff0c;主修计算机网络专业&#xff0c;目前处于技术积累与升学准备阶段。对编程充满热情&#xff0c;希望通过系统学习和实践提升技术能力&#xff0c;为未来职业发展或专升本考试打下坚实基础。编程目标以专升本&#xff08;升学&#xff09;为核心…...

自动化框架对比:Selenium vs Playwright - 专业深度解析

在快速迭代的软件开发周期中&#xff0c;自动化测试已成为保障产品质量的核心环节。作为软件测试从业者&#xff0c;选择高效的测试框架直接关系到测试效率、维护成本和团队协作。本文将针对两大主流框架——Selenium与Playwright——进行专业对比&#xff0c;涵盖架构设计、性…...

C语言实现 简易计算器教程

制作简易的算术计算器编写程序实现一个简单的计算器&#xff08;可实现加减乘除即可&#xff09;。要求从键盘输入2个数和一个运算符&#xff0c;输出对应的计算结果。#include <stdio.h>int main(){double num1, num2, result;char symbol;printf("简易计算器\n&qu…...

生成式AI商业模式创新全景图(2024权威白皮书级复盘)

第一章&#xff1a;生成式AI商业模式创新全景图&#xff08;2024权威白皮书级复盘&#xff09; 2026奇点智能技术大会(https://ml-summit.org) 2024年&#xff0c;生成式AI已从技术验证期全面跃迁至商业价值兑现期。全球头部企业不再聚焦于“能否生成”&#xff0c;而是系统性…...

象棋AI连线工具:VinXiangQi让深度学习为你下棋

象棋AI连线工具&#xff1a;VinXiangQi让深度学习为你下棋 【免费下载链接】VinXiangQi Xiangqi syncing tool based on Yolov5 / 基于Yolov5的中国象棋连线工具 项目地址: https://gitcode.com/gh_mirrors/vi/VinXiangQi 想在象棋对弈中获得职业级AI辅助吗&#xff1f;…...

实测Qwen3-TTS:上传10秒音频,AI帮你生成专属配音

实测Qwen3-TTS&#xff1a;上传10秒音频&#xff0c;AI帮你生成专属配音 1. 声音克隆技术的新突破 上周我尝试为一个儿童教育项目制作多语言版配音&#xff0c;传统方案需要聘请至少三位双语配音演员&#xff0c;预算超过2万元。当我用Qwen3-TTS-12Hz-1.7B-Base上传项目负责人…...