5 uses System.Contnrs, System.Classes, Vcl.StdCtrls;
13 procedure Execute; virtual; abstract;
14 procedure ReDo; virtual; abstract;
17 TUnInput = class(TUndoBase)
21 procedure Execute; override;
22 procedure ReDo; override;
25 TUnDelete = class(TUndoBase)
30 procedure Execute; override;
31 procedure ReDo; override;
34 TUnPaste = class(TUndoBase)
39 procedure Execute; override;
40 procedure ReDo; override;
43 TUnRETURN = class(TUndoBase)
45 procedure Execute; override;
46 procedure ReDo; override;
49 TUndoClass = class(TComponent)
52 FReStack: TObjectStack;
57 function GetCanUndo: Boolean;
59 procedure DelRedoStack;
60 procedure SetMemo(const Value: TCustomMemo);
61 function GetCanRedo: Boolean;
63 constructor Create(AOwner: TComponent); override;
64 procedure Deleted(const str: string; pos: integer; top: Boolean);
65 procedure Inputted(c: Char; pos: integer);
66 procedure Returned(pos: integer);
67 procedure Pasted(const str: string; pos: integer);
70 destructor Destroy; override;
78 property Memo: TCustomMemo read FMemo write SetMemo;
79 property CanUndo: Boolean read GetCanUndo;
80 property CanRedo: Boolean read GetCanRedo;
87 procedure TUndoClass.Clear;
91 for i := 0 to FStack.Count - 1 do
93 for i := 0 to FReStack.Count - 1 do
97 constructor TUndoClass.Create(AOwner: TComponent);
100 FStack := TObjectStack.Create;
101 FReStack := TObjectStack.Create;
104 procedure TUndoClass.Deleted(const str: string; pos: integer; top: Boolean);
111 if ((FBack > 0) or (FDel > 0)) and (FStack.Peek is TUnDelete) and
112 (Length(str) = 1) then
114 obj := FStack.Peek as TUnDelete;
115 if top = obj.FTop then
119 obj.FStr := obj.FStr + str;
120 obj.FPos := obj.FPos;
124 obj.FStr := str + obj.FStr;
125 obj.FPos := obj.FPos-1;
132 Deleted(str, pos, top);
139 obj := TUnDelete.Create;
148 procedure TUndoClass.DelRedoStack;
152 if FReStack.Count > 0 then
153 for i := 1 to FReStack.Count do
157 destructor TUndoClass.Destroy;
165 procedure TUndoClass.Execute;
169 if FStack.Count > 0 then
171 obj := FStack.Pop as TUndoBase;
177 function TUndoClass.GetCanRedo: Boolean;
179 result := FReStack.Count > 0;
182 function TUndoClass.GetCanUndo: Boolean;
184 result := FStack.Count > 0;
187 procedure TUndoClass.Inputted(c: Char; pos: integer);
192 if (FCnt > 0) and (FStack.Count > 0) and (FStack.Peek is TUnPaste) then
194 data := FStack.Peek as TUnPaste;
195 data.FLen := data.FLen + 1;
196 data.FStr := data.FStr + c;
200 data := TUnPaste.Create;
209 procedure TUndoClass.Pasted(const str: string; pos: integer);
214 obj := TUnPaste.Create;
216 obj.FLen := Length(str);
222 procedure TUndoClass.ReDo;
226 if FReStack.Count > 0 then
228 obj := FReStack.Pop as TUndoBase;
234 procedure TUndoClass.ResetBack;
239 procedure TUndoClass.ResetCnt;
244 procedure TUndoClass.ResetDel;
249 procedure TUndoClass.Returned(pos: integer);
254 obj := TUnRETURN.Create;
260 procedure TUndoClass.SetMemo(const Value: TCustomMemo);
267 List := TList.Create;
268 for i := 1 to FStack.Count do
270 obj := FStack.Pop as TUndoBase;
274 for i := List.Count - 1 downto 0 do
275 FStack.Push(List[i]);
279 procedure TUndoClass.UpBackCnt;
286 procedure TUndoClass.UpCount;
293 procedure TUndoClass.UpDelCnt;
302 procedure TUnDelete.Execute;
304 FMemo.SelStart := FPos;
305 FMemo.SelText := FStr;
306 FMemo.SelStart := FPos;
307 if Length(FStr) > 1 then
308 FMemo.SelLength := Length(FStr);
311 FMemo.SelLength := Length(FStr);
312 FMemo.SelStart := FPos;
316 FMemo.SelLength := Length(FStr);
317 FMemo.SelStart := FPos + Length(FStr);
321 procedure TUnDelete.ReDo;
325 FMemo.SelStart := FPos;
326 FMemo.SelLength := Length(FStr);
333 procedure TUnPaste.Execute;
337 FMemo.SelStart := FPos;
338 FMemo.SelLength := FLen;
343 procedure TUnPaste.ReDo;
347 FMemo.SelStart := FPos;
348 FMemo.SelText := FStr;
349 FMemo.SelLength := FLen;
350 FMemo.SelStart := FPos + FLen;
356 procedure TUnInput.Execute;
360 FMemo.SelStart := FPos;
365 procedure TUnInput.ReDo;
372 procedure TUnRETURN.Execute;
378 FMemo.SelStart := FPos;
379 i := FMemo.CaretPos.Y;
380 FMemo.Lines[i] := FMemo.Lines[i] + FMemo.Lines[i + 1];
381 FMemo.Lines.Delete(i + 1);
382 FMemo.SelStart := FPos;
386 procedure TUnRETURN.ReDo;
390 FMemo.SelStart := FPos;
391 FMemo.SelText := #13#10;