我正在尝试为 TJSONObject 或 TJSONValue 编写调试器可视化工具。我的大部分可视化工具都工作得很好。我遇到的问题是获取对 TJSONObject 的引用,或者至少是对 TJSONObject 的 tostring() 值的引用。
根据我看到的示例,以及 Jeremy North 在http://edn.embarcadero.com/article/40268上的精彩帖子,我应该从 IOTADebuggerVisualizerExternalViewer 实现的 Show 方法中得到我需要的东西。具体来说,来自 Expression、TypeName 和 EvalResult 字符串参数。
据我了解,Expression 是被检查(可视化)的变量的名称,TypeName 是变量的类名,而 EvalResult 是变量的默认字符串表示形式。
对于一个简单的测试,我在我的 TFrame 后代上放置了一个 TMemo。从 IOTADebuggerVisualizerExternalViewer.Show 方法中,我调用了 TFrame 的 ShowJSONObject 方法,并将 Expression、TypeName 和 EvalResult 传递给该方法。相关代码出现在这里:
function TDebuggerJSONVisualizer.Show(const Expression, TypeName, EvalResult: string;
SuggestedLeft, SuggestedTop: Integer):
IOTADebuggerVisualizerExternalViewerUpdater;
var
AForm: TCustomForm;
AFrame: TJSONViewerFrame;
VisDockForm: INTACustomDockableForm;
begin
VisDockForm := TJSONVisualizerForm.Create(Expression) as INTACustomDockableForm;
AForm := (BorlandIDEServices as INTAServices).CreateDockableForm(VisDockForm);
AForm.Left := SuggestedLeft;
AForm.Top := SuggestedTop;
(VisDockForm as IFrameFormHelper).SetForm(AForm);
AFrame := (VisDockForm as IFrameFormHelper).GetFrame as TJSONViewerFrame;
AFrame.ShowJSONObject(Expression, TypeName, EvalResult);
Result := AFrame as IOTADebuggerVisualizerExternalViewerUpdater;
end;
{ TStringListViewerFrame }
procedure TJSONViewerFrame.ShowJSONObject(const Expression, TypeName,
EvalResult: string);
begin
Memo1.Lines.Add(Expression);
Memo1.Lines.Add(TypeName);
Memo1.Lines.Add(EvalResult);
end;
如您所见,此时我只是尝试从 ShowJSONObject 方法中显示这三个参数的值。
这是我尝试使用可视化工具显示的简单 TJSONObject:
var
jo: TJSONObject;
begin
jo := TJSONObject.Create;
jo.AddPair('one', 'one');
jo.AddPair('two', TJSONNumber.Create(1)); //a breakpoint here
结果如下所示:
我希望 EvalResult 会返回 TJSONObject 的 tostring 表示,但它只返回无信息的 (),这与您在局部变量窗口中默认看到的内容相同。
如何获取为其调用可视化工具的 TJSONObject 的 tostring 表示或实际对象的句柄,以便我可以解构并显示其值?