首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

TStringlist.sort 的CaseSensitive 是true或false,都是大小写不敏感。该如何处理

2013-08-04 
TStringlist.sort 的CaseSensitive 是true或false,都是大小写不敏感。procedure TForm1.Button1Click(Sende

TStringlist.sort 的CaseSensitive 是true或false,都是大小写不敏感。


procedure TForm1.Button1Click(Sender: TObject);
var St :TStringList;
begin
   St :=TStringList.Create;
  {Ascii编码:
   c 99
   C 67
   W 87
   AWSAccessKeyId 和Action,
   大小写不敏感,是Action前面,
   大小写敏感,  是AWSAccessKeyId前面。}
   
   St.Add('AWSAccessKeyId');
   St.Add('Action');

   St.CaseSensitive :=True; //true或false,比较结果,都是大小写不敏感,是否delphi的bug。
   //St.Sorted :=false;
   St.Sort;


   if 'AWSAccessKeyId' >'Action' then
        ShowMessage('AWSAccessKeyId 大')
   else ShowMessage('Action 大');


   ShowMessage(St.Strings[0] +' ' +St.Strings[1]);

   //显示为Action AWSAccessKeyId,说明大小写不敏感的。
   //而我要的是大小写敏感的。
end;

[解决办法]
看Sort的帮助:
Sort uses AnsiCompareStr to sort the strings when CaseSensitive is true and AnsiCompareText when CaseSensitive is false. 

AnsiCompareStr的帮助:
Most locales consider lowercase characters to be less than the corresponding uppercase characters.  This is in contrast to ASCII order, in which lowercase characters are greater than uppercase characters.  Thus, setting S1 to 'a' and S2 to 'A' causees AnsiCompareStr to return a value less than zero, while CompareStr, with the same arguments, returns a value greater than zero.

解决办法是自己从TStringList派生一个类,并覆盖CompareStrings方法(把AnsiCompareStr换成CompareString):
type
  TMyStringList = class(TStringList)
  protected


    function CompareStrings(const S1, S2: string): Integer; override;
  end;

{ TMyStringList }

function TMyStringList.CompareStrings(const S1, S2: string): Integer;
begin
  if CaseSensitive then
    Result := CompareStr(S1, S2)
  else
    Result := CompareText(S1, S2);
end;

procedure TForm1.Button1Click(Sender: TObject);
var St :TStringList;
begin
   St :=TMyStringList.Create;


   St.Add('AWSAccessKeyId');
   St.Add('Action');
   st.CaseSensitive := True;
   St.Sort;

    showmessage(st.Text);
    st.free;
end;

热点排行