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;
55 function GetCanUndo: Boolean;
57 procedure DelRedoStack;
58 procedure SetMemo(const Value: TCustomMemo);
59 function GetCanRedo: Boolean;
61 constructor Create(AOwner: TComponent); override;
62 procedure Deleted(const str: string; pos: integer; top: Boolean);
63 procedure Inputted(c: Char; pos: integer);
64 procedure Returned(pos: integer);
65 procedure Pasted(const str: string; pos: integer);
68 destructor Destroy; override;
72 property Memo: TCustomMemo read FMemo write SetMemo;
73 property CanUndo: Boolean read GetCanUndo;
74 property CanRedo: Boolean read GetCanRedo;
81 procedure TUndoClass.Clear;
85 for i := 0 to FStack.Count - 1 do
87 for i := 0 to FReStack.Count - 1 do
91 constructor TUndoClass.Create(AOwner: TComponent);
94 FStack := TObjectStack.Create;
95 FReStack := TObjectStack.Create;
98 procedure TUndoClass.Deleted(const str: string; pos: integer; top: Boolean);
103 obj := TUnDelete.Create;
111 procedure TUndoClass.DelRedoStack;
115 if FReStack.Count > 0 then
116 for i := 1 to FReStack.Count do
120 destructor TUndoClass.Destroy;
128 procedure TUndoClass.Execute;
132 if FStack.Count > 0 then
134 obj := FStack.Pop as TUndoBase;
140 function TUndoClass.GetCanRedo: Boolean;
142 result:=FReStack.Count > 0;
145 function TUndoClass.GetCanUndo: Boolean;
147 result := FStack.Count > 0;
150 procedure TUndoClass.Inputted(c: Char; pos: integer);
155 if (FCnt > 0) and (FStack.Count > 0) and (FStack.Peek is TUnPaste) then
157 data := FStack.Peek as TUnPaste;
158 data.FLen := data.FLen + 1;
159 data.FStr := data.FStr + c;
163 data := TUnPaste.Create;
172 procedure TUndoClass.Pasted(const str: string; pos: integer);
177 obj := TUnPaste.Create;
179 obj.FLen := Length(str);
184 procedure TUndoClass.ReDo;
188 if FReStack.Count > 0 then
190 obj := FReStack.Pop as TUndoBase;
196 procedure TUndoClass.ResetCnt;
201 procedure TUndoClass.Returned(pos: integer);
206 obj := TUnRETURN.Create;
212 procedure TUndoClass.SetMemo(const Value: TCustomMemo);
219 List := TList.Create;
220 for i := 1 to FStack.Count do
222 obj := FStack.Pop as TUndoBase;
226 for i := List.Count - 1 downto 0 do
227 FStack.Push(List[i]);
231 procedure TUndoClass.UpCount;
240 procedure TUnDelete.Execute;
242 FMemo.SelStart := FPos;
243 FMemo.SelText := FStr;
244 FMemo.SelStart := FPos;
245 if Length(FStr) > 1 then
246 FMemo.SelLength := Length(FStr);
249 FMemo.SelLength := Length(FStr);
250 FMemo.SelStart := FPos;
254 FMemo.SelLength := Length(FStr);
255 FMemo.SelStart := FPos + 1;
259 procedure TUnDelete.ReDo;
263 FMemo.SelStart := FPos;
264 FMemo.SelLength := Length(FStr);
271 procedure TUnPaste.Execute;
275 FMemo.SelStart := FPos;
276 FMemo.SelLength := FLen;
281 procedure TUnPaste.ReDo;
285 FMemo.SelStart := FPos;
286 FMemo.SelText := FStr;
287 FMemo.SelLength := FLen;
288 FMemo.SelStart := FPos + FLen;
294 procedure TUnInput.Execute;
298 FMemo.SelStart := FPos;
303 procedure TUnInput.ReDo;
310 procedure TUnRETURN.Execute;
316 FMemo.SelStart := FPos;
317 i := FMemo.CaretPos.Y;
318 FMemo.Lines[i] := FMemo.Lines[i] + FMemo.Lines[i + 1];
319 FMemo.Lines.Delete(i + 1);
320 FMemo.SelStart := FPos;
324 procedure TUnRETURN.ReDo;
328 FMemo.SelStart := FPos;
329 FMemo.SelText := #13#10;