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 TUnRETURN = class(TUndoBase)
40 procedure Execute; override;
43 TUndoClass = class(TComponent)
48 function GetCanUndo: Boolean;
50 procedure SetMemo(const Value: TCustomMemo);
52 constructor Create(AOwner: TComponent); override;
53 procedure Deleted(const str: string; pos: integer; top: Boolean);
54 procedure Inputted(c: Char; pos: integer);
55 procedure Returned(pos: integer);
56 procedure Pasted(const str: string; pos: integer);
58 destructor Destroy; override;
62 property Memo: TCustomMemo read FMemo write SetMemo;
63 property CanUndo: Boolean read GetCanUndo;
70 procedure TUndoClass.Clear;
74 for i := 0 to FStack.Count - 1 do
78 constructor TUndoClass.Create(AOwner: TComponent);
81 FStack := TObjectStack.Create;
84 procedure TUndoClass.Deleted(const str: string; pos: integer; top: Boolean);
88 obj := TUnDelete.Create;
96 destructor TUndoClass.Destroy;
103 procedure TUndoClass.Execute;
107 if FStack.Count > 0 then
109 obj := FStack.Pop as TUndoBase;
115 function TUndoClass.GetCanUndo: Boolean;
117 result := FStack.Count > 0;
120 procedure TUndoClass.Inputted(c: Char; pos: integer);
124 if (FCnt > 0) and (FStack.Count > 0) and (FStack.Peek is TUnPaste) then
126 data := FStack.Peek as TUnPaste;
127 data.FLen := data.FLen + 1;
131 data := TUnPaste.Create;
139 procedure TUndoClass.Pasted(const str: string; pos: integer);
143 obj := TUnPaste.Create;
145 obj.FLen := Length(str);
150 procedure TUndoClass.ResetCnt;
155 procedure TUndoClass.Returned(pos: integer);
159 obj := TUnRETURN.Create;
165 procedure TUndoClass.SetMemo(const Value: TCustomMemo);
172 List := TList.Create;
173 for i := 1 to FStack.Count do
175 obj := FStack.Pop as TUndoBase;
179 for i := List.Count - 1 downto 0 do
180 FStack.Push(List[i]);
184 procedure TUndoClass.UpCount;
193 procedure TUnDelete.Execute;
195 FMemo.SelStart := FPos;
196 FMemo.SelText := FStr;
197 FMemo.SelStart := FPos;
198 if Length(FStr) > 1 then
199 FMemo.SelLength := Length(FStr);
202 FMemo.SelLength := Length(FStr);
203 FMemo.SelStart := FPos;
207 FMemo.SelLength := Length(FStr);
208 FMemo.SelStart := FPos + 1;
214 procedure TUnPaste.Execute;
218 FMemo.SelStart := FPos;
219 FMemo.SelLength := FLen;
226 procedure TUnInput.Execute;
230 FMemo.SelStart := FPos;
237 procedure TUnRETURN.Execute;
244 FMemo.SelStart := FPos;
245 i := FMemo.CaretPos.Y;
246 FMemo.Lines[i] := FMemo.Lines[i] + FMemo.Lines[i + 1];
247 FMemo.Lines.Delete(i + 1);
248 FMemo.SelStart:=FPos;