Delphi中Stringlist的自定义排序(将函数地址做为参数)
近日,在编制一个程序过程,因为数据量较小,就使用了stringlist来暂存数据。在使用过程中,遇到了一个问题。Stringlist字符串列表的默认排序方法是按ASCII码的方式进行排序,如3,10,9排序时,结果为10,3,9.不符合程序的要求,于是尝试着使用字符串列表的自主义排序方法,这时需要传入一个function类的参数,因为习惯于使用PYTHON语言,所以直接编写民了一个按数值降序排列的排序函数,并将函数名传给了stringlistrr的CustomSort方法,结果提示:Incompatible types: 'regular procedure and method pointer'。大致意思是:不匹配的类型:需要一个方法、过程的指针类型。
为了解决这个问题,到网上查找资料,发现这个问题经常会遇到,但是各个解答要不就是看不懂,要不就是运行不成功,经过多次尝试,最终解决了这个问题。
通过分析源代码,结合网上程序,理清了网上的解决思路:1、在type处,定义一个function类型,.如:Tfunc=function(list: TStringList; index1,index2: Integer): Integer; 2、定义一个全局变量:如:myfunc:Tfunc;
3、编写一个自定义的排序程序:如以下程序
function curmsort(list: TStringList; index1,
index2: Integer): Integer;
var
value1, value2: Integer;
begin
value1 := StrToInt(list.Strings[index1]);
value2 := StrToInt(list.Strings[index2]);
if value1> value2 then
Result := -1
else if value1< value2 then
Result := 1
else
Result := 0;
end;
4、在排序时,首先执行myfunc:=curmsort;(将自定义的函数名赋值给myfunc变量。)list.sorted:=False;,关闭排序,然后执行list.CustomSort(myfunc);
按照这个思路,最终也完成了自定义排序(将函数地址传参)的功能。
完成后,回顾整个程序,通过对比、思考、实验,发现第一、二步和最后一步的将函数名赋值给函数类型的变量都是可以省略的,关键的是自己定义的排序函数curmsort不能进行声明,只要声明了就不好使,个人感觉应该是因为在不声明的情况下,函数名仅代表的是函数的内存地址,而不是执行函数的返回值。前边的失败是因为将函数进行了声明,这时函数名代表了函数执行后的返回值,所以才导致类型不匹配。
例程如下:
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type TForm1 = class(TForm)
lst1: TListBox;
lst2: TListBox;
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
//注意,自定义的函数curmsort不能进行声明。
{ Private declarations }
public
{ Public declarations }
end; var Form1: TForm1; implementation {$R *.dfm}
function curmsort(list: TStringList; index1,
index2: Integer): Integer; //写函数时,函数名前不能加Tform1等限制。
var
value1, value2: Integer;
begin
value1 := StrToInt(list.Strings[index1]);
value2 := StrToInt(list.Strings[index2]);
if value1> value2 then
Result := -1
else if value1< value2 then
Result := 1
else
Result := 0;
end; procedure TForm1.btn1Click(Sender: TObject);
var list:TStringList;i:Integer;
begin
list:=TStringList.Create;
for i:=0 to 30 do
begin
list.Add(IntToStr(Random(3000)));
end;
lst1.Items.Assign(list); list.Sorted:=False;
list.CustomSort(curmsort);
lst2.Items.Assign(list);
end; end.
Delphi中Stringlist的自定义排序(将函数地址做为参数)的更多相关文章
- Delphi中stringlist分割字符串的用法
Delphi中stringlist分割字符串的用法 TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 1.CommaT ...
- Java中list集合自定义排序-2022新项目
一.业务场景 为了加快首页数据查询的效率,因此将首页查询的数据大多数都放在了缓存中,包括各种list集合数据.对这些 从缓存中获取的数据做了一个兜底处理,如果从缓存中没有获取到数据,则直接从数据库中去 ...
- Delphi 中的 procedure of object (类方法存在一个隐藏参数self),简单深刻 good
其实要了解这些东西,适当的学些反汇编,WINDOWS内存管理机制,PE结构,看下李维的VCL架构剖析可以很好理解type TMyEvent = procedure of object;这是一种数据类型 ...
- Java中Collections类的排序sort函数两种用法
java中的Colletions类主要实现列表List的排序功能.根据函数参数的传递,具体的排序可以分为 : 1. 自然排序(natural ordering). 函数原型:sort(List< ...
- js中对象的自定义排序
//并返回一个可以用来对包含该成员的对象数组进行排序的比较函数 var compareAsc = function (prop) { return function (obj1, obj2) { va ...
- Delphi中返回类型为string的函数的一个陷阱(不是很懂)
如果类的一个成员函数的返回值是string类型,需要注意一个问题 其返回值可能是错误的 例如函数的实现如下 function GetString( s: string ): string;begin ...
- 用于string对象中字符截取的几种函数总结——语法、参数意义及用途举例
1. charAt():返回指定位置的字符. 语法:stringObject.charAt(index) 参数意义:index 必需,指字符在字符串中的下标.需要注意的是,字符串中第一个字符的下标是 ...
- Lucene 中自定义排序的实现
使用Lucene来搜索内容,搜索结果的显示顺序当然是比较重要的.Lucene中Build-in的几个排序定义在大多数情况下是不适合我们使用的.要适合自己的应用程序的场景,就只能自定义排序功能,本节我们 ...
- [教程]Delphi 中三种回调函数形式解析
Delphi 支持三种形式的回调函数 全局函数这种方式几乎是所有的语言都支持的,类的静态函数也可以归为此类,它保存的只是一个函数的代码起始地址指针( Pointer ).在 Delphi 中声明一般为 ...
- Delphi中的Free和Nil和freeandnil函数
Delphi中的Free和Nil 在Delphi中释放对象资源时一般用Obj.Free(Obj为一个实例名),不过程Delphi中还有一个FreeAndNil(对象名)函数,那么用哪个好呢?Free和 ...
随机推荐
- NuGet私有服务器ProGet Docker搭建和公司中实战用法
一.什么时候需要用到NuGet私有服务器 很多公司中架构师会搭建一个统一的项目基础架构模板,然后全部新项目都会拿这个基础架构来开发新的项目,那架构中就会有很多的中间件,比喻公司内部的封装好的Redis ...
- JZOJ 排列统计
排列统计 \(Description\) 对于给定的一个长度为n的序列{B[n]},问有多少个序列{A[n]}对于所有的i满足:A[1]-A[i]这i个数字中有恰好B[i]个数字小等于i.其中{A[n ...
- 单例 Bean 的线程安全问题
最近面试遇到一个问题:单例 Bean 的线程安全问题怎么解决的. 之前了解但是没有深究它的解决方法.大部分时候我们并没有在项目中使用多线程,所以很少有人会关注这个问题. 大部分 Bean 实际都是无状 ...
- 题解 P1627 [CQOI2009] 中位数
傻逼题但是被自己的傻逼操作爆了好几次零(悲愤 .... 没什么好讲的,一眼题... //SIXIANG #include <iostream> #define int long long ...
- Spring注解补充(一)
注解补充 挑一些常用,但是深入不多的总结一下. Bean的声明周期 在@Bean注解中,添加init属性和destroy属性 @Bean(initMethod = "initMethod&q ...
- MySQL索引的基本理解
之前一致以为索引就是简单的在原表的数据上加了一些编号,让查询更加快捷.后来发现里面还有更深的知识. 索引用于快速查找具有特定列值的行.如果没有索引,MySQL 必须从第一行开始,然后通读整个表以找到相 ...
- Leaflet 调用腾讯瓦片地图服务demo
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" ...
- 封装avalonia指定组件允许拖动的工具类
封装avalonia指定组件允许拖动的工具类 创建Avalonia的MVVM项目,命名DragDemo ,然后将项目的Nuget包更新到预览版 <ItemGroup> <Packag ...
- 干货!超实用的 Linux 初始化脚本
咸鱼今天给大家分享一个无论是学习还是工作中都很实用的 Linux 系统初始化脚本,其实就是各种命令的集合 完整代码在文章最后哦 定义相关变量 配置 yum 镜像源 获取阿里云 yum 镜像源 判断 ...
- 个人常用的git提交代码流程
# 增加⼀一个新的远程仓库,并命名git remote add [shortname] [url] # 新建一个本地目录,将其初始化为 Git 代码库$ git init [project-name] ...