OSDN Git Service

全角未対応 キー押下連続入力未対応
authoryamat0jp <yamat0jp@yahoo.co.jp>
Sat, 25 Sep 2021 01:10:53 +0000 (10:10 +0900)
committeryamat0jp <yamat0jp@yahoo.co.jp>
Sat, 25 Sep 2021 01:10:53 +0000 (10:10 +0900)
Undo.pas
Unit1.dfm
Unit1.pas

index b4803f6..65b81c4 100644 (file)
--- a/Undo.pas
+++ b/Undo.pas
@@ -39,15 +39,18 @@ type
   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;
@@ -57,6 +60,14 @@ implementation
 
 { 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;
@@ -76,11 +87,8 @@ begin
 end;
 
 destructor TUndoClass.Destroy;
-var
-  i: integer;
 begin
-  for i := 0 to FStack.Count - 1 do
-    FStack.Pop;
+  Clear;
   FStack.Free;
   inherited;
 end;
@@ -93,6 +101,7 @@ begin
   begin
     obj := FStack.Pop as TUndoBase;
     obj.Execute;
+    obj.Free;
   end;
 end;
 
@@ -103,13 +112,21 @@ 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);
@@ -123,9 +140,16 @@ begin
   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 }
@@ -139,8 +163,13 @@ begin
     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;
 
@@ -157,9 +186,8 @@ end;
 
 procedure TUnInput.Execute;
 begin
-  FMemo.SelStart:=FPos;
-  FMemo.SelLength := 1;
-  FMemo.SelText:='';
+  FMemo.SelStart := FPos;
+  FMemo.SelText := '';
 end;
 
 end.
index 2c1ada2..e3b5f86 100644 (file)
--- a/Unit1.dfm
+++ b/Unit1.dfm
@@ -138,6 +138,9 @@ object Form1: TForm1
     Panels = <
       item
         Width = 50
+      end
+      item
+        Width = 50
       end>
   end
   object TabControl1: TTabControl
@@ -208,7 +211,7 @@ object Form1: TForm1
     Left = 200
     Top = 88
     Bitmap = {
-      494C010104000800600010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+      494C010104000800680010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
       0000000000003600000028000000400000002000000001002000000000000020
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
index 46f7502..a15702c 100644 (file)
--- a/Unit1.pas
+++ b/Unit1.pas
@@ -93,6 +93,7 @@ var
   id: TIndxChar;
   delstr: string;
   delpos: integer;
+  charmodi: Boolean;
   Undo: TUndoClass;
 
 procedure TForm1.Action3Execute(Sender: TObject);
@@ -217,6 +218,7 @@ begin
         else
           delstr := Memo1.SelText;
     end;
+  charmodi := true;
 end;
 
 procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
@@ -231,16 +233,13 @@ begin
     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:
@@ -248,11 +247,16 @@ begin
     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;