Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting Delphi自定义数字和字母排序_Sorting_Delphi_Letters And Numbers - Fatal编程技术网

Sorting Delphi自定义数字和字母排序

Sorting Delphi自定义数字和字母排序,sorting,delphi,letters-and-numbers,Sorting,Delphi,Letters And Numbers,德尔福使用:2007 你好, 我有一个包含多个列的列表视图。我想对一个特定列进行排序。项目可以是数字或字母 基本上,顺序应该是:1->99,A->Z,AA->ZZ,AAA->ZZZ。我在网上找到了一些自定义排序代码,并对其进行了修改。结果如下(好吧,代码更大,但我只是把重要的放在这里): 函数CustomSortProc(Item1,Item2:TListItem;SortColumn:Integer):Integer;stdcall; 变量 s1,s2:字符串; i1,i2:整数; r1,r

德尔福使用:2007

你好,

我有一个包含多个列的列表视图。我想对一个特定列进行排序。项目可以是数字或字母

基本上,顺序应该是:1->99,A->Z,AA->ZZ,AAA->ZZZ。我在网上找到了一些自定义排序代码,并对其进行了修改。结果如下(好吧,代码更大,但我只是把重要的放在这里):

函数CustomSortProc(Item1,Item2:TListItem;SortColumn:Integer):Integer;stdcall;
变量
s1,s2:字符串;
i1,i2:整数;
r1,r2:布尔型;
函数IsValidNumber(AString:string;var-AInteger:Integer):布尔;
变量
代码:整数;
开始
Val(AString、AInteger、代码);
结果:=(代码=0);
结束;
函数CompareNumeric(AInt1,AInt2:Integer):整数;
开始
如果AInt1>AInt2,则结果:=1
如果AInt1=AInt2,则结果:=0,否则结果:=-1;
结束;
开始
结果:=0;
如果(第1项=无)或(第2项=无),则退出;
r1:=IsValidNumber(s1,i1);
r2:=IsValidNumber(s2,i2);
结果:=ord(r1或r2);
如果结果为0,则结果:=CompareNumeric(i1,i2)else
开始
结果:=长度(s1)-长度(s2);
如果结果=0,则结果:=lstrcmp(PChar(s1),PChar(s2));
结束;
结束;
下面是列的排序方式:

换句话说,字母和数字的排序是正确的。然而,我不能把所有的数字放在字母之前。我相信这很简单,但我一辈子都想不出来


非常感谢。

如果一个是字符串,一个是int,则val中字符串的值为0,因此它将在前面显示

if (Item1 = nil) or (Item2 = nil) then Exit;

 r1 := IsValidNumber(s1, i1);
 r2 := IsValidNumber(s2, i2);
 if (r1 and r2) then
   Result := CompareNumeric(i1, i2)
 else
   if r1 then 
     result := -1
   else
    if r2 then
      result := 1
    else
    begin
     Result := Length(s1) - Length(s2);
     if Result = 0 then 
       Result := lstrcmp(PChar(s1), PChar(s2));
    end;
end;

我想,机器上没有Dephi要检查。

如果一个是字符串,另一个是int,则val中的字符串值为0,因此它将在前面检查

if (Item1 = nil) or (Item2 = nil) then Exit;

 r1 := IsValidNumber(s1, i1);
 r2 := IsValidNumber(s2, i2);
 if (r1 and r2) then
   Result := CompareNumeric(i1, i2)
 else
   if r1 then 
     result := -1
   else
    if r2 then
      result := 1
    else
    begin
     Result := Length(s1) - Length(s2);
     if Result = 0 then 
       Result := lstrcmp(PChar(s1), PChar(s2));
    end;
end;

我想,没有德菲对机器进行检查。

PS val是旧的TRYSTROTINT会是更好的选择。你不必在PChar上纠缠不清,AnsiStringCompare或Samestr。非常感谢你的示例。正如David指出的,我的问题是ord线路。PS val是旧的TRYSTROTINT将是更好的选择。你不必在PChar上纠缠不清,AnsiStringCompare或Samestr。非常感谢你的示例。正如David指出的,我的问题是ord线路。太本地化了。请调试您自己的代码。因为它显然没有正确地排列数字和字母,所以假装它在比较每一个数字和字母。用铅笔和纸浏览代码,看看你的函数哪里出错了。考虑使用调试器。可能需要修复的唯一副本是结果:=ORD(R1或R2);这永远无法评估为-1我自己从未见过这种聪明的人有这样的价值。我从版本1开始就一直在做Delphi,我不得不考虑它在做什么,而不是你的意图。在代码中把它拼出来,编译器会处理它的冗长。太本地化了。请调试您自己的代码。因为它显然没有正确地排列数字和字母,所以假装它在比较每一个数字和字母。用铅笔和纸浏览代码,看看你的函数哪里出错了。考虑使用调试器。可能需要修复的唯一副本是结果:=ORD(R1或R2);这永远无法评估为-1我自己从未见过这种聪明的人有这样的价值。我从版本1开始就一直在做Delphi,我不得不考虑它在做什么,而不是你的意图。在代码中把它拼出来,编译器会处理它的冗长。