我们已经知道, ListBox的Sorted属性设置为True,会对列表内容自动排序。但我发现它的排序规则有时可能并不适用,它在排序比较串大小时,减号会被忽略。如下面的顺序
PC.20200312EGW
PC.20200312SFW
PC-20190312SFW
PC---20190612SFW
PC20200312SFW
PC20200312SGW
PC-20210312SFW
和我们的平常的排序规则不一致,会给用户造成困扰。
解决办法也不难,不要使用它的Sorted属性,在新增加一行时按自己的比较规则主动找到它应该插入的位置,保证内容的正确顺序。C++代码如下:
int SortedStringsIndexOf(TStrings *Strs, String S) // 已排序的TStrings查找行,如果找不到,要找到应插入的位置
{
int iStart, iEnd, iCenter;
int iComp, iResult;
String TmpS;
iStart = 0;
iEnd = Strs->Count - 1;
iResult = 0;
while (iStart <= iEnd)
{
iCenter = (iStart + iEnd) / 2;
TmpS = Strs->Strings[iCenter];
iComp = StrComp(&S[1], &TmpS[1]);
if (iComp == 0)
return iCenter; // 找到了,返回索引
else if (iComp < 0)
{
iEnd = iCenter-1;
iResult = iCenter; // 记录可能的插入位置