From ad02aee183e591beee7867791f7ee8a1b5ea819d Mon Sep 17 00:00:00 2001 From: yamat0jp Date: Fri, 24 Sep 2021 18:46:26 +0900 Subject: [PATCH] =?utf8?q?=E6=80=9D=E3=81=84=E5=88=87=E3=81=A3=E3=81=A6?= =?utf8?q?=E3=81=84=E3=81=A4=E3=82=82=E9=80=9A=E3=82=8A=E3=81=AB=E3=82=AF?= =?utf8?q?=E3=83=A9=E3=82=B9=E5=88=A9=E7=94=A8=E3=82=84=E3=81=A3=E3=81=A6?= =?utf8?q?=E3=81=BF=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Undo.pas | 126 ++++++++++++++++++++++++++++++++++++++------------------------ Unit1.dfm | 23 +++++------- Unit1.pas | 14 ++++++- 3 files changed, 99 insertions(+), 64 deletions(-) diff --git a/Undo.pas b/Undo.pas index f0b8805..d8fec77 100644 --- a/Undo.pas +++ b/Undo.pas @@ -7,28 +7,46 @@ uses System.Contnrs, System.Classes, Vcl.StdCtrls; 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; @@ -49,13 +67,13 @@ end; 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; @@ -71,13 +89,12 @@ 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; @@ -86,54 +103,65 @@ begin 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. diff --git a/Unit1.dfm b/Unit1.dfm index 65c1c10..c5cf281 100644 --- a/Unit1.dfm +++ b/Unit1.dfm @@ -208,7 +208,7 @@ object Form1: TForm1 Left = 200 Top = 88 Bitmap = { - 494C0101040008005C0010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 494C010104000800600010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000400000002000000001002000000000000020 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -496,13 +496,6 @@ object Form1: TForm1 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)' @@ -528,6 +521,11 @@ object Form1: TForm1 Caption = 'Undo' OnExecute = Action3Execute end + object Action4: TAction + Category = #32232#38598 + Caption = 'Past' + OnExecute = Action4Execute + end end object PopupMenu1: TPopupMenu Left = 368 @@ -539,7 +537,7 @@ object Form1: TForm1 Action = EditCut1 end object P1: TMenuItem - Action = EditPaste1 + Action = Action4 end object A1: TMenuItem Action = EditSelectAll1 @@ -572,16 +570,13 @@ object Form1: TForm1 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 diff --git a/Unit1.pas b/Unit1.pas index d705644..9f1f36a 100644 --- a/Unit1.pas +++ b/Unit1.pas @@ -25,7 +25,6 @@ type Memo2: TMemo; ActionList1: TActionList; PopupMenu1: TPopupMenu; - EditPaste1: TEditPaste; EditSelectAll1: TEditSelectAll; EditCut1: TEditCut; EditCopy1: TEditCopy; @@ -60,6 +59,7 @@ type ToolButton10: TToolButton; Memo5: TMemo; Action3: TAction; + Action4: TAction; procedure ToolButton2Click(Sender: TObject); procedure ToolButton5Click(Sender: TObject); procedure TabControl1Change(Sender: TObject); @@ -70,6 +70,7 @@ type procedure FormDestroy(Sender: TObject); procedure Action3Execute(Sender: TObject); procedure Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); + procedure Action4Execute(Sender: TObject); private { Private éŒ¾ } procedure loop(item: TTreeNode; JSON: TJSONObject); @@ -99,6 +100,17 @@ begin 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; -- 2.11.0