Här är ett litet enkelt exempel på oändlig undo-redo funktion för en richedit komponent.
Snabbt ihopslängt men det fungerar, har man stora texter bör man fundera ut ett smartare sätt som inte kräver så mycket minne eller kanske begränsa sig till 10 steg undo eller nåt.
På formuläret ska det finns två knappar och en richedit. Glöm inte att länka eventen från formen, ska inte vara så svårt att få det att funka.
---------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
RichEdit1: TRichEdit;
Button1: TButton;
Button2: TButton;
procedure RichEdit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
Undo,Redo : TList;
implementation
{$R *.DFM}
procedure TForm1.RichEdit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var temp : TRichEdit;
begin
temp:=TRichEdit.Create(self);
temp.Text:=Richedit1.text;
Undo.Add(temp);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Undo:=TList.Create;
Redo:=TList.Create;
end;
procedure TForm1.Button2Click(Sender: TObject); // UNDO
var temp,temp2 : TRichEdit;
begin
If undo.count>0 then
begin
temp:=undo.items[undo.count-1];
// spara undan nuvarande text för "redo"
temp2:=TRichEdit.Create(self);
temp2.text:=richedit1.text;
redo.add(temp2);
// gör "undo" och radera ur listan
richedit1.text:=temp.text;
undo.delete(undo.count-1);
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var i : integer;
begin
// städa upp efter
For i:=undo.count-1 downto 0 do undo.Delete(undo.count-1);
For i:=redo.count-1 downto 0 do redo.Delete(redo.count-1);
Undo.Free;
Redo.Free;
end;
procedure TForm1.Button1Click(Sender: TObject); // REDO
var temp,temp2 : TRichEdit;
begin
If redo.count>0 then
begin
temp:=redo.items[redo.count-1];
// spara undan nuvarande text för "undo"
temp2:=TRichEdit.Create(self);
temp2.text:=richedit1.text;
undo.add(temp2);
// gör "undo" och radera ur listan
richedit1.text:=temp.text;
redo.delete(redo.count-1);
end;
end;
end.
---------------------------------------
Det finns säkert en massa andra bättre sätt att lösa det här på och med vanliga arrays går det inte att få oändlig undo.
Hoppas det hjälper...
------------------
-------------------
http://winne.home.dhs.org