uses SysUtils;
const  S: PChar = 'A fUnNy StRiNg'
begin
  Canvas.TextOut(5, 10, string(StrLower(S)) + ' ' +   string(StrUpper(S)));end;
不要用strcopy来给赋值,
procedure TForm1.Button5Click(Sender: TObject);
var
  ps:PAnsiChar ;
begin
   ps:='ffffffffff';
     ShowMessage(string(StrUpper(ps)));
end;
这什么这两个都不能用?

解决方案 »

  1.   

    function StrUpper(Str: PChar): PChar;DescriptionStrUpper converts Str to uppercase and returns Str.Note: If the source string contains international characters, use AnsiStrUpper instead. If the source string is a Pascal string, use UpperCase (or AnsiUpperCase) instead.
      

  2.   

    的确,我在delphi6中也遇过,用StrUpper会报内存错,用AnsiUpperCase就没问题了
      

  3.   


    procedure TForm1.Button1Click(Sender: TObject);
    var
      pxxxxx: pchar;
      s: string;
      pttttt: PChar;
    begin
      pubs := 'fff';
      s := 'fff';  pxxxxx:= PChar(s);//  GetMem(pxxxxx, Length(s) + 1);
    //  ZeroMemory(pxxxxx, Length(S) + 1);
    //  StrCopy(@pxxxxx, @s);  pttttt := StrUpper(pxxxxx);  button1.Caption := pxxxxx;
      Caption := pttttt +  s;
    end;function StrUpper(Str: PChar): PChar; assembler;
    asm
            PUSH    ESI                                              ESI入栈
            MOV     ESI,Str                                   字符串地址存入ESI寄存中
            MOV     EDX,Str                                  。EDX寄存器中
    @@1:    LODSB                                         使ESI地址加一,可能相关的寄存器也有变化,比如AL取了第一个字符的值
            OR      AL,AL                                      可能是判断是否为空
            JE      @@2                                        如果上一步为空,跳出这个过程
            CMP     AL,'a'                                      比如第一个字符是否小于a
            JB      @@1                                        小于则回到@@1继续下一个字符
            CMP     AL,'z'                                       是否大于z
            JA      @@1                                        大于则跳到@@1
            SUB     AL,20H                            到此说明这个字符大于a小于z即为一个小写字母, 给这个字符-20H十进制为-32
            MOV     [ESI-1],AL                      把结果存回到ESI-1中(ESI在上面已经加了1了),在这一步出的错
            JMP     @@1                                跳回去
    @@2:    XCHG    EAX,EDX
            POP     ESI                                     ESI出栈
    end;
    的确,在MOV     [ESI-1],AL处会报错,如果使用GetMem给pxxxxx分配内在了,或者使用窗体级变量pubs就不会报错