Simon Grossenbacher 3 ani în urmă
părinte
comite
228832bde1
6 a modificat fișierele cu 231 adăugiri și 60 ștergeri
  1. 3 2
      Example Config.rdproj
  2. BIN
      RESTDebugger.exe
  3. 145 52
      src/_frmMain.dfm
  4. 70 3
      src/_frmMain.pas
  5. 12 3
      src/_frmVariables.dfm
  6. 1 0
      src/_frmVariables.pas

+ 3 - 2
Example Config.rdproj

@@ -1,7 +1,7 @@
 {
 	"Presets": {
 		"Presets": "faf2be76254543f9ad9cc8fca91cef5e:R0VUOiBTaW1wbGUgR0VU\r\n7d37b798c22748eebf92ffa281ba982a:R0VUOiBHRVQgRXh0cmEgSGVhZGVycw==\r\n777045dda27d466fab6c051d3e8094e8:R0VUOiBVc2UgQmFzaWMgQXV0aCBFeGFtcGxl\r\na0745bab53eb4c78a6034f1a9d4559de:R0VUOiBFeGFtcGxlIFVSTCBQYXJhbWV0ZXJz\r\n292047e733934bc48429c4d746cae53a:UE9TVDogSnNvbiBQb3N0IERhdGE=\r\nc02b437c22474cf7b44a96c72f430f18:REVMRVRFOiBEZWxldGUgRGF0YQ==\r\n9609fe373b9b4865a2ea83a3dd35be30:UFVUOiBKc29uIFB1dCBEYXRh\r\ncbbcebba6f30425caec540f517cb3524:UEFUQ0g6IEpzb24gUGF0Y2ggRGF0YQ==\r\n",
-		"LastUsed": 0,
+		"LastUsed": 5,
 		"ConfigVersion": 2
 	},
 	"Preset_faf2be76254543f9ad9cc8fca91cef5e": {
@@ -101,6 +101,7 @@
 		"ResponseAutoFormat": false
 	},
 	"Main": {
-		"GlobalVar": "fldName\tfldValue\r\n%CustomPostData%\tData 1\r\n%BaseURL%\thttps://httpbin.org\r\n"
+		"GlobalVar": "fldType\tfldName\tfldValue\r\nStatic\t%CustomPostData%\tData 1\r\nRegEx\t(?<=User-Agent\": \")(?s)(.\\w*\\s\\w*\\s\\w*\\/)\\d*.\\d*.\\/g\t\r\nStatic\t%BaseURL%\thttps://httpbin.org\r\n",
+		"GridViewPresets": "Bhlmcm1NYWluLmN4R3JpZERCVGFibGVWaWV3BhJUY3hHcmlkREJUYWJsZVZpZXcCCQYJU291cmNlRFBJAgYCYAYGRm9vdGVyAgkGBUZhbHNlBgpHcm91cEJ5Qm94AgkGBFRydWUGDEdyb3VwRm9vdGVycwICBgEABgpOZXdJdGVtUm93AgkGBUZhbHNlBhhFZGl0Rm9ybVVzZURlZmF1bHRMYXlvdXQCCQYEVHJ1ZQYTUm93VXNlRGVmYXVsdExheW91dAIJBgRUcnVlBh9Db2x1bW5zUXVpY2tDdXN0b21pemF0aW9uU29ydGVkAgkGBUZhbHNlBgdWZXJzaW9uAgIGAQECAwYYY3hHcmlkREJUYWJsZVZpZXdmbGROYW1lBg9UY3hHcmlkREJDb2x1bW4CDAYJU291cmNlRFBJAgYCYAYRRmlsdGVyUm93T3BlcmF0b3ICAgYBAAYKR3JvdXBJbmRleAIGAsO/BhRJc0NoaWxkSW5NZXJnZWRHcm91cAIJBgVGYWxzZQYFV2lkdGgCBgJ4Bg1BbGlnbm1lbnRIb3J6AgIGAQAGBUluZGV4AgYCAAYHVmlzaWJsZQIJBgRUcnVlBglTb3J0T3JkZXICCQYGc29Ob25lBglTb3J0SW5kZXgCBgLDvwYYV2FzVmlzaWJsZUJlZm9yZUdyb3VwaW5nAgkGBUZhbHNlBgpFeHByZXNzaW9uAgkSAAAAAAIABhxjeEdyaWREQlRhYmxlVmlld2ZsZENhdGVnb3J5Bg9UY3hHcmlkREJDb2x1bW4CDAYJU291cmNlRFBJAgYCYAYRRmlsdGVyUm93T3BlcmF0b3ICAgYBAAYKR3JvdXBJbmRleAIGAsO/BhRJc0NoaWxkSW5NZXJnZWRHcm91cAIJBgVGYWxzZQYFV2lkdGgCBgJ4Bg1BbGlnbm1lbnRIb3J6AgIGAQAGBUluZGV4AgYCAQYHVmlzaWJsZQIJBgRUcnVlBglTb3J0T3JkZXICCQYGc29Ob25lBglTb3J0SW5kZXgCBgLDvwYYV2FzVmlzaWJsZUJlZm9yZUdyb3VwaW5nAgkGBUZhbHNlBgpFeHByZXNzaW9uAgkSAAAAAAIABh1Db25kaXRpb25hbEZvcm1hdHRpbmdQcm92aWRlcgYkVGN4R3JpZENvbmRpdGlvbmFsRm9ybWF0dGluZ1Byb3ZpZGVyAgEGBUNvdW50AgYCAAIA"
 	}
 }

BIN
RESTDebugger.exe


+ 145 - 52
src/_frmMain.dfm

@@ -81,7 +81,7 @@ object frmMain: TfrmMain
       Left = 0
       Top = 0
       Width = 725
-      Height = 23
+      Height = 21
       Align = dalTop
       BarManager = dxBarManager
     end
@@ -117,25 +117,29 @@ object frmMain: TfrmMain
   end
   object PageControlResponse: TcxPageControl
     Left = 0
-    Top = 458
+    Top = 456
     Width = 725
-    Height = 432
+    Height = 434
     Align = alClient
     TabOrder = 3
     Properties.ActivePage = tabContent
     Properties.CustomButtons.Buttons = <>
-    ClientRectBottom = 430
+    ExplicitTop = 458
+    ExplicitHeight = 432
+    ClientRectBottom = 432
     ClientRectLeft = 2
     ClientRectRight = 723
-    ClientRectTop = 26
+    ClientRectTop = 23
     object tabContent: TcxTabSheet
       Caption = 'Response Content'
       ImageIndex = 0
+      ExplicitTop = 26
+      ExplicitHeight = 404
       object EditorContent: TSynEdit
         Left = 0
         Top = 31
         Width = 721
-        Height = 373
+        Height = 378
         Align = alClient
         Font.Charset = DEFAULT_CHARSET
         Font.Color = clWindowText
@@ -167,6 +171,7 @@ object frmMain: TfrmMain
         TabWidth = 2
         WantTabs = True
         FontSmoothing = fsmNone
+        ExplicitHeight = 373
       end
       object Panel2: TPanel
         Left = 0
@@ -181,17 +186,20 @@ object frmMain: TfrmMain
           Top = 6
           Caption = 'Auto format XML and JSON response'
           TabOrder = 0
+          Transparent = True
         end
       end
     end
     object tabHeaders: TcxTabSheet
       Caption = 'Response Headers'
       ImageIndex = 1
+      ExplicitTop = 26
+      ExplicitHeight = 404
       object EditorResponseHeaders: TSynEdit
         Left = 0
         Top = 0
         Width = 721
-        Height = 404
+        Height = 409
         Align = alClient
         Font.Charset = DEFAULT_CHARSET
         Font.Color = clWindowText
@@ -223,6 +231,7 @@ object frmMain: TfrmMain
         TabWidth = 2
         WantTabs = True
         FontSmoothing = fsmNone
+        ExplicitHeight = 404
       end
     end
   end
@@ -234,51 +243,48 @@ object frmMain: TfrmMain
     Align = alTop
     BevelOuter = bvNone
     TabOrder = 0
-    ExplicitLeft = -8
-    ExplicitTop = 71
     DesignSize = (
       725
       370)
     object Label2: TLabel
-      Left = 8
-      Top = 16
+      Left = 273
+      Top = 11
       Width = 40
       Height = 13
       Caption = 'Presets:'
     end
     object Label3: TLabel
-      Left = 97
+      Left = 362
       Top = 75
       Width = 49
       Height = 13
       Caption = 'Base URL:'
     end
     object Label4: TLabel
-      Left = 8
+      Left = 275
       Top = 329
       Width = 42
       Height = 13
       Anchors = [akLeft, akBottom]
       Caption = 'Full URL:'
-      ExplicitTop = 331
     end
     object Label6: TLabel
-      Left = 8
+      Left = 273
       Top = 74
       Width = 40
       Height = 13
       Caption = 'Method:'
     end
     object edtFullURL: TcxTextEdit
-      Left = 8
+      Left = 275
       Top = 343
       Anchors = [akLeft, akRight, akBottom]
       Properties.OnChange = edtFullURLPropertiesChange
       TabOrder = 8
-      Width = 545
+      Width = 275
     end
     object btnRun: TcxButton
-      Left = 637
+      Left = 634
       Top = 339
       Width = 75
       Height = 25
@@ -290,16 +296,16 @@ object frmMain: TfrmMain
       OnClick = btnRunClick
     end
     object edtBaseURL: TcxTextEdit
-      Left = 97
+      Left = 362
       Top = 91
       Anchors = [akLeft, akTop, akRight]
       Properties.OnChange = edtBaseURLPropertiesChange
       TabOrder = 6
-      Width = 615
+      Width = 345
     end
     object btnAdd: TcxButton
-      Left = 593
-      Top = 30
+      Left = 588
+      Top = 25
       Width = 25
       Height = 25
       Hint = 'Add Preset'
@@ -312,8 +318,8 @@ object frmMain: TfrmMain
       OnClick = btnAddClick
     end
     object btnDelete: TcxButton
-      Left = 687
-      Top = 30
+      Left = 682
+      Top = 25
       Width = 25
       Height = 25
       Hint = 'Delete Preset'
@@ -326,17 +332,17 @@ object frmMain: TfrmMain
       OnClick = btnDeleteClick
     end
     object comboPresets: TcxComboBox
-      Left = 8
-      Top = 32
+      Left = 273
+      Top = 27
       Anchors = [akLeft, akTop, akRight]
       Properties.DropDownListStyle = lsFixedList
       Properties.OnChange = comboPresetsPropertiesChange
       TabOrder = 0
-      Width = 579
+      Width = 309
     end
     object btnEdit: TcxButton
-      Left = 624
-      Top = 30
+      Left = 619
+      Top = 25
       Width = 25
       Height = 25
       Hint = 'Edit Preset'
@@ -349,8 +355,8 @@ object frmMain: TfrmMain
       OnClick = btnEditClick
     end
     object btnCopyPreset: TcxButton
-      Left = 656
-      Top = 30
+      Left = 651
+      Top = 25
       Width = 25
       Height = 25
       Hint = 'Copy Preset'
@@ -363,7 +369,7 @@ object frmMain: TfrmMain
       OnClick = btnCopyPresetClick
     end
     object comboMethod: TcxComboBox
-      Left = 8
+      Left = 273
       Top = 90
       Properties.DropDownListStyle = lsFixedList
       Properties.Items.Strings = (
@@ -377,9 +383,9 @@ object frmMain: TfrmMain
       Width = 83
     end
     object PageControlParams: TcxPageControl
-      Left = 8
-      Top = 132
-      Width = 706
+      Left = 273
+      Top = 127
+      Width = 436
       Height = 191
       Anchors = [akLeft, akTop, akRight, akBottom]
       TabOrder = 7
@@ -387,15 +393,17 @@ object frmMain: TfrmMain
       Properties.CustomButtons.Buttons = <>
       ClientRectBottom = 189
       ClientRectLeft = 2
-      ClientRectRight = 704
-      ClientRectTop = 26
+      ClientRectRight = 434
+      ClientRectTop = 23
       object tabURLParams: TcxTabSheet
         Caption = 'URL Parameters'
         ImageIndex = 0
+        ExplicitTop = 26
+        ExplicitHeight = 163
         object Panel3: TPanel
           Left = 0
           Top = 0
-          Width = 702
+          Width = 432
           Height = 31
           Align = alTop
           BevelOuter = bvNone
@@ -411,8 +419,8 @@ object frmMain: TfrmMain
         object EditorURLParams: TSynEdit
           Left = 0
           Top = 27
-          Width = 702
-          Height = 136
+          Width = 432
+          Height = 139
           Align = alBottom
           Anchors = [akLeft, akTop, akRight, akBottom]
           Font.Charset = DEFAULT_CHARSET
@@ -447,15 +455,18 @@ object frmMain: TfrmMain
           WantTabs = True
           OnChange = EditorURLParamsChange
           FontSmoothing = fsmNone
+          ExplicitHeight = 136
         end
       end
       object cxTabSheet2: TcxTabSheet
         Caption = 'Extra Headers'
         ImageIndex = 1
+        ExplicitTop = 26
+        ExplicitHeight = 163
         object Panel4: TPanel
           Left = 0
           Top = 0
-          Width = 702
+          Width = 432
           Height = 31
           Align = alTop
           BevelOuter = bvNone
@@ -471,8 +482,8 @@ object frmMain: TfrmMain
         object EditorExtraHeaders: TSynEdit
           Left = 0
           Top = 27
-          Width = 702
-          Height = 136
+          Width = 432
+          Height = 139
           Align = alBottom
           Anchors = [akLeft, akTop, akRight, akBottom]
           Font.Charset = DEFAULT_CHARSET
@@ -506,11 +517,14 @@ object frmMain: TfrmMain
           TabWidth = 2
           WantTabs = True
           FontSmoothing = fsmNone
+          ExplicitHeight = 136
         end
       end
       object cxTabSheet3: TcxTabSheet
         Caption = 'Authentication'
         ImageIndex = 3
+        ExplicitTop = 26
+        ExplicitHeight = 163
         object Label9: TLabel
           Left = 15
           Top = 47
@@ -530,6 +544,7 @@ object frmMain: TfrmMain
           Top = 11
           Caption = 'Use basic authentication'
           TabOrder = 0
+          Transparent = True
         end
         object edtAuthUsername: TcxTextEdit
           Left = 15
@@ -547,10 +562,12 @@ object frmMain: TfrmMain
       object tabPostData: TcxTabSheet
         Caption = 'Post Data'
         ImageIndex = 2
+        ExplicitTop = 26
+        ExplicitHeight = 163
         object Panel5: TPanel
           Left = 0
           Top = 0
-          Width = 702
+          Width = 432
           Height = 46
           Align = alTop
           BevelOuter = bvNone
@@ -579,8 +596,8 @@ object frmMain: TfrmMain
         object EditorPostData: TSynEdit
           Left = 0
           Top = 52
-          Width = 702
-          Height = 111
+          Width = 432
+          Height = 114
           Align = alBottom
           Anchors = [akLeft, akTop, akRight, akBottom]
           Font.Charset = DEFAULT_CHARSET
@@ -614,11 +631,12 @@ object frmMain: TfrmMain
           TabWidth = 2
           WantTabs = True
           FontSmoothing = fsmNone
+          ExplicitHeight = 111
         end
       end
     end
     object btnCopyFullURL: TcxButton
-      Left = 590
+      Left = 587
       Top = 339
       Width = 25
       Height = 25
@@ -632,7 +650,7 @@ object frmMain: TfrmMain
       OnClick = btnCopyFullURLClick
     end
     object btnPasteFullURL: TcxButton
-      Left = 559
+      Left = 556
       Top = 339
       Width = 25
       Height = 25
@@ -645,12 +663,59 @@ object frmMain: TfrmMain
       TabOrder = 11
       OnClick = btnPasteFullURLClick
     end
+    object cxGrid: TcxGrid
+      Left = 0
+      Top = 27
+      Width = 256
+      Height = 337
+      TabOrder = 12
+      object cxGridDBTableView: TcxGridDBTableView
+        Navigator.Buttons.CustomButtons = <>
+        Navigator.Buttons.First.Visible = False
+        Navigator.Buttons.PriorPage.Visible = False
+        Navigator.Buttons.Prior.Visible = False
+        Navigator.Buttons.Next.Visible = False
+        Navigator.Buttons.NextPage.Visible = False
+        Navigator.Buttons.Last.Visible = False
+        Navigator.Buttons.Insert.Visible = False
+        Navigator.Buttons.Append.Visible = True
+        Navigator.Buttons.Refresh.Visible = False
+        Navigator.Buttons.SaveBookmark.Visible = False
+        Navigator.Buttons.GotoBookmark.Visible = False
+        Navigator.Buttons.Filter.Visible = False
+        Navigator.Visible = True
+        FindPanel.DisplayMode = fpdmAlways
+        FindPanel.Location = fplGroupByBox
+        ScrollbarAnnotations.CustomAnnotations = <>
+        DataController.DataSource = dsPresets
+        DataController.Summary.DefaultGroupSummaryItems = <>
+        DataController.Summary.FooterSummaryItems = <>
+        DataController.Summary.SummaryGroups = <>
+        OptionsBehavior.ImmediateEditor = False
+        OptionsCustomize.ColumnHidingOnGrouping = False
+        OptionsData.Appending = True
+        OptionsView.NoDataToDisplayInfoText = '<No presets>'
+        object cxGridDBTableViewfldName: TcxGridDBColumn
+          Caption = 'Name'
+          DataBinding.FieldName = 'fldName'
+          Width = 120
+        end
+        object cxGridDBTableViewfldCategory: TcxGridDBColumn
+          Caption = 'Category'
+          DataBinding.FieldName = 'fldCategory'
+          Width = 120
+        end
+      end
+      object cxGridLevel1: TcxGridLevel
+        GridView = cxGridDBTableView
+      end
+    end
   end
   object cxSplitter1: TcxSplitter
     Left = 0
     Top = 446
     Width = 725
-    Height = 12
+    Height = 10
     AlignSplitter = salBottom
     Control = pnlHeader
   end
@@ -688,7 +753,7 @@ object frmMain: TfrmMain
   end
   object dxSkinController: TdxSkinController
     NativeStyle = False
-    SkinName = 'Office2016Colorful'
+    SkinName = 'Office2019Colorful'
     Left = 380
     Top = 35
   end
@@ -726,8 +791,8 @@ object frmMain: TfrmMain
     PopupMenuLinks = <>
     UseF10ForMenu = False
     UseSystemFont = True
-    Left = 135
-    Top = 35
+    Left = 105
+    Top = 15
     PixelsPerInch = 96
     object dxBarManagerBar1: TdxBar
       AllowClose = False
@@ -1892,8 +1957,13 @@ object frmMain: TfrmMain
     SortOptions = []
     Left = 135
     Top = 600
+    object memDataVariablesfldType: TStringField
+      FieldName = 'fldType'
+      Size = 10
+    end
     object memDataVariablesfldName: TStringField
       FieldName = 'fldName'
+      Size = 100
     end
     object memDataVariablesfldValue: TStringField
       FieldName = 'fldValue'
@@ -1905,4 +1975,27 @@ object frmMain: TfrmMain
     Left = 135
     Top = 670
   end
+  object memDataPresets: TdxMemData
+    Indexes = <>
+    SortOptions = []
+    Left = 375
+    Top = 725
+    object memDataPresetsfldGuid: TStringField
+      FieldName = 'fldGuid'
+      Size = 50
+    end
+    object memDataPresetsfldName: TStringField
+      FieldName = 'fldName'
+      Size = 50
+    end
+    object memDataPresetsfldCategory: TStringField
+      FieldName = 'fldCategory'
+      Size = 50
+    end
+  end
+  object dsPresets: TDataSource
+    DataSet = memDataPresets
+    Left = 375
+    Top = 790
+  end
 end

+ 70 - 3
src/_frmMain.pas

@@ -16,7 +16,10 @@ uses
   SynEdit, SynHighlighterJSON, SynEditHighlighter, SynHighlighterIni,
   SynHighlighterXML, SynHighlighterHtml, SynEditRegexSearch, SynEditMiscClasses,
   SynEditSearch, _SearchTextHightlighterSynEditPlugin, SynEditTypes, cxSplitter,
-  SynEditCodeFolding, dxCore, Data.DB, dxmdaset;
+  SynEditCodeFolding, dxCore, Data.DB, dxmdaset, cxStyles, cxCustomData,
+  cxFilter, cxData, cxDataStorage, cxNavigator, dxDateRanges,
+  dxScrollbarAnnotations, cxDBData, cxGridLevel, cxGridCustomView,
+  cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGrid;
 
 type
   TMethodType = (mtGET, mtPOST, mtPATCH, mtPUT, mtDELETE);
@@ -125,6 +128,17 @@ type
     memDataVariablesfldName: TStringField;
     memDataVariablesfldValue: TStringField;
     dsVariables: TDataSource;
+    memDataVariablesfldType: TStringField;
+    cxGridDBTableView: TcxGridDBTableView;
+    cxGridLevel1: TcxGridLevel;
+    cxGrid: TcxGrid;
+    memDataPresets: TdxMemData;
+    dsPresets: TDataSource;
+    memDataPresetsfldName: TStringField;
+    memDataPresetsfldCategory: TStringField;
+    cxGridDBTableViewfldName: TcxGridDBColumn;
+    cxGridDBTableViewfldCategory: TcxGridDBColumn;
+    memDataPresetsfldGuid: TStringField;
     procedure FormShow(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
@@ -252,7 +266,7 @@ implementation
 {$R *.dfm}
 
 uses System.NetEncoding, System.UITypes, _EncryptStr, JsonDataObjects, IdGlobal, System.IOUtils, uRwXmlDOM,
-  _frmBiggerEditor, IdUri, _frmSearch, ShellApi, _frmVariables;
+  _frmBiggerEditor, IdUri, _frmSearch, ShellApi, _frmVariables, RegularExpressions;
 
 procedure TfrmMain.tbbtnRunClick(Sender: TObject);
 begin
@@ -709,6 +723,9 @@ begin
 
   ActiveEditor := EditorContent;
   UpdateEditor(dmy);
+
+  ReplaceGlobalVar(dmy);
+
   ActiveEditor := EditorResponseHeaders;
   UpdateEditor(FHTTP.Response.RawHeaders.Text);
 end;
@@ -1213,6 +1230,7 @@ procedure TfrmMain.LoadProject;
 var
   strlist: TStringList;
   i: Integer;
+  strstream: TStringStream;
 begin
   if FIsTempProjectLoaded then
   begin
@@ -1276,6 +1294,20 @@ begin
   PageControlParams.ActivePage := tabURLParams;
   PageControlResponse.ActivePage := tabContent;
 
+  memDataPresets.Active := False;
+  memDataPresets.Active := True;
+  try
+    for i := 0 to FPresetsList.Count - 1 do
+    begin
+      memDataPresets.Append;
+      memDataPresetsfldGuid.Value := FPresetsList.Names[i];
+      memDataPresetsfldName.Value := Decode(FPresetsList.ValueFromIndex[i]);
+      memDataPresets.Post;
+    end;
+  finally
+    memDataPresets.Active := True;
+  end;
+
 
   strlist := TStringList.Create;
   try
@@ -1288,6 +1320,15 @@ begin
   end;
 
   UpdateFullURL;
+
+
+  strstream := TStringStream.Create;
+  try
+    strstream.DataString := Decode(FProjectConfig.ReadString('Main', 'GridViewPresets'));
+    strstream.
+  finally
+    strstream.Free;
+  end;
 end;
 
 procedure TfrmMain.pmnuPasteJsonContentClick(Sender: TObject);
@@ -1416,12 +1457,30 @@ begin
 end;
 
 function TfrmMain.ReplaceGlobalVar(const AText: string): string;
+var
+  match: string;
 begin
   Result := AText;
   memDataVariables.First;
   while not memDataVariables.Eof do
   begin
-    Result := StringReplace(Result, memDataVariablesfldName.Value, memDataVariablesfldValue.Value, [rfReplaceAll]);
+    if memDataVariablesfldType.Value = '' then
+    begin
+      memDataVariables.Edit;
+      memDataVariablesfldType.Value := 'Static';
+      memDataVariables.Post;
+      SaveProject;
+    end;
+
+    if memDataVariablesfldType.Value = 'RegEx' then
+    begin
+      match := TRegEx.Match(AText, memDataVariablesfldName.Value, [roMultiLine]).Value;
+    end
+    else
+    begin
+      Result := StringReplace(Result, memDataVariablesfldName.Value, memDataVariablesfldValue.Value, [rfReplaceAll]);
+    end;
+
     memDataVariables.Next;
   end;
 end;
@@ -1576,6 +1635,7 @@ end;
 procedure TfrmMain.SaveProject;
 var
   strlist: TStringList;
+  strstream: TStringStream;
 begin
   SavePreset;
 
@@ -1589,6 +1649,13 @@ begin
     strlist.Free;
   end;
 
+  strstream := TStringStream.Create;
+  try
+    cxGridDBTableView.StoreToStream(strstream);
+    FProjectConfig.WriteString('Main', 'GridViewPresets', Encode(strstream.DataString));
+  finally
+    strstream.Free;
+  end;
 
   FProjectConfig.Save;
 end;

+ 12 - 3
src/_frmVariables.dfm

@@ -26,7 +26,6 @@ object frmVariables: TfrmVariables
     Color = clWhite
     ParentBackground = False
     TabOrder = 0
-    ExplicitWidth = 751
     object Label1: TLabel
       Left = 25
       Top = 31
@@ -80,17 +79,27 @@ object frmVariables: TfrmVariables
       DataController.Summary.SummaryGroups = <>
       OptionsView.NoDataToDisplayInfoText = '< No variables defined >'
       OptionsView.GroupByBox = False
+      object cxGrid1DBTableView1fldType: TcxGridDBColumn
+        Caption = 'Type'
+        DataBinding.FieldName = 'fldType'
+        PropertiesClassName = 'TcxComboBoxProperties'
+        Properties.DropDownListStyle = lsFixedList
+        Properties.Items.Strings = (
+          'Static'
+          'RegEx')
+        Width = 83
+      end
       object cxGrid1DBTableView1fldName: TcxGridDBColumn
         Caption = 'Name'
         DataBinding.FieldName = 'fldName'
         SortIndex = 0
         SortOrder = soAscending
-        Width = 150
+        Width = 208
       end
       object cxGrid1DBTableView1fldValue: TcxGridDBColumn
         Caption = 'Value'
         DataBinding.FieldName = 'fldValue'
-        Width = 490
+        Width = 350
       end
     end
     object cxGrid1Level1: TcxGridLevel

+ 1 - 0
src/_frmVariables.pas

@@ -22,6 +22,7 @@ type
     cxGrid1: TcxGrid;
     cxGrid1DBTableView1fldName: TcxGridDBColumn;
     cxGrid1DBTableView1fldValue: TcxGridDBColumn;
+    cxGrid1DBTableView1fldType: TcxGridDBColumn;
     procedure cxButton1Click(Sender: TObject);
   private
     { Private-Deklarationen }