OSDN Git Service

思い切っていつも通りにクラス利用やってみた
authoryamat0jp <yamat0jp@yahoo.co.jp>
Fri, 24 Sep 2021 09:46:26 +0000 (18:46 +0900)
committeryamat0jp <yamat0jp@yahoo.co.jp>
Fri, 24 Sep 2021 09:46:26 +0000 (18:46 +0900)
Undo.pas
Unit1.dfm
Unit1.pas

index f0b8805..d8fec77 100644 (file)
--- 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.
index 65c1c10..c5cf281 100644 (file)
--- 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
index d705644..9f1f36a 100644 (file)
--- 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 \90é\8c¾ }
     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;