type
TUndoMethod = procedure(const str: string; pos: integer) of Object;
- TUndoItem = class
+ TUndoBase = class
+ private
+ FPos: integer;
+ FMemo: TCustomMemo;
+ public
+ procedure Execute; virtual; abstract;
+ end;
+
+ TUnInput = class(TUndoBase)
+ private
+ FData: Char;
public
- str: string;
- pos: integer;
- top: Boolean;
- meth: TUndoMethod;
+ procedure Execute; override;
+ end;
+
+ TUnDelete = class(TUndoBase)
+ private
+ FStr: string;
+ FTop: Boolean;
+ public
+ procedure Execute; override;
+ end;
+
+ TUnPaste = class(TUndoBase)
+ private
+ FLen: integer;
+ public
+ procedure Execute; override;
end;
TUndoClass = class(TComponent)
private
FStack: TObjectStack;
FMemo: TCustomMemo;
- procedure UnDelete(const str: string; pos: integer);
- procedure UnInput(const str: string; pos: integer);
- procedure UnPaste(const str: string; pos: integer);
function GetCanUndo: Boolean;
- protected
- FTop: Boolean;
+ procedure Press;
public
constructor Create(AOwner: TComponent); override;
- procedure Deleted(const str: string; pos: integer; top: Boolean);
- procedure Inputted(const str: string; pos: integer);
+ 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 TUndoClass.Deleted(const str: string; pos: integer; top: Boolean);
var
- obj: TUndoItem;
+ obj: TUnDelete;
begin
- obj := TUndoItem.Create;
- obj.str := str;
- obj.pos := pos;
- obj.top := top;
- obj.meth := UnDelete;
+ obj := TUnDelete.Create;
+ obj.FStr := str;
+ obj.FPos := pos;
+ obj.FTop := top;
+ obj.FMemo := FMemo;
FStack.Push(obj);
end;
procedure TUndoClass.Execute;
var
- obj: TUndoItem;
+ obj: TUndoBase;
begin
if FStack.Count > 0 then
begin
- obj := FStack.Pop as TUndoItem;
- FTop := obj.top;
- obj.meth(obj.str, obj.pos);
+ obj := FStack.Pop as TUndoBase;
+ obj.Execute;
end;
end;
result := FStack.Count > 0;
end;
-procedure TUndoClass.Inputted(const str: string; pos: integer);
+procedure TUndoClass.Inputted(c: Char; pos: integer);
var
- obj: TUndoItem;
+ obj: TUnInput;
begin
- obj := TUndoItem.Create;
- obj.str := str;
- obj.pos := pos;
- obj.meth := UnInput;
+ obj := TUnInput.Create;
+ obj.FData := c;
+ obj.FPos := pos;
+ obj.FMemo := FMemo;
FStack.Push(obj);
end;
procedure TUndoClass.Pasted(const str: string; pos: integer);
var
- obj: TUndoItem;
+ obj: TUnPaste;
begin
- obj := TUndoItem.Create;
- obj.str := str;
- obj.pos := pos;
- obj.meth := UnPaste;
+ obj := TUnPaste.Create;
+ obj.FPos := pos;
+ obj.FLen := Length(str);
+ obj.FMemo := FMemo;
FStack.Push(obj);
end;
-procedure TUndoClass.UnDelete(const str: string; pos: integer);
+procedure TUndoClass.Press;
begin
- Memo.SelStart := pos;
- Memo.SelText := str;
- Memo.SelStart := pos;
- if Length(str) > 1 then
- Memo.SelLength := Length(str);
+
+end;
+
+{ TUnDelete }
+
+procedure TUnDelete.Execute;
+begin
+ FMemo.SelStart := FPos;
+ FMemo.SelText := FStr;
+ FMemo.SelStart := FPos;
+ if Length(FStr) > 1 then
+ FMemo.SelLength := Length(FStr);
if FTop = true then
begin
- Memo.SelStart := pos;
- Memo.SelLength := Length(str);
+ FMemo.SelStart := FPos;
+ FMemo.SelLength := Length(FStr);
end;
end;
-procedure TUndoClass.UnInput(const str: string; pos: integer);
+{ TUnPaste }
+
+procedure TUnPaste.Execute;
begin
- Memo.SelStart := pos;
- Memo.SelLength := 1;
- Memo.SelText := '';
+ FMemo.SelStart := FPos;
+ FMemo.SelLength := FLen;
+ FMemo.SelText := '';
end;
-procedure TUndoClass.UnPaste(const str: string; pos: integer);
+{ TUnInput }
+
+procedure TUnInput.Execute;
begin
- Memo.SelStart := pos;
- Memo.SelLength := Length(str);
- Memo.SelText := '';
+ FMemo.SelStart:=FPos;
+ FMemo.SelLength := 1;
+ FMemo.SelText:='';
end;
end.
Left = 200
Top = 88
Bitmap = {
- 494C0101040008005C0010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+ 494C010104000800600010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
0000000000003600000028000000400000002000000001002000000000000020
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
ImageIndex = 0
ShortCut = 16472
end
- object EditPaste1: TEditPaste
- Category = #32232#38598
- Caption = #36028#12426#20184#12369'(&P)'
- Hint = #36028#12426#20184#12369'|'#12463#12522#12483#12503#12508#12540#12489#12398#20869#23481#12434#25407#20837#12375#12414#12377
- ImageIndex = 2
- ShortCut = 16470
- end
object EditSelectAll1: TEditSelectAll
Category = #32232#38598
Caption = #12377#12409#12390#36984#25246'(&A)'
Caption = 'Undo'
OnExecute = Action3Execute
end
+ object Action4: TAction
+ Category = #32232#38598
+ Caption = 'Past'
+ OnExecute = Action4Execute
+ end
end
object PopupMenu1: TPopupMenu
Left = 368
Action = EditCut1
end
object P1: TMenuItem
- Action = EditPaste1
+ Action = Action4
end
object A1: TMenuItem
Action = EditSelectAll1
Action = EditCut1
end
object P2: TMenuItem
- Action = EditPaste1
+ Action = Action4
end
object A2: TMenuItem
Action = EditSelectAll1
end
object U2: TMenuItem
- Caption = #20803#12395#25147#12377'(&U)'
- Hint = #20803#12395#25147#12377'|'#30452#21069#12398#25805#20316#12434#20803#12395#25147#12375#12414#12377
- ImageIndex = 3
- ShortCut = 16474
+ Action = Action3
end
end
object N3: TMenuItem
Memo2: TMemo;
ActionList1: TActionList;
PopupMenu1: TPopupMenu;
- EditPaste1: TEditPaste;
EditSelectAll1: TEditSelectAll;
EditCut1: TEditCut;
EditCopy1: TEditCopy;
ToolButton10: TToolButton;
Memo5: TMemo;
Action3: TAction;
+ Action4: TAction;
procedure ToolButton2Click(Sender: TObject);
procedure ToolButton5Click(Sender: TObject);
procedure TabControl1Change(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Action3Execute(Sender: TObject);
procedure Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+ procedure Action4Execute(Sender: TObject);
private
{ Private \90é\8c¾ }
procedure loop(item: TTreeNode; JSON: TJSONObject);
Undo.Execute;
end;
+procedure TForm1.Action4Execute(Sender: TObject);
+var
+ s: string;
+begin
+ s := Clipboard.AsText;
+ Memo1.SelText:=s;
+ Memo1.SelStart:=Memo1.SelStart-Length(s);
+ Memo1.SelLength:=Length(s);
+ Undo.Pasted(Memo1.SelText,Memo1.SelStart);
+end;
+
procedure TForm1.arrloop(item: TTreeNode; arr: TJSONArray);
var
s: string;