onKeyDown /Press: Key an String Var übergeben

Hallo,
die variable a soll den druck der lezten Taste entsprechen.
Aber so funktionierts nicht ganz:

procedure TForm1.Form1KeyDown(Sender: TObject; var Key: Word; Shift:TShiftState);
begin
a:=(key);
showmessage(a); //Wird später entfernt, dient nur zur Kontrolle
end;

Gibts auch einen Weg, dass bei druck ‚Shift+b‘ die Variable ‚a=B‘ ist und nicht ‚=b‘ ???

Huhu,

schonmal das Ereignis „OnKeyPress“ probiert?

LG
Jochen

Ja, hab ich grade ausprobiert.
nun hab ich das nächste Problem.
mit
Key:=a[1]; Wandel ich das erste Zeichen von a in eine Char-Variable und setze ‚Key‘ gleich der selben.

Aber umgekehrt funktioniert es nicht!(a[1]:=Key:wink:Warum nicht???
Es gibt tausende von Tutorails im Netz um String in Char zu wandeln.
Aber keinen einzigen (für Pascal) der halbwegs verständlich ist (für c++ gibts viele).

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