1

使用したDelphi: 2007

こんにちは、

いくつかの列があるリストビューがあります。特定の列を1つ並べ替えたい。アイテムは数字でも文字でもかまいません。

例

基本的に、順序は次のようになります:1-> 99、A-> Z、AA-> ZZ、AAA->ZZZ。インターネットでCustomSortコードを見つけて、それを変更しました。結果は次のとおりです(コードは大きくなりますが、重要なものだけを入れています):

function CustomSortProc(Item1, Item2: TListItem; SortColumn: Integer): Integer; stdcall;
var
 s1, s2: string;
 i1, i2: Integer;
 r1, r2: Boolean;

 function IsValidNumber(AString : string; var AInteger : Integer): Boolean;
 var
  Code: Integer;
 begin
  Val(AString, AInteger, Code);
  Result := (Code = 0);
 end;

 function CompareNumeric(AInt1, AInt2: Integer): Integer;
 begin
  if AInt1 > AInt2 then Result := 1 else
  if AInt1 = AInt2 then Result := 0 else Result := -1;
 end;

begin
 Result := 0;

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

 r1 := IsValidNumber(s1, i1);
 r2 := IsValidNumber(s2, i2);
 Result := ord(r1 or r2);
 if Result <> 0 then Result := CompareNumeric(i1, i2) else
 begin
  Result := Length(s1) - Length(s2);
  if Result = 0 then Result := lstrcmp(PChar(s1), PChar(s2));
 end;
end;

列の並べ替え方法は次のとおりです。

例

つまり、文字と数字は正しくソートされています。ただし、文字の前にすべての数字を入れることはできません。簡単なことだと思いますが、一生理解できません。

どうもありがとうございます。

4

1 に答える 1

1

1 つが文字列で 1 つが 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はないと思います。

于 2013-03-10T03:02:27.440 に答える