Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Funktion 'Rückgängig' bei RichEdit? (https://www.delphipraxis.net/160173-funktion-rueckgaengig-bei-richedit.html)

user64629 30. Apr 2011 19:24

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:
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;
Danke schonmal :)

Culxxaw 30. Apr 2011 20:14

AW: Funktion 'Rückgängig' bei RichEdit?
 
Es gibt auch eine Undo-Funktion des Richedits. Die ist allerdings nicht allzu gut.

Delphi-Quellcode:
 RichEdit1.Undo;
Die des TjvRichedits ist schon wesentlich besser.

Habs jetzt nur so schnell hingeschrieben. Falls du es mit deinem Ansatz machen willst probiers mal so (Hab die Umlaute ersetzt):
Delphi-Quellcode:
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;
Du solltest generell noch abfragen, ob ein Rückgängig überhaupt möglich ist, sonst bekommst du eventuell eine Zugriffsverletzung.

user64629 30. Apr 2011 20:37

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??

Culxxaw 1. Mai 2011 00:34

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:
 Änderungen[Anzahl_Änderungen]
nichts (nil) drin.

Naja so oder so ... "umgehen" kannst du es auf jeden Fall, wenn du, wie ich bereits erwähnte, aus dem Array ein
Delphi-Quellcode:
Array of String
machst.

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.

ConnorMcLeod 1. Mai 2011 07:08

AW: Funktion 'Rückgängig' bei RichEdit?
 
In einer Initialisierungsroutine würde ich sicherheitshalber
Delphi-Quellcode:
Anzahl_Änderungen := 0;
setzen.

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.

DeddyH 1. Mai 2011 08:48

AW: Funktion 'Rückgängig' bei RichEdit?
 
Crossposts bitte künftig verlinken.

user64629 1. Mai 2011 11:01

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:
 if Length(Änderungen) <> 0
    then begin
          Eingabetext.Lines.Clear;
          Eingabetext.Lines.Text := Änderungen[Length(Änderungen) - 2];
          SetLength(Änderungen, Length(Änderungen) - 1);
         end
    else Beep;
Genau bei SetLength kommt die Fehlermeldung (ist ja auch logisch) aber das dürfte doch gar nicht mehr ausgeführt werden??

DeddyH 1. Mai 2011 11:05

AW: Funktion 'Rückgängig' bei RichEdit?
 
Was kommt denn bei
Zitat:

Delphi-Quellcode:
Length(Änderungen) - 2

heraus, wenn nur noch ein Element im Array vorhanden ist?

user64629 1. Mai 2011 11:21

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:
 if Length(Änderungen) > 1
    then begin
          Eingabetext.Lines.Clear;
          Eingabetext.Lines.Text := Änderungen[Length(Änderungen) - 2];
          SetLength(Änderungen, Length(Änderungen) - 1);
         end
Jetzt klappt es einwandfrei danke ;-)

DeddyH 1. Mai 2011 11:39

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:
 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
BTW: Wenn das Array Objekte enthalten sollte, musst Du diese noch freigeben, sonst hast Du ein feines Speicherleck produziert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:31 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz