Welbedankt voor de tips!
Na enig experimenteren kwam ik tot de volgende oplossing:
Code:
procedure TForm1.RichEdit1Change(Sender: TObject);
var TmpStr: string;
Corr: Integer;
begin
if AltKeyPressed then
begin
AltKeyPressed := false;
Corr := RichEdit1.ActiveLineNo; // CRLF is counted as 1 character in stead of 2
TmpStr := RichEdit1.Text; // get the messed up text
Delete(TmpStr, TmpSelStart + Corr + 1, RichEdit1.SelStart- TmpSelStart); // delete rubbish
Insert(TmpChar, TmpStr, TmpSelStart + Corr + 1); // insert last pressed character
RichEdit1.Text := TmpStr; // restore text
RichEdit1.SelStart := TmpSelStart + 1; // restore cursor position (+1 for the last pressed character)
end;
end;
procedure TForm1.RichEdit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = 18) then // the ALT key
begin
TmpSelStart := RichEdit1.SelStart;
AltKeyPressed := true;
end;
end;
procedure TForm1.RichEdit1KeyPress(Sender: TObject; var Key: Char);
begin
TmpChar := Key; // last pressed key
end;
begin
AltKeyPressed := false; // initialisation
end.
Bij het drukken van de ALT toets haal ik de waarde van RichEdit.SelStart op, en daarna, bij het drukken van een gewone toets haal ik opnieuw die waarde op en laat alles tussen de 2 waardes weg in RichEdit.Text.
Ik heb wel iets raars moeten doen voor het "nieuwe regel" teken: dat zijn 2 chars (CR en LF) maar SelStart telt dat maar voor 1 teken.
Hopelijk zitten hier geen addertjes meer onder het gras? Zijn er nog bv tekens die afwijkend geteld worden?
Bookmarks