在Edit中有一行汉字:中华人民共和国。我想把它逆序显示成:国和共民人华中。怎么做呢?
注意:是汉字,不是英文和数字。

解决方案 »

  1.   

    function CnReverseString(const AText: string): string;
    var
      I: Integer;
      P: PChar;
    begin
      SetLength(Result, Length(AText));
      P := PChar(Result);
      I := Length(AText)-1;
      while I > 0 do
      begin
        P^ := AText[I];
        Inc(P);
        P^ := AText[I+1];
        Inc(P);
        Dec(I, 2);
      end;
    end;
      

  2.   

    function FindSubDBCS(const {in}str:WideString;{in,out}var iStart:Integer;{out}var iLength:Integer):Boolean;
      var i,o:Integer;
      begin
        o:=iStart;
        while iStart<Length(str) do
        begin
          if Word(str[iStart])>$100 then break;
            Inc(iStart);
        end;
        i:=iStart;
        Result:=False;
        while i<Length(str) do
        begin
          if Word(str[i])<$100 then
            break;
          Inc(i);
          Result:=True;
        end;
        if not Result then
        begin
          iLength:=0;
          iStart:=o;
        end
        else
          iLength:=i-iStart+1;
      end;
      procedure RevStr(var str:WideString;iStart,iLength:Integer);
      var i:Integer;c:WideChar;
      begin
        for i := 0 to (iLength -1) div 2 do
        begin
          c:=str[iStart+i];
          str[iStart+i]:=str[iStart+iLength-i-1];
          str[iStart+iLength-i-1]:=c;
        end;
      end;
      function RevDBCS(str:WideString):WideString;
      var iStart,iLength:Integer;
      begin
        iStart:=1;
        while FindSubDBCS(str,iStart,iLength) do
        begin
          RevStr(str,iStart,ilength);
          Inc(iStart,iLength);
        end;
        Result:=str;
      end;
    使用RevDBCS
      

  3.   

    这个如楼主所说,只对汉字进行反序。而不是全部,全部反序Delphi有代码输入:abcd中华人民共和国efg中华人民共和国
    输出:abcde国和共民人华中fg国和共民人华中全部反序也不用如一楼那样,直接调用StrUtils.ReverseString就可以了
      

  4.   

    请区别,字母与数字请用ReverseString函数(uses StrUtils; ),汉字用1楼liangqingzhi(老之)的方法即可。
      

  5.   

    function ReversewString(const AText: WideString): WideString;
    var
      I: Integer;
      p : PWideChar ;
    begin
      SetLength(Result, Length(AText));
      P := PWideChar(Result);
      for I := Length(AText) downto 1 do
      begin
        P^ := AText[I];
        Inc(P);
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      a : WideString;
    begin
       edit1.Text := '中华人民共和国';
       a := Edit1.Text;Edit1.Text := ReversewString(a);
    end;
      

  6.   

    谢谢liangqingzhi(老之)和wudi_1982(︻┳═一):
    …………
      for I := Length(AText) downto 1 do
      begin
        P^ := AText[I];
        Inc(P);
      end;
    …………
    其中Inc(P)是什么意思?每循环一次就增加p个???。我想应该是从最后一个汉字开始,每循环一次就去掉一个汉字吧。不好意思,没看明白你的思路,能说一下你的算法步骤吗?还有lexchou(龍子龍孫)(本人已死)(有事烧纸)以及各位!
      

  7.   

    Inc是使指针向后移动,整个思路就是用循环将字符串后面的字符两个两个地移到前面来。代码改自StrUtils单元的ReverseString函数。
      

  8.   

    function ReverseWideString(const AText: Widestring): WideString;
    var
      I: Integer;
      P: PWideChar;
    begin
      SetLength(Result, Length(AText));
      P := PWideChar(Result);
      for I := Length(AText) downto 1 do
      begin
        P^ := AText[I];
        Inc(P);
      end;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    //
      ShowMessage(ReverseWideString(Edit1.Text));
    end;
      

  9.   

    inc(a:integer)与dec(a:integer)当应用于指针时,是将当前的地址移位a*sizeof(指针所代表数据类型)个大小1个WideChar=2个Char大小
    汉字是占2个char的大小,要想不出现半个汉字,是要靠WideChar来决定移位的,所以在上述中使用了WideChar
      

  10.   

    谢谢!I see.
    结帖,给分!