5 uses System.Contnrs, System.Classes, Vcl.StdCtrls;
13 procedure Execute; virtual; abstract;
16 TUnInput = class(TUndoBase)
20 procedure Execute; override;
23 TUnDelete = class(TUndoBase)
28 procedure Execute; override;
31 TUnPaste = class(TUndoBase)
35 procedure Execute; override;
38 TUndoClass = class(TComponent)
43 function GetCanUndo: Boolean;
46 constructor Create(AOwner: TComponent); override;
47 procedure Deleted(const str: string; pos: integer; top: Boolean);
48 procedure Inputted(c: Char; pos: integer);
49 procedure Pasted(const str: string; pos: integer);
51 destructor Destroy; override;
55 property Memo: TCustomMemo read FMemo write FMemo;
56 property CanUndo: Boolean read GetCanUndo;
63 procedure TUndoClass.Clear;
67 for i := 0 to FStack.Count - 1 do
71 constructor TUndoClass.Create(AOwner: TComponent);
74 FStack := TObjectStack.Create;
77 procedure TUndoClass.Deleted(const str: string; pos: integer; top: Boolean);
81 obj := TUnDelete.Create;
89 destructor TUndoClass.Destroy;
96 procedure TUndoClass.Execute;
100 if FStack.Count > 0 then
102 obj := FStack.Pop as TUndoBase;
108 function TUndoClass.GetCanUndo: Boolean;
110 result := FStack.Count > 0;
113 procedure TUndoClass.Inputted(c: Char; pos: integer);
117 if (FCnt > 0) and (FStack.Count > 0) then
119 data := FStack.Peek as TUnPaste;
120 data.FLen := data.FLen + 1;
124 data := TUnPaste.Create;
132 procedure TUndoClass.Pasted(const str: string; pos: integer);
136 obj := TUnPaste.Create;
138 obj.FLen := Length(str);
143 procedure TUndoClass.ResetCnt;
148 procedure TUndoClass.UpCount;
157 procedure TUnDelete.Execute;
159 FMemo.SelStart := FPos;
160 FMemo.SelText := FStr;
161 FMemo.SelStart := FPos;
162 if Length(FStr) > 1 then
163 FMemo.SelLength := Length(FStr);
166 FMemo.SelLength := Length(FStr);
167 FMemo.SelStart := FPos;
171 FMemo.SelLength := Length(FStr);
172 FMemo.SelStart := FPos + 1;
178 procedure TUnPaste.Execute;
180 FMemo.SelStart := FPos;
181 FMemo.SelLength := FLen;
187 procedure TUnInput.Execute;
189 FMemo.SelStart := FPos;