Simon Grossenbacher 3 年 前
コミット
bf031c5b9f
8 ファイル変更187 行追加122 行削除
  1. 21 5
      Example Config.rdproj
  2. BIN
      RESTDebugger.exe
  3. 4 4
      prj/RESTDebugger.dproj
  4. BIN
      prj/RESTDebugger.res
  5. 5 1
      src/_frmMain.dfm
  6. 140 106
      src/_frmMain.pas
  7. 16 6
      src/_frmVariables.dfm
  8. 1 0
      src/_frmVariables.pas

+ 21 - 5
Example Config.rdproj

@@ -1,6 +1,6 @@
 {
 	"Presets": {
-		"LastUsed": "7d37b798c22748eebf92ffa281ba982a",
+		"LastUsed": "faf2be76254543f9ad9cc8fca91cef5e",
 		"ConfigVersion": 3
 	},
 	"Preset_faf2be76254543f9ad9cc8fca91cef5e": {
@@ -24,7 +24,7 @@
 		"Method": 0,
 		"URLParams": "",
 		"PostData": "",
-		"ExtraHeaders": "X-TestHeader=TestValue\r\nX-TestHeaderBaseURL=%BaseURL%",
+		"ExtraHeaders": "X-TestHeader=TestValue\r\nX-TestHeaderBaseURL=%BaseURL%\r\nX-TestDynamicVAR=%DynamicVar%\r\nX-TestXMLHeader=%DynamicVarXML%",
 		"PostDataContentType": "application/json",
 		"UseBasicAuth": false,
 		"AuthUsername": "",
@@ -33,7 +33,7 @@
 		"PresetName": "GET: GET Extra Headers",
 		"Guid": "7d37b798c22748eebf92ffa281ba982a",
 		"Notes": "PHA+R0VUIHJlcXVlc3Qgd2l0aCBoZWFkZXJzLjwvcD4=",
-		"Category": "Login"
+		"Category": ""
 	},
 	"Preset_777045dda27d466fab6c051d3e8094e8": {
 		"BaseURL": "%BaseURL%/basic-auth/user/pwd",
@@ -132,7 +132,23 @@
 		"Category": ""
 	},
 	"Main": {
-		"GlobalVar": "fldType\tfldXPath\tfldName\tfldValue\r\nStatic\t\t%CustomPostData%\tData 1\r\nStatic\t\t%BaseURL%\thttps://httpbin.org\r\n",
-		"GridViewPresets": "Bhlmcm1NYWluLmN4R3JpZERCVGFibGVWaWV3BhJUY3hHcmlkREJUYWJsZVZpZXcCCQYJU291cmNlRFBJAgYCYAYGRm9vdGVyAgkGBUZhbHNlBgpHcm91cEJ5Qm94AgkGBFRydWUGDEdyb3VwRm9vdGVycwICBgEABgpOZXdJdGVtUm93AgkGBUZhbHNlBhhFZGl0Rm9ybVVzZURlZmF1bHRMYXlvdXQCCQYEVHJ1ZQYTUm93VXNlRGVmYXVsdExheW91dAIJBgRUcnVlBh9Db2x1bW5zUXVpY2tDdXN0b21pemF0aW9uU29ydGVkAgkGBUZhbHNlBgdWZXJzaW9uAgIGAQECAwYYY3hHcmlkREJUYWJsZVZpZXdmbGROYW1lBg9UY3hHcmlkREJDb2x1bW4CDAYJU291cmNlRFBJAgYCYAYRRmlsdGVyUm93T3BlcmF0b3ICAgYBAAYKR3JvdXBJbmRleAIGAsO/BhRJc0NoaWxkSW5NZXJnZWRHcm91cAIJBgVGYWxzZQYFV2lkdGgCBgPFvgAGDUFsaWdubWVudEhvcnoCAgYBAAYFSW5kZXgCBgIABgdWaXNpYmxlAgkGBFRydWUGCVNvcnRPcmRlcgIJBgZzb05vbmUGCVNvcnRJbmRleAIGAsO/BhhXYXNWaXNpYmxlQmVmb3JlR3JvdXBpbmcCCQYFRmFsc2UGCkV4cHJlc3Npb24CCRIAAAAAAgAGHGN4R3JpZERCVGFibGVWaWV3ZmxkQ2F0ZWdvcnkGD1RjeEdyaWREQkNvbHVtbgIMBglTb3VyY2VEUEkCBgJgBhFGaWx0ZXJSb3dPcGVyYXRvcgICBgEABgpHcm91cEluZGV4AgYCAAYUSXNDaGlsZEluTWVyZ2VkR3JvdXACCQYFRmFsc2UGBVdpZHRoAgYCUwYNQWxpZ25tZW50SG9yegICBgEABgVJbmRleAIGAgEGB1Zpc2libGUCCQYEVHJ1ZQYJU29ydE9yZGVyAgkGC3NvQXNjZW5kaW5nBglTb3J0SW5kZXgCBgIABhhXYXNWaXNpYmxlQmVmb3JlR3JvdXBpbmcCCQYEVHJ1ZQYKRXhwcmVzc2lvbgIJEgAAAAACAAYdQ29uZGl0aW9uYWxGb3JtYXR0aW5nUHJvdmlkZXIGJFRjeEdyaWRDb25kaXRpb25hbEZvcm1hdHRpbmdQcm92aWRlcgIBBgVDb3VudAIGAgACAA=="
+		"GlobalVar": "fldType\tfldXPath\tfldContent\tfldName\tfldValue\r\nStatic\t\t\t%CustomPostData%\tData 1\r\nXPath\theaders.X-Amzn-Trace-Id\tJSON\t%DynamicVar%\tRoot=1-629cf540-0bde6f12023d5f4013c54b24\r\nXPath\t/slideshow/slide/title\tXML\t%DynamicVarXML%\tWake up to WonderWidgets!\r\nStatic\t\t\t%BaseURL%\thttps://httpbin.org\r\n",
+		"GridViewPresets": "Bhlmcm1NYWluLmN4R3JpZERCVGFibGVWaWV3BhJUY3hHcmlkREJUYWJsZVZpZXcCCQYJU291cmNlRFBJAgYCYAYGRm9vdGVyAgkGBUZhbHNlBgpHcm91cEJ5Qm94AgkGBFRydWUGDEdyb3VwRm9vdGVycwICBgEABgpOZXdJdGVtUm93AgkGBUZhbHNlBhhFZGl0Rm9ybVVzZURlZmF1bHRMYXlvdXQCCQYEVHJ1ZQYTUm93VXNlRGVmYXVsdExheW91dAIJBgRUcnVlBh9Db2x1bW5zUXVpY2tDdXN0b21pemF0aW9uU29ydGVkAgkGBUZhbHNlBgdWZXJzaW9uAgIGAQECAwYYY3hHcmlkREJUYWJsZVZpZXdmbGROYW1lBg9UY3hHcmlkREJDb2x1bW4CDAYJU291cmNlRFBJAgYCYAYRRmlsdGVyUm93T3BlcmF0b3ICAgYBAAYKR3JvdXBJbmRleAIGAsO/BhRJc0NoaWxkSW5NZXJnZWRHcm91cAIJBgVGYWxzZQYFV2lkdGgCBgPFvgAGDUFsaWdubWVudEhvcnoCAgYBAAYFSW5kZXgCBgIABgdWaXNpYmxlAgkGBFRydWUGCVNvcnRPcmRlcgIJBgtzb0FzY2VuZGluZwYJU29ydEluZGV4AgYCAAYYV2FzVmlzaWJsZUJlZm9yZUdyb3VwaW5nAgkGBUZhbHNlBgpFeHByZXNzaW9uAgkSAAAAAAIABhxjeEdyaWREQlRhYmxlVmlld2ZsZENhdGVnb3J5Bg9UY3hHcmlkREJDb2x1bW4CDAYJU291cmNlRFBJAgYCYAYRRmlsdGVyUm93T3BlcmF0b3ICAgYBAAYKR3JvdXBJbmRleAIGAsO/BhRJc0NoaWxkSW5NZXJnZWRHcm91cAIJBgVGYWxzZQYFV2lkdGgCBgJTBg1BbGlnbm1lbnRIb3J6AgIGAQAGBUluZGV4AgYCAQYHVmlzaWJsZQIJBgRUcnVlBglTb3J0T3JkZXICCQYGc29Ob25lBglTb3J0SW5kZXgCBgLDvwYYV2FzVmlzaWJsZUJlZm9yZUdyb3VwaW5nAgkGBFRydWUGCkV4cHJlc3Npb24CCRIAAAAAAgAGHUNvbmRpdGlvbmFsRm9ybWF0dGluZ1Byb3ZpZGVyBiRUY3hHcmlkQ29uZGl0aW9uYWxGb3JtYXR0aW5nUHJvdmlkZXICAQYFQ291bnQCBgIAAgA="
+	},
+	"Preset_6fb33f0e705f4c63b30dc64e98b71183": {
+		"BaseURL": "%BaseURL%/xml",
+		"Method": 0,
+		"URLParams": "",
+		"PostData": "",
+		"ExtraHeaders": "",
+		"PostDataContentType": "application/json",
+		"UseBasicAuth": false,
+		"AuthUsername": "",
+		"AuthPassword": "",
+		"ResponseAutoFormat": true,
+		"PresetName": "GET: Simple GET XML",
+		"Guid": "6fb33f0e705f4c63b30dc64e98b71183",
+		"Notes": "PHA+U2ltcGxlIEdFVCByZXF1ZXN0LjwvcD4=",
+		"Category": ""
 	}
 }

BIN
RESTDebugger.exe


+ 4 - 4
prj/RESTDebugger.dproj

@@ -153,14 +153,14 @@
     </PropertyGroup>
     <PropertyGroup Condition="'$(Cfg_2_Win64)'!=''">
         <BT_BuildType>Debug</BT_BuildType>
-        <VerInfo_Keys>FileVersion=2.3.18.77;ProductVersion=1.0.0.0;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName)</VerInfo_Keys>
-        <VerInfo_Release>18</VerInfo_Release>
-        <VerInfo_Build>77</VerInfo_Build>
+        <VerInfo_Keys>FileVersion=2.4.20.80;ProductVersion=1.0.0.0;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName)</VerInfo_Keys>
+        <VerInfo_Release>20</VerInfo_Release>
+        <VerInfo_Build>80</VerInfo_Build>
         <AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
         <VerInfo_Locale>1033</VerInfo_Locale>
         <Icon_MainIcon>RESTDebugger_Icon.ico</Icon_MainIcon>
         <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
-        <VerInfo_MinorVer>3</VerInfo_MinorVer>
+        <VerInfo_MinorVer>4</VerInfo_MinorVer>
         <AppDPIAwarenessMode>PerMonitor</AppDPIAwarenessMode>
         <VerInfo_MajorVer>2</VerInfo_MajorVer>
     </PropertyGroup>

BIN
prj/RESTDebugger.res


+ 5 - 1
src/_frmMain.dfm

@@ -1065,7 +1065,6 @@ object frmMain: TfrmMain
       Hint = 'Format XML'
       Visible = ivAlways
       ImageIndex = 16
-      OnClick = pmnuFormatXMLClick
     end
     object pmnuCompactXML: TdxBarButton
       Caption = 'Compact XML'
@@ -2068,6 +2067,7 @@ object frmMain: TfrmMain
     Options.AutoDetectEnabled = False
     Options.AutoDetectLineLimit = 0
     Options.Visible = False
+    CommentAttri.Background = clWhite
     WantBracesParsed = False
     Left = 640
     Top = 256
@@ -2101,6 +2101,10 @@ object frmMain: TfrmMain
       FieldName = 'fldXPath'
       Size = 100
     end
+    object memDataVariablesfldContent: TStringField
+      FieldName = 'fldContent'
+      Size = 10
+    end
     object memDataVariablesfldName: TStringField
       FieldName = 'fldName'
       Size = 100

+ 140 - 106
src/_frmMain.pas

@@ -150,6 +150,7 @@ type
     memDataVariablesfldXPath: TStringField;
     dxBarSubItem9: TdxBarSubItem;
     tbbtnWebServicePerformance: TdxBarButton;
+    memDataVariablesfldContent: TStringField;
     procedure FormShow(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
@@ -177,7 +178,6 @@ type
     procedure tbbtnAutoOpenLastUsedClick(Sender: TObject);
     procedure dxBarButton2Click(Sender: TObject);
     procedure tbbtnAutoSaveProjectClick(Sender: TObject);
-    procedure pmnuFormatJsonContentClick(Sender: TObject);
     procedure EditorContentMouseUp(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: Integer);
     procedure EditorPostDataMouseUp(Sender: TObject; Button: TMouseButton;
@@ -194,7 +194,6 @@ type
     procedure btnCopyFullURLClick(Sender: TObject);
     procedure EditorURLParamsMouseUp(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: Integer);
-    procedure pmnuFormatXMLClick(Sender: TObject);
     procedure pmnuCompactXMLClick(Sender: TObject);
     procedure comboPostContentTypePropertiesChange(Sender: TObject);
     procedure pmnuBiggerEditorClick(Sender: TObject);
@@ -218,6 +217,7 @@ type
     procedure memDataPresetsBeforeScroll(DataSet: TDataSet);
     procedure cxGridDBTableViewDblClick(Sender: TObject);
     procedure tbbtnWebServicePerformanceClick(Sender: TObject);
+    procedure pmnuFormatJsonContentClick(Sender: TObject);
   private
     FProjectConfig: TJSONConfig;
     FActiveProject: string;
@@ -225,6 +225,7 @@ type
     FTempProjectFile: string;
     FRoamingSavePath: string;
     FSearchFromCaret: Boolean;
+    FLastResponseContent: string;
     FHTTP: TIdHTTP;
     function GetTempProjectFile: string;
     procedure UpdateFullURL;
@@ -246,6 +247,7 @@ type
     function Encode(const AText: string): string;
     function Decode(const AText: string): string;
     function ReplaceGlobalVar(const AText: string): string;
+    procedure ParseAndFormatJsonAndXML(const AFormatted: Boolean);
     function GetAppVersion: string;
   public
     MainConfig: TJSONConfig;
@@ -702,6 +704,11 @@ begin
   ActiveEditor.CutToClipboard;
 end;
 
+procedure TfrmMain.pmnuFormatJsonContentClick(Sender: TObject);
+begin
+  ParseAndFormatJsonAndXML(True);
+end;
+
 procedure TfrmMain.DeactivatePresetEvents;
 begin
   memDataPresets.BeforeScroll := nil;
@@ -1389,6 +1396,134 @@ begin
   end;
 end;
 
+procedure TfrmMain.ParseAndFormatJsonAndXML(const AFormatted: Boolean);
+var
+  ja: TJsonArray;
+  jo: TJsonObject;
+  xml: TRwDomDocument;
+begin
+  if ActiveEditor.Lines.Count > 0 then
+  begin
+    if Length(ActiveEditor.Lines[0]) > 0 then
+    begin
+      if Pos('/json', FLastResponseContent) > 0 then
+      begin
+        EditorContent.Highlighter := SynJSONSyn;
+
+        if ActiveEditor.Lines[0][1] = '{' then
+        begin
+          jo := TJsonObject.Create;
+          Screen.Cursor := crHourGlass;
+          try
+            try
+              jo.FromJSON(ActiveEditor.Lines.Text);
+            except
+              on E: Exception do
+              begin
+                ShowError(E.Message);
+              end;
+            end;
+            UpdateEditor(jo.ToJSON(not AFormatted));
+
+            memDataVariables.First;
+            while not memDataVariables.Eof do
+            begin
+              if (memDataVariablesfldType.Value = 'XPath') and (memDataVariablesfldContent.Value = 'JSON') then
+              begin
+                memDataVariables.Edit;
+                memDataVariablesfldValue.Value := jo.Path[memDataVariablesfldXPath.Value].Value;
+                memDataVariables.Post;
+                SaveProject;
+              end;
+              memDataVariables.Next;
+            end;
+
+          finally
+            Screen.Cursor := crDefault;
+            jo.Free;
+          end;
+        end
+        else
+        if ActiveEditor.Lines[0][1] = '[' then
+        begin
+          ja := TJsonArray.Create;
+          Screen.Cursor := crHourGlass;
+          try
+            try
+              ja.FromJSON(ActiveEditor.Lines.Text);
+            except
+              on E: Exception do
+              begin
+                ShowError(E.Message);
+              end;
+            end;
+            UpdateEditor(ja.ToJSON(not AFormatted));
+
+            // XPath not supported on Json Arrays only Json Objects, do nothing here
+
+          finally
+            Screen.Cursor := crDefault;
+            ja.Free;
+          end;
+        end;
+      end
+      else
+      if Pos('/xml', FLastResponseContent) > 0 then
+      begin
+        EditorContent.Highlighter := SynXMLSyn;
+
+        xml := TRwDOMDocument.Create;
+        try
+          Screen.Cursor := crHourGlass;
+          xml.LoadXML(ActiveEditor.Lines.Text);
+          if AFormatted then
+          begin
+            UpdateEditor(xml.FormattedXML);
+          end
+          else
+          begin
+            UpdateEditor(xml.XML);
+          end;
+
+          memDataVariables.First;
+          while not memDataVariables.Eof do
+          begin
+            if (memDataVariablesfldType.Value = 'XPath') and (memDataVariablesfldContent.Value = 'XML') then
+            begin
+              memDataVariables.Edit;
+              try
+                if Assigned(xml.SelectSingleNode(memDataVariablesfldXPath.Value)) then
+                begin
+                  memDataVariablesfldValue.Value := xml.SelectSingleNode(memDataVariablesfldXPath.Value).NodeValue;
+                end;
+              except
+                ShowMessage('nei');
+              end;
+              memDataVariables.Post;
+              SaveProject;
+            end;
+            memDataVariables.Next;
+          end;
+
+
+        finally
+          xml.Free;
+          Screen.Cursor := crDefault;
+        end;
+      end
+      else
+      if Pos('text/html', FLastResponseContent) > 0 then
+      begin
+        EditorContent.Highlighter := SynHTMLSyn;
+      end
+      else
+      begin
+        EditorContent.Highlighter := nil;
+      end;
+    end;
+  end;
+end;
+
 procedure TfrmMain.pmnuPasteJsonContentClick(Sender: TObject);
 begin
   ActiveEditor.PasteFromClipboard;
@@ -1447,73 +1582,6 @@ begin
   end;
 end;
 
-procedure TfrmMain.pmnuFormatJsonContentClick(Sender: TObject);
-var
-  ja: TJsonArray;
-  jo: TJsonObject;
-begin
-  if ActiveEditor.Lines.Count > 0 then
-  begin
-    if Length(ActiveEditor.Lines[0]) > 0 then
-    begin
-      if ActiveEditor.Lines[0][1] = '{' then
-      begin
-        jo := TJsonObject.Create;
-        Screen.Cursor := crHourGlass;
-        try
-          try
-            jo.FromJSON(ActiveEditor.Lines.Text);
-          except
-            on E: Exception do
-            begin
-              ShowError(E.Message);
-            end;
-          end;
-          UpdateEditor(jo.ToJSON(False));
-        finally
-          Screen.Cursor := crDefault;
-          jo.Free;
-        end;
-      end
-      else
-      if ActiveEditor.Lines[0][1] = '[' then
-      begin
-        ja := TJsonArray.Create;
-        Screen.Cursor := crHourGlass;
-        try
-          try
-            ja.FromJSON(ActiveEditor.Lines.Text);
-          except
-            on E: Exception do
-            begin
-              ShowError(E.Message);
-            end;
-          end;
-          UpdateEditor(ja.ToJSON(False));
-        finally
-          Screen.Cursor := crDefault;
-          ja.Free;
-        end;
-      end;
-    end;
-  end;
-end;
-
-procedure TfrmMain.pmnuFormatXMLClick(Sender: TObject);
-var
-  xml: TRwDomDocument;
-begin
-  xml := TRwDOMDocument.Create;
-  try
-    Screen.Cursor := crHourGlass;
-    xml.LoadXML(ActiveEditor.Lines.Text);
-    UpdateEditor(xml.FormattedXML);
-  finally
-    xml.Free;
-    Screen.Cursor := crDefault;
-  end;
-end;
-
 function TfrmMain.ReplaceGlobalVar(const AText: string): string;
 begin
   Result := AText;
@@ -1529,14 +1597,7 @@ begin
       SaveProject;
     end;
 
-    if memDataVariablesfldType.Value = 'XPath' then
-    begin
-      //match := TRegEx.Match(AText, memDataVariablesfldName.Value, [roMultiLine]).Value;
-    end
-    else
-    begin
-      Result := StringReplace(Result, memDataVariablesfldName.Value, memDataVariablesfldValue.Value, [rfReplaceAll]);
-    end;
+    Result := StringReplace(Result, memDataVariablesfldName.Value, memDataVariablesfldValue.Value, [rfReplaceAll]);
 
     memDataVariables.Next;
   end;
@@ -1624,35 +1685,8 @@ begin
       ActiveEditor := EditorContent;
       EditorContent.SetFocus;
 
-      if Pos('application/json', FHTTP.Response.ContentType) > 0 then
-      begin
-        EditorContent.Highlighter := SynJSONSyn;
-
-        if chkResponseAutoformat.Checked then
-        begin
-          pmnuFormatJsonContentClick(nil);
-        end;
-      end
-      else
-      if Pos('text/xml', FHTTP.Response.ContentType) > 0 then
-      begin
-        EditorContent.Highlighter := SynXMLSyn;
-
-        if chkResponseAutoformat.Checked then
-        begin
-          pmnuFormatXMLClick(nil);
-        end;
-      end
-      else
-      if Pos('text/html', FHTTP.Response.ContentType) > 0 then
-      begin
-        EditorContent.Highlighter := SynHTMLSyn;
-      end
-      else
-      begin
-        EditorContent.Highlighter := nil;
-      end;
-
+      FLastResponseContent := FHTTP.Response.ContentType;
+      ParseAndFormatJsonAndXML(chkResponseAutoformat.Checked);
 
 
       dxStatusBarResponse.Panels[0].Text := FormatFloat('Response Time: 0, ms', GetTickCount - tick);

+ 16 - 6
src/_frmVariables.dfm

@@ -5,7 +5,7 @@ object frmVariables: TfrmVariables
   BorderStyle = bsSingle
   Caption = 'Variables'
   ClientHeight = 461
-  ClientWidth = 648
+  ClientWidth = 716
   Color = clBtnFace
   Font.Charset = DEFAULT_CHARSET
   Font.Color = clWindowText
@@ -21,13 +21,14 @@ object frmVariables: TfrmVariables
   object Panel1: TPanel
     Left = 0
     Top = 0
-    Width = 648
+    Width = 716
     Height = 77
     Align = alTop
     BevelOuter = bvNone
     Color = clWhite
     ParentBackground = False
     TabOrder = 0
+    ExplicitWidth = 648
     object Label1: TLabel
       Left = 25
       Top = 31
@@ -43,8 +44,8 @@ object frmVariables: TfrmVariables
     end
   end
   object cxButton1: TcxButton
-    Left = 290
-    Top = 420
+    Left = 320
+    Top = 415
     Width = 75
     Height = 25
     Caption = 'Close'
@@ -54,11 +55,11 @@ object frmVariables: TfrmVariables
   object cxGrid1: TcxGrid
     Left = 0
     Top = 77
-    Width = 648
+    Width = 716
     Height = 325
     Align = alTop
     TabOrder = 2
-    ExplicitTop = 76
+    ExplicitWidth = 648
     object cxGrid1DBTableView1: TcxGridDBTableView
       Navigator.Buttons.CustomButtons = <>
       Navigator.Buttons.First.Visible = False
@@ -97,6 +98,15 @@ object frmVariables: TfrmVariables
         DataBinding.FieldName = 'fldXPath'
         Width = 200
       end
+      object cxGrid1DBTableView1fldContent: TcxGridDBColumn
+        Caption = 'Content'
+        DataBinding.FieldName = 'fldContent'
+        PropertiesClassName = 'TcxComboBoxProperties'
+        Properties.DropDownListStyle = lsEditFixedList
+        Properties.Items.Strings = (
+          'JSON'
+          'XML')
+      end
       object cxGrid1DBTableView1fldName: TcxGridDBColumn
         Caption = 'Name'
         DataBinding.FieldName = 'fldName'

+ 1 - 0
src/_frmVariables.pas

@@ -24,6 +24,7 @@ type
     cxGrid1DBTableView1fldValue: TcxGridDBColumn;
     cxGrid1DBTableView1fldType: TcxGridDBColumn;
     cxGrid1DBTableView1fldXPath: TcxGridDBColumn;
+    cxGrid1DBTableView1fldContent: TcxGridDBColumn;
     procedure cxButton1Click(Sender: TObject);
     procedure FormKeyPress(Sender: TObject; var Key: Char);
   private