5 uses System.Contnrs, System.Classes, Vcl.StdCtrls;
13 procedure Execute; virtual; abstract;
14 procedure ReDo; virtual; abstract;
17 TUnDelete = class(TUndoBase)
22 procedure Execute; override;
23 procedure ReDo; override;
26 TUnPaste = class(TUndoBase)
31 procedure Execute; override;
32 procedure ReDo; override;
35 TUnRETURN = class(TUndoBase)
37 procedure Execute; override;
38 procedure ReDo; override;
41 TUnDelRet = class(TUndoBase)
45 procedure Execute; override;
46 procedure ReDo; override;
49 TUndoClass = class(TComponent)
53 FReStack: TObjectStack;
58 function GetCanUndo: Boolean;
60 procedure DelRedoStack;
61 procedure SetMemo(const Value: TCustomMemo);
62 function GetCanRedo: Boolean;
64 constructor Create(AOwner: TComponent); override;
65 procedure Deleted(const str: string; pos: integer; top: Boolean);
66 procedure Inputted(c: Char; pos: integer);
67 procedure Returned(pos: integer);
68 procedure DelReturn(num: integer; top: Boolean);
69 procedure Pasted(const str: string; pos: integer);
72 destructor Destroy; override;
80 property Memo: TCustomMemo read FMemo write SetMemo;
81 property CanUndo: Boolean read GetCanUndo;
82 property CanRedo: Boolean read GetCanRedo;
83 property Max: integer read FMax write FMax;
90 procedure TUndoClass.Clear;
94 for i := 0 to FStack.Count - 1 do
96 for i := 0 to FReStack.Count - 1 do
100 constructor TUndoClass.Create(AOwner: TComponent);
104 FStack := TObjectStack.Create;
105 FReStack := TObjectStack.Create;
108 procedure TUndoClass.Deleted(const str: string; pos: integer; top: Boolean);
115 if ((FBack > 0) or (FDel > 0)) and (FStack.Peek is TUnDelete) and
116 (Length(str) = 1) then
118 obj := FStack.Peek as TUnDelete;
119 if top = obj.FTop then
123 obj.FStr := obj.FStr + str;
124 obj.FPos := obj.FPos;
128 obj.FStr := str + obj.FStr;
129 obj.FPos := obj.FPos - 1;
136 Deleted(str, pos, top);
143 obj := TUnDelete.Create;
152 procedure TUndoClass.DelRedoStack;
156 if FReStack.Count > 0 then
157 for i := 1 to FReStack.Count do
161 procedure TUndoClass.DelReturn(num: integer; top: Boolean);
165 obj := TUnDelRet.Create;
172 destructor TUndoClass.Destroy;
180 procedure TUndoClass.Execute;
184 if FStack.Count > 0 then
186 obj := FStack.Pop as TUndoBase;
192 function TUndoClass.GetCanRedo: Boolean;
194 result := FReStack.Count > 0;
197 function TUndoClass.GetCanUndo: Boolean;
199 result := FStack.Count > 0;
202 procedure TUndoClass.Inputted(c: Char; pos: integer);
207 if (FCnt > 0) and (FStack.Count > 0) and (FStack.Peek is TUnPaste) then
209 data := FStack.Peek as TUnPaste;
210 data.FLen := data.FLen + 1;
211 data.FStr := data.FStr + c;
215 data := TUnPaste.Create;
224 procedure TUndoClass.Pasted(const str: string; pos: integer);
229 obj := TUnPaste.Create;
231 obj.FLen := Length(str);
237 procedure TUndoClass.ReDo;
241 if FReStack.Count > 0 then
243 obj := FReStack.Pop as TUndoBase;
249 procedure TUndoClass.ResetBack;
254 procedure TUndoClass.ResetCnt;
259 procedure TUndoClass.ResetDel;
264 procedure TUndoClass.Returned(pos: integer);
269 obj := TUnRETURN.Create;
275 procedure TUndoClass.SetMemo(const Value: TCustomMemo);
282 List := TList.Create;
283 for i := 1 to FStack.Count do
285 obj := FStack.Pop as TUndoBase;
289 for i := List.Count - 1 downto 0 do
290 FStack.Push(List[i]);
294 procedure TUndoClass.UpBackCnt;
301 procedure TUndoClass.UpCount;
308 procedure TUndoClass.UpDelCnt;
317 procedure TUnDelete.Execute;
319 FMemo.SelStart := FPos;
320 FMemo.SelText := FStr;
321 FMemo.SelStart := FPos;
322 if Length(FStr) > 1 then
323 FMemo.SelLength := Length(FStr);
326 FMemo.SelLength := Length(FStr);
327 FMemo.SelStart := FPos;
331 FMemo.SelLength := Length(FStr);
332 FMemo.SelStart := FPos + Length(FStr);
336 procedure TUnDelete.ReDo;
340 FMemo.SelStart := FPos;
341 FMemo.SelLength := Length(FStr);
348 procedure TUnPaste.Execute;
352 FMemo.SelStart := FPos;
353 FMemo.SelLength := FLen;
358 procedure TUnPaste.ReDo;
362 FMemo.SelStart := FPos;
363 FMemo.SelText := FStr;
364 FMemo.SelLength := FLen;
365 FMemo.SelStart := FPos + FLen;
371 procedure TUnRETURN.Execute;
377 FMemo.SelStart := FPos;
378 i := FMemo.CaretPos.Y;
379 FMemo.Lines[i] := FMemo.Lines[i] + FMemo.Lines[i + 1];
380 FMemo.Lines.Delete(i + 1);
381 FMemo.SelStart := FPos;
385 procedure TUnRETURN.ReDo;
389 FMemo.SelStart := FPos;
390 FMemo.SelText := #13#10;
396 procedure TUnDelRet.Execute;
400 FMemo.SelStart := FPos;
401 FMemo.SelText := #13#10;
403 FMemo.SelStart := FMemo.SelStart + 1;
407 procedure TUnDelRet.ReDo;
413 FMemo.SelStart := FPos;
414 i := FMemo.CaretPos.Y;
415 FMemo.Lines[i] := FMemo.Lines[i] + FMemo.Lines[i + 1];
416 FMemo.Lines.Delete(i + 1);