近日,在编制一个程序过程,因为数据量较小,就使用了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的自定义排序(将函数地址做为参数)的更多相关文章

  1. Delphi中stringlist分割字符串的用法

    Delphi中stringlist分割字符串的用法 TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 1.CommaT ...

  2. Java中list集合自定义排序-2022新项目

    一.业务场景 为了加快首页数据查询的效率,因此将首页查询的数据大多数都放在了缓存中,包括各种list集合数据.对这些 从缓存中获取的数据做了一个兜底处理,如果从缓存中没有获取到数据,则直接从数据库中去 ...

  3. Delphi 中的 procedure of object (类方法存在一个隐藏参数self),简单深刻 good

    其实要了解这些东西,适当的学些反汇编,WINDOWS内存管理机制,PE结构,看下李维的VCL架构剖析可以很好理解type TMyEvent = procedure of object;这是一种数据类型 ...

  4. Java中Collections类的排序sort函数两种用法

    java中的Colletions类主要实现列表List的排序功能.根据函数参数的传递,具体的排序可以分为 : 1.  自然排序(natural ordering). 函数原型:sort(List< ...

  5. js中对象的自定义排序

    //并返回一个可以用来对包含该成员的对象数组进行排序的比较函数 var compareAsc = function (prop) { return function (obj1, obj2) { va ...

  6. Delphi中返回类型为string的函数的一个陷阱(不是很懂)

    如果类的一个成员函数的返回值是string类型,需要注意一个问题 其返回值可能是错误的 例如函数的实现如下 function GetString( s: string ): string;begin  ...

  7. 用于string对象中字符截取的几种函数总结——语法、参数意义及用途举例

    1. charAt():返回指定位置的字符. 语法:stringObject.charAt(index) 参数意义:index  必需,指字符在字符串中的下标.需要注意的是,字符串中第一个字符的下标是 ...

  8. Lucene 中自定义排序的实现

    使用Lucene来搜索内容,搜索结果的显示顺序当然是比较重要的.Lucene中Build-in的几个排序定义在大多数情况下是不适合我们使用的.要适合自己的应用程序的场景,就只能自定义排序功能,本节我们 ...

  9. [教程]Delphi 中三种回调函数形式解析

    Delphi 支持三种形式的回调函数 全局函数这种方式几乎是所有的语言都支持的,类的静态函数也可以归为此类,它保存的只是一个函数的代码起始地址指针( Pointer ).在 Delphi 中声明一般为 ...

  10. Delphi中的Free和Nil和freeandnil函数

    Delphi中的Free和Nil 在Delphi中释放对象资源时一般用Obj.Free(Obj为一个实例名),不过程Delphi中还有一个FreeAndNil(对象名)函数,那么用哪个好呢?Free和 ...

随机推荐

  1. [NOI Online 提高组]冒泡排序

    题目 洛谷等许多 \(OJ\) 都有 思路 考试题,今日无意又做了一次 然后发现自己读错题了······ 其实询问时只要 \(k\) 轮排序后的逆序对个数并不需要真的对序列进行更改 很显然 \(k\) ...

  2. 深入理解跳表及其在Redis中的应用

    前言 跳表可以达到和红黑树一样的时间复杂度 O(logN),且实现简单,Redis 中的有序集合对象的底层数据结构就使用了跳表.其作者威廉·普评价:跳跃链表是在很多应用中有可能替代平衡树的一种数据结构 ...

  3. 从零实现在线云相亲APP|程序员脱单神器(内附源码Demo)

    实时音视频通话涉及到的技术栈.人力成本.硬件成本非常大,一般个人开发者基本无法独立完成一个功能健全并且稳定的实时音视频应用.本文介绍一天之内,无任何实时音视频低层技术的android开发者完成实时相亲 ...

  4. [EULAR文摘] TNFi治疗3年对384例强柱患者脊柱放射学进展的影响

    TNF拮抗剂治疗3年对384例强直性脊柱炎患者脊柱放射学进展的影响 Maksymowych WP, et al. EULAR 2015. Present ID: OP0144. 背景: 既往开放标签的 ...

  5. asp汉字转拼音小写

    <%'//获取汉字的首字母 ,ANSII编码function getpychar(char) dim tmpp:tmpp=65536+asc(char) if(tmpp>=45217 an ...

  6. USACO2023Jan游记

    由于学校要求,过来打 USACO. 似乎要求起码升到白金? 由于是第一次打,只有从铜组开始了. Brouze 简单题,就给核心代码. 30min AK. Leaders http://usaco.or ...

  7. gateway添加跨域配置

    import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Co ...

  8. 【MySQL】导出到CSV

    http://www.yiidian.com/mysql/mysql-export-table-to-cvs.html 要将表导出为 CSV 文件,我们将使用SELECT INTO....OUTFIL ...

  9. 对称加密、非对称加密 与 HTTPS

    一.对称加密(Symmetric Cryptography)对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key). ...

  10. web上传插件Uploadify

    Uploadify简单说来,是基于Jquery的一款文件上传插件.它的功能特色总结如下: 支持单文件或多文件上传,可控制并发上传的文件数 在服务器端支持各种语言与之配合使用,诸如PHP,.NET,Ja ...