AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion 'Rückgängig' bei RichEdit?

Ein Thema von user64629 · begonnen am 30. Apr 2011 · letzter Beitrag vom 1. Mai 2011
Antwort Antwort
Seite 1 von 2  1 2      
user64629
(Gast)

n/a Beiträge
 
#1

Funktion 'Rückgängig' bei RichEdit?

  Alt 30. Apr 2011, 19:24
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
  Mit Zitat antworten Zitat
Culxxaw

Registriert seit: 21. Okt 2008
40 Beiträge
 
#2

AW: Funktion 'Rückgängig' bei RichEdit?

  Alt 30. Apr 2011, 20:14
Es gibt auch eine Undo-Funktion des Richedits. Die ist allerdings nicht allzu gut.

 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.
  Mit Zitat antworten Zitat
user64629
(Gast)

n/a Beiträge
 
#3

AW: Funktion 'Rückgängig' bei RichEdit?

  Alt 30. Apr 2011, 20:37
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??
  Mit Zitat antworten Zitat
Culxxaw

Registriert seit: 21. Okt 2008
40 Beiträge
 
#4

AW: Funktion 'Rückgängig' bei RichEdit?

  Alt 1. Mai 2011, 00:34
Nach ein Uhr im Delphi-Forum ... dass es mal so weit kommt

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  Ä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 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.
Angehängte Dateien
Dateityp: zip undo-test.zip (366,1 KB, 7x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Funktion 'Rückgängig' bei RichEdit?

  Alt 1. Mai 2011, 07:08
In einer Initialisierungsroutine würde ich sicherheitshalber 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.

Geändert von ConnorMcLeod ( 1. Mai 2011 um 07:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Funktion 'Rückgängig' bei RichEdit?

  Alt 1. Mai 2011, 08:48
Crossposts bitte künftig verlinken.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
user64629
(Gast)

n/a Beiträge
 
#7

AW: Funktion 'Rückgängig' bei RichEdit?

  Alt 1. Mai 2011, 11:01
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??
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Funktion 'Rückgängig' bei RichEdit?

  Alt 1. Mai 2011, 11:05
Was kommt denn bei
Zitat:
Length(Änderungen) - 2
heraus, wenn nur noch ein Element im Array vorhanden ist?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
user64629
(Gast)

n/a Beiträge
 
#9

AW: Funktion 'Rückgängig' bei RichEdit?

  Alt 1. Mai 2011, 11:21
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Funktion 'Rückgängig' bei RichEdit?

  Alt 1. Mai 2011, 11:39
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:36 Uhr.
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