Autor Beitrag
hRb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Do 23.11.17 19:11 
Hallo
Habe mal wieder ein Problemchen. Ich möchte in einem Richedit-Objekt eine Funktion realisieren, die als Voraussetzung auf die zuletzt geänderte Zeile zurückgreifen muss, d.h. ich muss mir den Text merken (ZeilenNr genügt nicht, da Zeile gelöscht werden könnte). Da ich bei jeder Tasteneingabe die Zeilen- und Spaltenpos anzeige, war eine Überlegung das Richedit.modified-Byte zu "missbrauchen" (kommt bei Textmarkierung und Entf zu spät), wird auch für anderes benutzt (Close, geändert-Anzeige, etc).
Alternative: bei jeder Zeilenänderung die gesamte Zeile speichern (zeitlich etwas aufwändig).
Gibt es geeignete Ereignisse auf die man reagieren könnte?
Problem: beim Text Hinzufügen ist die Zeile nach der Änderung zu sichern, beim Löschen der Gesamtzeile (Markieren, Entf) muss die Zeile vorab gesichert werden.
Wer hat eine Idee?
mfg hRb
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 24.11.17 09:03 
Vorab:
Trag doch bitte deine Delphi-Version ins Profil ein. Manche Tipps hängen von der Delphi-Version ab.

Zum Thema:
Was willst du damit erreichen? Ich vermute eine Undo-Redo-Funktion. Dafür gibt es schon was. Das TRichEdit von Delphi kann das. Abhängig von der Version aber nur einen Schritt.
Alternativ kannst du das TJvRichEdit aus der Jedi-Sammlung nutzen. Dort gibt es sogar eine Property für das Undo-Limit.

Falls es doch um was anderes geht, beschreibe doch mal kurz dein Ziel.
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Fr 24.11.17 19:28 
Sorry - wenn dies wichtig ist, will ich Nachtragen: Ich arbeite derzeit mit Compiler Delphi 10 Berlin, und Nein, es geht nicht um eine Undo/Redo-Funktion.

Vielmehr nutzte ich früher einen Editor (nicht Mause-fähig), jedoch mit speziellen Eigenschaften, den ich in graphischer Oberfläche nachentwickelt habe. Dieser erlaubte u.a. mit einer Funktionstaste (F8 ) zeichenweise den Text der zuletzt geänderten Zeile in die aktuelle Zeile zu kopieren. Diese Funktion ist sehr elegant, wenn es sich um ähnliche, sich wiederholende Texte handelt. ein Text-Beispiel:
ausblenden Delphi-Quelltext
1:
2:
if i > n then Form1.StringGrid.Cells[0,0]:='Anton' else
if i < n then Form1.StringGrid.Cells[1,0]:='Berta';

Unabhängig, dass diese Befehlsfolge wenig Logik enthält, zeigt sich, dass die zweite Zeile schneller zu schreiben ist mit dieser "Kopierfunktion" als mit Markieren/ Copieren und danach die Änderungen vornehmen (bin ein wenig schreibfaul und so vermeidet man auch Fehler ).
Anmerkung: Damals gab es kein Undo/Redo und so war die Funktion auch ein Mittel, um versehentlich gelöschte Zeilen wieder herzustellen.
Vielleicht nutze ich einfach nur die OnChange-Funktion von Richedit und verzichte auf das Retten der Zeile bei Löschen mit der Maus, denn hierfür habe ich ja tascächlich das Undo/Redo. Ich sehe nur, dass z.B. der Delphi-Compiler die Zeile mit Blank auffüllt, wennn man deutlich hinter das letzte Zeichen der Zeile klickt, um beim Verlassen der Zeile diese (unnötigen) Blank wieder zu löschen.
Genau diese Ereignis (Verlassen der Zeile), verbunden mit einem gemerkten OnChange wäre m.E ideal zum Retten der Zeile in "ZeileOld". Derzeit speichere ich bei jeder Änderung die gesamte Zeile. Nicht gerade elegant, spielt aber bei heutiger Geschwindigkeit vielleicht nicht mehr so eine große Rolle. Hatte die Hoffnung, dass jemand weiß, wie man das Ereignis "Verlassen der Zeile" leicht erkennt.
hRb