Nun so schwer sollte das nicht sein mit TMemo, folgendes Konzept würde ich vorschlagen:
Das Memo-Feld darf allerdings primär nur zur Anzeige des Textes und zur Feststellung der Cursor-Position verwendet werden.
Alle Eingaben in das Memofeld müssen umgeleitet werden in die Klasse, die alle verwendeten Textbausteine enthält.
Mal ein Gedankenkonstrukt für das Einfügen eines Zeichens (ungestestet und ohne Bereichsprüfung).
Weiterhin fehlt die Behandlung von DEL/BS und der Zwischenablage (Einsetzen, Ausschneiden).
Die anderen Methoden müssten natürlich noch ausprogrammiert werden
Delphi-Quellcode:
TTextSet = class
private
// Speicher auf die Memo-Referenz
FMemo : TMemo;
// Speicher für die Textbausteine
FParts : array of string;
protected
// Das Memofeld mit den Text-Inhalten füllen
procedure RefreshMemo;
public
// Das referenzierte Memo-Feld übergeben
property Memo : TMemo read FMemo write SetMemo;
// Ein Zeichen Key an der Stelle KeyPos einfügen
procedure AddKey( Key : Char; KeyPos : integer );
// einen Textbaustein verschieben
procedure MovePart( FromIndex, ToIndex : integer );
// Textbaustein hinzufügen
procedure AddPart( Index : integer; const PartText : string );
// Textbaustein entfernen
procedure DelPart( Index : integer );
end;
procedure TTextSet.AddKey( Key : Char; KeyPos : integer );
begin
// Textbaustein ermitteln
idx := Low( FParts );
tpos := 0;
while ( tpos + Length( FParts[ idx ] < KeyPos ) do
begin
Inc( tpos, Length( FParts[ idx ] ) );
Inc( idx );
end;
// Zeichen im Textbaustein einfügen
Insert( Key, FParts[ idx ], KeyPos - tpos );
// Das Memofeld aktualisieren
RefreshMemo;
// Den Cursor im Memo platzieren
Memo.SelStart := KeyPos + 1;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)