Hallo,
kannst Du bitte mal die genauen Deklaration von a und Key angeben?
Eigentlich sollte das nämlich einfach so funktionieren, wenn a ein Pascal-String und keine Konstante ist. Das folgende Beispiel funktioniert:
procedure Test;
var
a:String;
key:Char;
begin
a := 'ABCDE';
key := a[1];
key := chr(ord(key)+1); // das macht das 'A' zu einem 'B'
a[1] := key;
ShowMessage(a);
end;
Hier funktioniert es aber NICHT, weil a eine Konstante ist:
procedure Test(const a:String);
var
key:Char;
begin
// a ist ja als Parameter schon übergeben
key := a[1];
key := chr(ord(key)+1); // das macht das 'A' zu einem 'B'
a[1] := key; // hier gibt's einen Fehler!
ShowMessage(a);
end;
Auch das funktioniert NICHT, weil a kein Pascal-String ist:
procedure Test;
var
a:stuck\_out\_tongue:Char;
key:Char;
begin
a := 'ABCDE';
key := a[1];
key := chr(ord(key)+1); // das macht das 'A' zu einem 'B'
a[1] := key; // hier gibt es eine Zugriffsverletzung
ShowMessage(a);
end;
Die Zugriffsverletzung wird letzlich dadurch verursacht, weil die Information ‚ABCDE‘ in Code-Segment gespeichert ist (wo man normal keine Zugriffsberechtigung hat) und nicht auf dem lokalen Heap. Das Problem ist einfach zu lösen, indem mit StrNew eine Kopie der Zeichenfolge auf dem Heap angelegt wird:
procedure Test;
var
a:stuck\_out\_tongue:Char;
key:Char;
begin
a := StrNew('ABCDE');
key := a[1];
key := chr(ord(key)+1); // das macht das 'A' zu einem 'B'
a[1] := key; // hier gibt es eine Zugriffsverletzung
ShowMessage(a);
StrDispose(a);
end;
Alles klar?
LG
Jochen