Please, consider to change NoTerminals comparsion code. AnsiCompareText do no work with Czech locale. For example IntProcHeading and intprocheading are different strings and AnsiCompareText do not return 0.This code work in Czech locale:
function TNoTerminals.IndexOf(IdS:string):integer;
begin
for result:=0 to Count-1 do
if AnsiLowerCase(TNoTerminal(Items[result]).IdS)=AnsiLowerCase(IdS) then Exit;
result:=-1;
end;
I don't understand how AnsiLowerCase works and AnsiCompareText is not. Both rely on low-level Windows API functions. Can you give some concrete example?
The only example you provided is not sure. The following code shows "0":
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(AnsiCompareText('IntProcHeading', 'intprocheading').ToString);
end;
No, this is misunderstanding what AnsiCompareText does. It calls CompareStringW from winapi ( Compares two character strings, for a locale specified by identifier.)
Comapreflags =NORM_IGNORECASE. And result in win api help: "The string indicated by lpString1 is equivalent in lexical value to the string indicated by lpString2."
This function is very locale specific and has nothing common with AnsiLowerCase or AnsiUpperCase.
For example:
-'IntProcHeading' and 'intprocheading' returns -1
-'IntProcheading' and 'intprocheading' returns 0
-'IntprocHeading' and 'intprocheading' returns -1
etc.
Do not use lexical functions in these comparsions.
Yes it's because my computer uses Czech Locale. I think it means something if there are three capital letter when sorting these foreign words. I do not know exactly reason, but Czech sorting rules are little weird in common.
Ok, thanks for the explanation. We have made the modification in the source code as you suggested, next version will include it. In the meanwhile you can of course keep using your modified code.