我正在使用以下代码:http://www.swissdelphicenter.ch/torry/showcode.php?id=1103 对我的TListView进行排序,除了带小数的数字之外,它对所有内容都有效。
所以我自己尝试这样做,并创建了一个名为的新自定义排序:
cssFloat
创建了一个新功能
function CompareFloat(AInt1, AInt2: extended): Integer;
begin
if AInt1 > AInt2 then Result := 1
else
if AInt1 = AInt2 then Result := 0
else
Result := -1;
end;
添加了case语句,告诉它列的类型。
cssFloat : begin
Result := CompareFloat(i2, i1);
end;
我更改了列单击事件,以便为列选择正确的类型。
cssFloat : begin
Result := CompareFloat(i2, i1);
end;
并且ListView排序类型当前设置为stBoth。
它没有正确排序。关于如何解决这个问题的想法?
谢谢
-Brad
答案 0 :(得分:0)
我修好了......经过3个小时的挣扎......不明白为什么......我终于看到了光.. CompareFloat问两个整数是否大于或小于彼此。
cssFloat : begin
r1 := IsValidFloat(s1, e1);
r2 := IsValidFloat(s2, e2);
Result := ord(r1 or r2);
if Result <> 0 then
Result := CompareFloat(e2, e1);
end;
(从EFG的Delphi网站复制和修改)
FUNCTION isValidFloat(CONST s: STRING; var e:extended): BOOLEAN;
BEGIN
RESULT := TRUE;
TRY
e:= StrToFloat(s)
EXCEPT
ON EConvertError DO begin e:=0; RESULT := FALSE; end;
END
END {isValidFloat};
答案 1 :(得分:0)
虽然我不知道你遇到的问题可能对你有用......
function CompareFloat(AStr1, AStr2: string): Integer;
const
_MAGIC = -1; //or ANY number IMPOSSIBLE to reach
var
nInt1, nInt2: extended;
begin
nInt1:=StrToFloatDef(AStr1, _MAGIC);
nInt2:=StrToFloatDef(AStr2, _MAGIC);
if nInt1 > nInt2 then Result := 1
else
if nInt1 = nInt2 then Result := 0
else
Result := -1;
end;
..和另一个片段(也许更好):
function CompareFloat(aInt1, aInt2: extended): integer;
begin
Result:=CompareValue(aInt1, aInt2); // :-) (see the Math unit) - also you can add a tolerance here (see the 'Epsilon' parameter)
end;
除了可能导致问题的舍入外,您还可以看到字符串和数字之间转换的格式设置(您知道,小数点,千位分隔符aso。) - 请参阅StringToFloat函数中的TFormatSettings结构。 (有两个 - 超载)。
HTH,