Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Memo mit Textobjekten gesucht

  Alt 23. Mai 2011, 02:05
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)
  Mit Zitat antworten Zitat