نمی دونم آیا ()Ord کند بود یا نه ولی آخرش بیخیال اشاره گر شدم و به این شکل کار کرد:(Ch256 رو از یک شروع به مقدار دهی کردم که خرابکاری نشه)
Procedure ChangeChars(Var S:String);
Var
A,B:String;
I:Integer;
Ch256:String;
P1,P2:PChar;
begin
For I:=1 To 255 Do
Ch256:=Ch256+Chr(I);
A:=#65#97;//Aa
B:=#66#99;//Bc
For I:=1 To Length(A) Do
Ch256[Ord(A[I])]:=B[I];
P1:=PChar(S);
For I:=1 To Length(S) Do
S[I]:=Ch256[Byte(P1[I-1])];
end;
procedure TForm1.Button2Click(Sender: TObject);
Var
S:String;
begin
S:='Aa';
ChangeChars3(S);
ShowMessage(S);
end;


این 4 خط یک نتیجه رو میدند. فقط نمی دونم هنگام استفاده از Byte و اشاره گر PChar طول رشته تا چقدر میتونه باشه. چون ممکن هست رشته طولانی تر از 64 کیلو بایت هم داشته باشم و نمی دونم آیا همیشه یکسان هستند یا نه:
 
S[I]:=Ch256[Ord(S[I])];
S[I]:=Ch256[Byte(S[I])];
S[I]:=Ch256[Ord(P1[I-1])];
S[I]:=Ch256[Byte(P1[I-1])];