procedure ReDo; virtual; abstract;
end;
- TUnInput = class(TUndoBase)
- private
- FData: Char;
- public
- procedure Execute; override;
- procedure ReDo; override;
- end;
-
TUnDelete = class(TUndoBase)
private
FStr: string;
procedure ReDo; override;
end;
+ TUnDelRet = class(TUndoBase)
+ private
+ FTop: Boolean;
+ public
+ procedure Execute; override;
+ end;
+
TUndoClass = class(TComponent)
private
FStack: TObjectStack;
procedure Deleted(const str: string; pos: integer; top: Boolean);
procedure Inputted(c: Char; pos: integer);
procedure Returned(pos: integer);
+ procedure DelReturn(num: integer; top: Boolean);
procedure Pasted(const str: string; pos: integer);
procedure Execute;
procedure ReDo;
else
begin
obj.FStr := str + obj.FStr;
- obj.FPos := obj.FPos-1;
+ obj.FPos := obj.FPos - 1;
end;
end
else
FReStack.Pop.Free;
end;
+procedure TUndoClass.DelReturn(num: integer; top: Boolean);
+var
+ obj: TUnDelRet;
+begin
+ obj := TUnDelRet.Create;
+ obj.FPos := num;
+ obj.FTop := top;
+ obj.FMemo := FMemo;
+ FStack.Push(obj);
+end;
+
destructor TUndoClass.Destroy;
begin
Clear;
end;
end;
-{ TUnInput }
-
-procedure TUnInput.Execute;
-begin
- if FMemo <> nil then
- begin
- FMemo.SelStart := FPos;
- FMemo.SelText := '';
- end;
-end;
-
-procedure TUnInput.ReDo;
-begin
-
-end;
-
{ TUnRETURN }
procedure TUnRETURN.Execute;
end;
end;
+{ TUnDelRet }
+
+procedure TUnDelRet.Execute;
+begin
+ if FMemo <> nil then
+ begin
+ FMemo.SelStart := FPos;
+ FMemo.SelText := #13#10;
+ if FTop = false then
+ FMemo.SelStart:=FMemo.SelStart+1;
+ end;
+end;
+
end.
Left = 200
Top = 88
Bitmap = {
- 494C010106000800800010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+ 494C010106000800840010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
0000000000003600000028000000400000002000000001002000000000000020
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
case Key of
VK_DELETE:
begin
- if Memo1.SelLength = 0 then
+ if Memo1.CaretPos.X = Length(Memo1.Lines[Memo1.CaretPos.Y]) then
+ begin
+ Undo.DelReturn(Memo1.SelStart,true);
+ Undo.ResetDel;
+ Undo.ResetBack;
+ charmodi := true;
+ Exit;
+ end
+ else if Memo1.SelLength = 0 then
delstr := Memo1.Text[Memo1.SelStart + 1]
else
delstr := Memo1.SelText;
VK_BACK:
if Memo1.SelStart > 0 then
begin
- if Memo1.SelLength = 0 then
+ if Memo1.CaretPos.X = 0 then
+ begin
+ Undo.DelReturn(Memo1.SelStart,false);
+ Undo.ResetDel;
+ Undo.ResetBack;
+ charmodi := true;
+ Exit;
+ end
+ else if Memo1.SelLength = 0 then
delstr := Memo1.Text[Memo1.SelStart]
else
delstr := Memo1.SelText;
Undo.Deleted(delstr, Memo1.SelStart-1, false);
Undo.UpBackCnt;
end;
+ VK_DELETE:
+ ;
else
+ Undo.ResetDel;
+ Undo.ResetBack;
inputsub(Key);
end;
end;