Bewegen im TMemo Feld

In kleineren Delphi-Projekten verwende ich gern das TMemo-Feld als Mini-Editor. Für reine Texterfassung reicht das völlig aus. Aber jedesmal grüble ich wegen der Navigation. Also habe ich es hier aufgeschrieben.

Gestern habe ich mal wieder grübeln müssen, wie das mit der Navigation im TMemo-Feld war. Weil ich dafür aus z.T. fast schon antikem Quellcode meine einmal erarbeitete Methode kopiere, habe ich gestern rein interessehalber ein wenig gesucht und herumprobiert. Ab welcher Delphi-Version die gefundene Lösung funktioniert: Ich habe keine Ahnung. Aktuell habe ich XE7 und da funktioniert das wunderbar.

  • Einfügen von Clipbrd in die Uses-Klausel
  • Einfügen des nachfolgenden Codes zwischen das begin und end von OnKeyDowndes TMemo-Feldes
// Select All
   if (Key = Ord('A')) and (ssCtrl in Shift) then
   begin
     TMemo(Sender).SelectAll;  //  Bibliothek Clipbrd
     Key := 0;
   end;
// STRG Pos1 → Dokumentanfang
   if (Key = VK_Home) and (ssCtrl in Shift) then
   begin
     TMemo(Sender).SelStart := 0;
     TMemo(Sender).SelLength := 0;
     Key := 0;
   end;
// STRG End → Dokumentende
   if (Key = VK_End) and (ssCtrl in Shift) then
   begin
    TMemo(Sender).SelStart := Length(Memo1.Lines.Text);
    TMemo(Sender).SelLength   := 0;
    Key := 0;
   end;

// Wichtig: TMemo(Sender).CaretPos.x := ... → geht nicht, READ ONLY. Aber .CaretPos kann mit Point(x,y) beschrieben werden!

// Pos1 → Zeilenanfang
   if (Key = VK_Home) then
   begin
     TMemo(Sender).CaretPos := Point(0,TMemo(Sender).CaretPos.y);  // Zeilenposiiton auf 0 setzen
     TMemo(Sender).SelLength := 0;
     Key := 0;
   end;
// STRG End → Dokumentende
   if (Key = VK_End) and (ssCtrl in Shift) then
   begin
      TMemo(Sender).CaretPos := Point(TMemo(Sender).Lines[TMemo(Sender).CaretPos.y].Length-1,TMemo(Sender).CaretPos.y); //Zeilenposition auf Länge - 1 setzen
    TMemo(Sender).SelLength   := 0;
    Key := 0;
   end;

Damit verhält sich das TMemo wie ein normaler Editor, sogar das Markieren von aktueller Position zum Zeilen-/Dokumentanfang/-ende klappt, ebenso wie die Zwischenablage. Mehr braucht es häufig nicht.

Wie gesagt: Mit XE7 ausprobiert und für gut befunden. Die Quellen für einen Mini-Editor auf dieser Basis habe ich angehängt. Wobei der weder laden noch speichern noch sonst was kann. Aber darum ging es ja nicht.

Quellcode Demo TMemo-Editor(1,8 KiB)