procedure Execute; override;
end;
+ TUnRETURN = class(TUndoBase)
+ public
+ procedure Execute; override;
+ end;
+
TUndoClass = class(TComponent)
private
FStack: TObjectStack;
FCnt: integer;
function GetCanUndo: Boolean;
procedure Clear;
+ procedure SetMemo(const Value: TCustomMemo);
public
constructor Create(AOwner: TComponent); override;
procedure Deleted(const str: string; pos: integer; top: Boolean);
procedure Inputted(c: Char; pos: integer);
+ procedure Returned(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 Memo: TCustomMemo read FMemo write SetMemo;
property CanUndo: Boolean read GetCanUndo;
end;
var
data: TUnPaste;
begin
- if (FCnt > 0) and (FStack.Count > 0) then
+ if (FCnt > 0) and (FStack.Count > 0) and (FStack.Peek is TUnPaste) then
begin
data := FStack.Peek as TUnPaste;
data.FLen := data.FLen + 1;
FCnt := 0;
end;
+procedure TUndoClass.Returned(pos: integer);
+var
+ obj: TUnRETURN;
+begin
+ obj := TUnRETURN.Create;
+ obj.FPos := pos;
+ obj.FMemo := FMemo;
+ FStack.Push(obj);
+end;
+
+procedure TUndoClass.SetMemo(const Value: TCustomMemo);
+var
+ obj: TUndoBase;
+ i: integer;
+ List: TList;
+begin
+ FMemo := Value;
+ List := TList.Create;
+ for i := 1 to FStack.Count do
+ begin
+ obj := FStack.Pop as TUndoBase;
+ obj.FMemo := Value;
+ List.Add(obj);
+ end;
+ for i := List.Count - 1 downto 0 do
+ FStack.Push(List[i]);
+ List.Free;
+end;
+
procedure TUndoClass.UpCount;
begin
inc(FCnt);
procedure TUnPaste.Execute;
begin
- FMemo.SelStart := FPos;
- FMemo.SelLength := FLen;
- FMemo.SelText := '';
+ if FMemo <> nil then
+ begin
+ FMemo.SelStart := FPos;
+ FMemo.SelLength := FLen;
+ FMemo.SelText := '';
+ end;
end;
{ TUnInput }
procedure TUnInput.Execute;
begin
- FMemo.SelStart := FPos;
- FMemo.SelText := '';
+ if FMemo <> nil then
+ begin
+ FMemo.SelStart := FPos;
+ FMemo.SelText := '';
+ end;
+end;
+
+{ TUnRETURN }
+
+procedure TUnRETURN.Execute;
+var
+ i: integer;
+ s: string;
+begin
+ if FMemo <> nil then
+ begin
+ FMemo.SelStart := FPos;
+ i := FMemo.CaretPos.Y;
+ FMemo.Lines[i] := FMemo.Lines[i] + FMemo.Lines[i + 1];
+ FMemo.Lines.Delete(i + 1);
+ FMemo.SelStart:=FPos;
+ end;
end;
end.
procedure loop(item: TTreeNode; JSON: TJSONObject);
procedure arrloop(item: TTreeNode; arr: TJSONArray);
function returnChar(c: TIndxChar): Char;
+ procedure inputsub(Key: Char);
public
{ Public \90é\8c¾ }
end;
Undo.Free;
end;
+procedure TForm1.inputsub(Key: Char);
+begin
+ delstr := Memo1.SelText;
+ delpos := Memo1.SelStart;
+ charmodi := false;
+ if delstr <> '' then
+ Undo.Deleted(delstr, Memo1.SelStart, false);
+ if Key = Char(VK_RETURN) then
+ Undo.Returned(delpos)
+ else
+ Undo.Inputted(Key, delpos);
+ Undo.UpCount;
+end;
+
procedure TForm1.loop(item: TTreeNode; JSON: TJSONObject);
var
i: integer;
delstr := Memo1.Text[Memo1.SelStart]
else
delstr := Memo1.SelText;
- VK_RETURN:
- ;
else
- delstr := Memo1.SelText;
- delpos := Memo1.SelStart;
- charmodi := false;
- if delstr <> '' then
- Undo.Deleted(delstr, Memo1.SelStart, false);
- Undo.Inputted(Key, delpos);
- Undo.UpCount;
+ inputsub(Key);
end;
end;
<FrameworkType>VCL</FrameworkType>
<MainSource>json_checker.dpr</MainSource>
<Base>True</Base>
- <Config Condition="'$(Config)'==''">Release</Config>
+ <Config Condition="'$(Config)'==''">Debug</Config>
<Platform Condition="'$(Platform)'==''">Win64</Platform>
<TargetedPlatforms>3</TargetedPlatforms>
<AppType>Application</AppType>