private
FStack: TObjectStack;
FMemo: TCustomMemo;
+ FCnt: integer;
function GetCanUndo: Boolean;
- procedure Press;
+ procedure Clear;
public
constructor Create(AOwner: TComponent); override;
- procedure Deleted(const str: string ; pos: integer; top: Boolean);
+ procedure Deleted(const str: string; pos: integer; top: Boolean);
procedure Inputted(c: Char; pos: integer);
procedure Pasted(const str: string; pos: integer);
procedure Execute;
destructor Destroy; override;
+ procedure UpCount;
+ procedure ResetCnt;
published
property Memo: TCustomMemo read FMemo write FMemo;
property CanUndo: Boolean read GetCanUndo;
{ TUndoClass }
+procedure TUndoClass.Clear;
+var
+ i: integer;
+begin
+ for i := 0 to FStack.Count - 1 do
+ FStack.Pop.Free;
+end;
+
constructor TUndoClass.Create(AOwner: TComponent);
begin
inherited;
end;
destructor TUndoClass.Destroy;
-var
- i: integer;
begin
- for i := 0 to FStack.Count - 1 do
- FStack.Pop;
+ Clear;
FStack.Free;
inherited;
end;
begin
obj := FStack.Pop as TUndoBase;
obj.Execute;
+ obj.Free;
end;
end;
procedure TUndoClass.Inputted(c: Char; pos: integer);
var
- obj: TUnInput;
+ data: TUnPaste;
begin
- obj := TUnInput.Create;
- obj.FData := c;
- obj.FPos := pos;
- obj.FMemo := FMemo;
- FStack.Push(obj);
+ if (FCnt > 0) and (FStack.Count > 0) then
+ begin
+ data := FStack.Peek as TUnPaste;
+ data.FLen := data.FLen + 1;
+ end
+ else
+ begin
+ data := TUnPaste.Create;
+ data.FPos := pos;
+ data.FLen := 1;
+ data.FMemo := FMemo;
+ FStack.Push(data);
+ end;
end;
procedure TUndoClass.Pasted(const str: string; pos: integer);
FStack.Push(obj);
end;
-procedure TUndoClass.Press;
+procedure TUndoClass.ResetCnt;
begin
+ FCnt := 0;
+end;
+procedure TUndoClass.UpCount;
+begin
+ inc(FCnt);
+ if FCnt > 5 then
+ FCnt := 0;
end;
{ TUnDelete }
FMemo.SelLength := Length(FStr);
if FTop = true then
begin
+ FMemo.SelLength := Length(FStr);
FMemo.SelStart := FPos;
+ end
+ else
+ begin
FMemo.SelLength := Length(FStr);
+ FMemo.SelStart := FPos + 1;
end;
end;
procedure TUnInput.Execute;
begin
- FMemo.SelStart:=FPos;
- FMemo.SelLength := 1;
- FMemo.SelText:='';
+ FMemo.SelStart := FPos;
+ FMemo.SelText := '';
end;
end.
Panels = <
item
Width = 50
+ end
+ item
+ Width = 50
end>
end
object TabControl1: TTabControl
Left = 200
Top = 88
Bitmap = {
- 494C010104000800600010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+ 494C010104000800680010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
0000000000003600000028000000400000002000000001002000000000000020
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
id: TIndxChar;
delstr: string;
delpos: integer;
+ charmodi: Boolean;
Undo: TUndoClass;
procedure TForm1.Action3Execute(Sender: TObject);
else
delstr := Memo1.SelText;
end;
+ charmodi := true;
end;
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
VK_RETURN:
;
else
- if Memo1.SelLength > 0 then
- Undo.Deleted(Memo1.SelText, Memo1.SelStart, false);
- Undo.Inputted(Key, Memo1.SelStart);
- delpos := Memo1.SelStart + 1;
+ delstr := Memo1.SelText;
+ delpos := Memo1.SelStart;
+ charmodi := false;
end;
end;
procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
-var
- s: string;
begin
case Key of
VK_BACK:
VK_DELETE:
Undo.Deleted(delstr, Memo1.SelStart, true);
end;
- if Memo1.SelStart > delpos then
+ if charmodi = true then
+ Undo.ResetCnt
+ else if delstr <> '' then
+ Undo.Deleted(delstr, Memo1.SelStart, false)
+ else
begin
- s := Copy(Memo1.Text, delpos, Memo1.SelStart - delpos);
- Undo.Pasted(s, delpos);
+ Undo.Inputted(Memo1.Text[delpos], delpos);
+ Undo.UpCount;
end;
+ StatusBar1.Panels[1].Text:=charmodi.ToString;
end;
function TForm1.returnChar(c: TIndxChar): Char;