Autor Beitrag
ehemaliger Nutzer
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 30.04.11 21:30 
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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
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 :)

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Okay ich hab eine Boolean Variable eingeführt (hätte ich vorher drauf kommen müssen >.<) :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
var Änderungen: Array of TStrings;
    Anzahl_Änderungen: Integer;
    Abbrechen: Boolean
procedure TEingabetext_Formular.EingabetextChange(Sender: TObject);
begin
 if Abbrechen = False
    then begin
          Anzahl_Änderungen := Anzahl_Änderungen + 1;
          SetLength(Änderungen, Anzahl_Änderungen);
          Änderungen[Anzahl_Änderungen] := Eingabetext.Lines;
         end;
end;
procedure TEingabetext_Formular.RückgängigClick(Sender: TObject);
begin
 Abbrechen := True;
 Eingabetext.Lines.Clear;
 Anzahl_Änderungen := Anzahl_Änderungen - 1;
 Eingabetext.Lines := Änderungen[Anzahl_Änderungen - 1];
 SetLength(Änderungen, Anzahl_Änderungen);
 Abbrechen := False;
end;


Allerdings erscheint immer noch die gleiche Fehlermeldung, vielleicht jemand eine Idee woran das 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??
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 30.04.11 23:09 
Moin!

"Wieviel" Undo willst du denn haben? Schonmal in der laufenden Anwendung Strg+Z gedrückt nach einer Änderung am RichtEdit? Das kannst du auch im Code mit der Methode .Undo machen. :idea:

Wenn du "mehr" rückgängig machen möchtest, dann musst du allerdings die Änderungen verfolgen. :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
HenryHux
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Sa 30.04.11 23:26 
Du könntest zum Beispiel bei jedem x-ten OnChange Event den Text in einem Array speichern und beim Rückgängig machen halt immer den vorherigen aufrufen.
Dazu kannst du dann auch noch schön passend eine Wiederherstellen-Funktion einbauen.

Viel Glück,

lg
ehemaliger Nutzer
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 30.04.11 23:47 
Okay aber selbst wenn ich bei jedem X-ten OnChange Event den Text speichere, wird das dann doch so aussehen wie oben der Quelltext oder?
Dann hätte ich wieder die Fehlermeldung wie oben... Weißt denn einer was an dem Code an sich falsch ist?
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 01.05.11 00:46 
Moin!

ehemaliger Nutzer hat folgendes geschrieben Zum zitierten Posting springen:
Weißt denn einer was an dem Code an sich falsch ist?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var Änderungen: Array of TStrings;
    Anzahl_Änderungen: Integer;
    Abbrechen: Boolean = False;

procedure TEingabetext_Formular.EingabetextChange(Sender: TObject);
begin
 if NOT Abbrechen
    then begin
          Anzahl_Änderungen := Anzahl_Änderungen + 1;
          SetLength(Änderungen, Anzahl_Änderungen);
          Änderungen[Anzahl_Änderungen] := Eingabetext.Lines;
         end;
end;
Ich würde dir allerdings empfehlen nicht alle Variablen global zu deklarieren. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
ehemaliger Nutzer
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 01.05.11 12:07 
Okay ich habe es jetzt mit einem Array of String gemacht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
var Abbrechen: Boolean;
    Änderungen: Array of String;

procedure TEingabetext_Formular.FormCreate(Sender: TObject);
begin
 Eingabetext_Formular.Eingabetext.OnChange(nil);
end;

procedure TEingabetext_Formular.EingabetextChange(Sender: TObject);
begin
 if Abbrechen = False
    then begin
          SetLength(Änderungen, Length(Änderungen) + 1);
          Änderungen[Length(Änderungen) - 1] := Eingabetext.Text;
         end;
end;

procedure TEingabetext_Formular.RückgängigClick(Sender: TObject);
begin
 Abbrechen := True;
 if Length(Änderungen) <> 0
    then begin
          Eingabetext.Lines.Clear;
          Eingabetext.Lines.Text := Änderungen[Length(Änderungen) - 2];
          SetLength(Änderungen, Length(Änderungen) - 1);
         end
    else Beep;
 Abbrechen := False;
end;

Allerding stürzt es immer an der Stelle ab, wenn keine Zeichen mehr da sind, und ich nochmal auf Rückgängig klicke: Genau in der Zeile SetLength (ist ja irgendwie logisch, dass es da abstürzt...) Aber das dürfte dann doch nicht mehr ausgeführt werden??

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Okay hab den Fehler gefunden: Bei Length(Änderung) = 1 ist ja nur noch Änderung[0] da ...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
 if Length(Änderungen) > 1
    then begin
          Eingabetext.Lines.Clear;
          Eingabetext.Lines.Text := Änderungen[Length(Änderungen) - 2];
          SetLength(Änderungen, Length(Änderungen) - 1);
         end
    else Beep;