外部ビューアデバッガビジュアライザからオブジェクトまたはそのデータへの参照を取得するにはどうすればよいですか?

TJSONObjectまたはTJSONValueのデバッガビジュアライザを作成しようとしています。私はビジュアライザーのほとんどがうまく働いています。私が抱えている問題は、TJSONObjectへの参照、または少なくともTJSONObjectのtostring()値への参照を取得することです。

私が見たサンプルによると、ジェレミー・ノースが http:// edn
.embarcadero.com/article/40268

、IOTADebuggerVisualizerExternalViewer実装のShowメソッドから必要なものを取得する必要があります。具体的には、Expression、TypeName、およびEvalResultの文字列パラメータから取得します。

私が理解するところでは、Expressionは検査される変数の名前(可視化)、TypeNameは変数のクラス名、EvalResultは変数のデフォルトの文字列表現です。

簡単なテストのために私はTFemerの子孫にTMemoを配置しました。
IOTADebuggerVisualizerExternalViewer.Showメソッドから、Expression、TypeName、およびEvalResultを渡す、私のTFrameのShowJSONObjectメソッドを呼び出します。関連するコードがここに表示されます:

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メソッドからこれらの3つのパラメータの値を表示しようとしています。

ビジュアライザを使用して表示しようとした単純なTJSONObjectを次に示します。

var
 jo: TJSONObject;
begin
  jo := TJSONObject.Create;
  jo.AddPair('one', 'one');
  jo.AddPair('two', TJSONNumber.Create(1)); //a breakpoint here

結果は次のようになります。

A debugger visualizer under development

私は、EvalResultがTJSONObjectのtostring表現を返すことを期待していましたが、uninformative()を返しただけです。これは、ローカル変数ウィンドウにデフォルトで表示されるのと同じことです。

ビジュアライザが呼び出されたTJSONObjectのトーストリング表現か、実際のオブジェクトのハンドルかを取得することで、その値を分解して表示できますか?

ベストアンサー

このプロシージャを使用して(ToString呼び出しを含む)式を評価する必要があります(ここで宣言されていないローカル変数を使用できるように、私自身のビジュアライザソースからコピーしたものです)。

function TJSONViewerFrame.Evaluate(Expression: string): string;
var
  CurProcess: IOTAProcess;
  CurThread: IOTAThread;
  ResultStr: array[0..4095] of Char;
  CanModify: Boolean;
  ResultAddr, ResultSize, ResultVal: LongWord;
  EvalRes: TOTAEvaluateResult;
  DebugSvcs: IOTADebuggerServices;
begin
  begin
    Result := '';
    if Supports(BorlandIDEServices, IOTADebuggerServices, DebugSvcs) then
      CurProcess := DebugSvcs.CurrentProcess;
    if CurProcess <> nil then
    begin
      CurThread := CurProcess.CurrentThread;
      if CurThread <> nil then
      begin
        EvalRes := CurThread.Evaluate(Expression, @ResultStr, Length(ResultStr),
          CanModify, eseAll, '', ResultAddr, ResultSize, ResultVal, '', 0);
        case EvalRes of
          erOK: Result := ResultStr;
          erDeferred:
            begin
              FCompleted := False;
              FDeferredResult := '';
              FDeferredError := False;
              FNotifierIndex := CurThread.AddNotifier(Self);
              while not FCompleted do
                DebugSvcs.ProcessDebugEvents;
              CurThread.RemoveNotifier(FNotifierIndex);
              FNotifierIndex := -1;
              if not FDeferredError then
              begin
                if FDeferredResult <> '' then
                  Result := FDeferredResult
                else
                  Result := ResultStr;
              end;
            end;
          erBusy:
            begin
              DebugSvcs.ProcessDebugEvents;
              Result := Evaluate(Expression);
            end;
        end;
      end;
    end;
  end;
end;

これで、Show関数を次のように置き換えることができます:

AFrame.ShowJSONObject(Expression, TypeName, Evaluate(Expression + '.ToString'));

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です