![]() |
Funktion 'Rückgängig' bei RichEdit?
Hallo,
ich habe eine Art Texteditor geschrieben, und will nun eine Funktion Rückgängig machen. Als Grundidee hatte ich gedacht, mache ich eineArray of TStrings und speichere im OnChange-Ereignis des RichEdits jede Änderung in einer neuen Variable von TStrings. Dann beim Klick auf den Button 'Rückgängig' soll die Letzte Version wiederhergestellt werden. Das Problem ist nur (zumindest denke ich das es das Problem ist), das beim wiederherstellen des alten Textes wieder das OnChange Ereignis wieder aufgerufen wird. Dann kommt Folgende Fehlermeldung: "nil kann nicht zu TRichEditStrings zugewiesen werden." Hat vielleicht jemand von euch eine Idee wie ich das umgehen kann? Ich poste mal den Quelltext:
Delphi-Quellcode:
Danke schonmal :)
var Änderungen: Array of TStrings;
Anzahl_Änderungen: Integer; procedure TEingabetext_Formular.EingabetextChange(Sender: TObject); begin Anzahl_Änderungen := Anzahl_Änderungen + 1; SetLength(Änderungen, Anzahl_Änderungen); Änderungen[Anzahl_Änderungen] := Eingabetext.Lines; end; procedure TEingabetext_Formular.RückgängigClick(Sender: TObject); begin Eingabetext.Lines.Clear; Anzahl_Änderungen := Anzahl_Änderungen - 1; Eingabetext.Lines := Änderungen[Anzahl_Änderungen]; SetLength(Änderungen, Anzahl_Änderungen); end; |
AW: Funktion 'Rückgängig' bei RichEdit?
Es gibt auch eine Undo-Funktion des Richedits. Die ist allerdings nicht allzu gut.
Delphi-Quellcode:
Die des TjvRichedits ist schon wesentlich besser.
RichEdit1.Undo;
Habs jetzt nur so schnell hingeschrieben. Falls du es mit deinem Ansatz machen willst probiers mal so (Hab die Umlaute ersetzt):
Delphi-Quellcode:
Du solltest generell noch abfragen, ob ein Rückgängig überhaupt möglich ist, sonst bekommst du eventuell eine Zugriffsverletzung.
var
changeoff:boolean; Aenderungen: Array of string; Anzahl_Aenderungen: Integer; procedure TEingabetext_Formular.RückgängigClick(Sender: TObject); begin changeoff := true; dec(Anzahl_Aenderungen); richedit1.Text := Aenderungen[Anzahl_Aenderungen-1]; SetLength(Aenderungen, Anzahl_Aenderungen); changeoff := false; end; procedure TEingabetext_Formular.EingabetextChange(Sender: TObject); begin if changeoff then exit; inc(Anzahl_Aenderungen); SetLength(Aenderungen, Anzahl_Aenderungen); Aenderungen[Anzahl_Aenderungen-1] := form1.richedit1.Text; end; |
AW: Funktion 'Rückgängig' bei RichEdit?
Hmm ich hab es etzt übernommen, aber die Fehlermeldung kommt immer noch.
Vielleicht eine Idee woran es liegen könnte? :) "nil kann nicht zu TRichEditStrings zugewiesen werden." Wird das vielleicht nicht ordentlich eingespeichert? Muss ich vielleicht eine andere Variable / ein anderes Array nehmen?? |
AW: Funktion 'Rückgängig' bei RichEdit?
Liste der Anhänge anzeigen (Anzahl: 1)
Nach ein Uhr im Delphi-Forum ... dass es mal so weit kommt :-D
Also ich bin jetzt zwar auch kein Delphi-Meister aber ich würde vermuten, dass der Fehler bei dir darin liegt dass du gar kein Create aufrufst. Sozusagen ist in
Delphi-Quellcode:
nichts (nil) drin.
Änderungen[Anzahl_Änderungen]
Naja so oder so ... "umgehen" kannst du es auf jeden Fall, wenn du, wie ich bereits erwähnte, aus dem Array ein
Delphi-Quellcode:
machst.
Array of String
Hab dir einfach mal mein Testprojekt drangehängt. Abschließend kann ich dir trotzdem nochmal die Jedi-Komponenten ans Herz legen. Die ersparen einem eine Menge Nerven, wenn du wirklich was mit Richedits machen willst. Dort gibt es bereits eine ausreichende Undo und natürlich auch Redo Funktion. Darüber hinaus kannst du ein Undo-Limit festlegen. |
AW: Funktion 'Rückgängig' bei RichEdit?
In einer Initialisierungsroutine würde ich sicherheitshalber
Delphi-Quellcode:
setzen.
Anzahl_Änderungen := 0;
In EingabetextChange passiert z.B.: Anzahl_Änderungen := 1; SetLength(Änderungen, 1); => das array hat ein Element, nämlich Änderungen[0] Änderungen[1] := 'blah'; => Bereichsfehler IMHO (ungetestet) müssen - die Zugriffe auf das array korrigiert werden (-1) - die array-Elemente mit Create erzeugt werden, weil sonst nur ein Pointer auf die Eingabetext.Lines im array steht Das Ganze passiert bei jedem Tastendruck! Schätze, dass bei einem längeren Text bald mal der Speicher knapp wird. Das array mit z.B. 20 Elementen zu begrenzen, fände ich sinnvoll. Man kann auch überlegen, nur die Differenz zu speichern anstatt des kompletten Textes. |
AW: Funktion 'Rückgängig' bei RichEdit?
![]() |
AW: Funktion 'Rückgängig' bei RichEdit?
Okay ich habe es jetzt soweit übernommen, aber an einer Stelle stürzt das trotzdem immer wieder ab:
wenn keine Zeichen mehr da sind und ich auf Rückgängig klicke...
Delphi-Quellcode:
Genau bei SetLength kommt die Fehlermeldung (ist ja auch logisch) aber das dürfte doch gar nicht mehr ausgeführt werden??
if Length(Änderungen) <> 0
then begin Eingabetext.Lines.Clear; Eingabetext.Lines.Text := Änderungen[Length(Änderungen) - 2]; SetLength(Änderungen, Length(Änderungen) - 1); end else Beep; |
AW: Funktion 'Rückgängig' bei RichEdit?
Was kommt denn bei
Zitat:
|
AW: Funktion 'Rückgängig' bei RichEdit?
Okay daran lag es -.- Hab nicht ganz nachgedacht.
Bei Length(Änderung) = 1 ist ja nur noch Änderung[0] da...
Delphi-Quellcode:
Jetzt klappt es einwandfrei danke ;-)
if Length(Änderungen) > 1
then begin Eingabetext.Lines.Clear; Eingabetext.Lines.Text := Änderungen[Length(Änderungen) - 2]; SetLength(Änderungen, Length(Änderungen) - 1); end |
AW: Funktion 'Rückgängig' bei RichEdit?
Auf diese Weise bekommst Du aber das letzte Array-Element nicht gelöscht. Wie wäre es so?
Delphi-Quellcode:
BTW: Wenn das Array Objekte enthalten sollte, musst Du diese noch freigeben, sonst hast Du ein feines Speicherleck produziert.
if Length(Änderungen) > 0
then begin Eingabetext.Lines.Clear; SetLength(Änderungen, Length(Änderungen) - 1); if Length(Änderungen) > 0 then Eingabetext.Lines.Text := Änderungen[High(Änderungen)]; end |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz