尝试使用TDataset调试器Visualiser - AV

时间:2015-04-13 15:22:41

标签: delphi delphi-xe

我正在尝试为TDatasets创建一个简单的调试可视化器(好吧,我现在必须将它变为TADODataset,所以我可以使用.SaveToFile方法)。

我已经复制了EMBT提供的TStrings visualiser示例,但是在显示表单时遇到了问题,因为它给了我一个没有显示任何数据的AV。

AV中的callstack的顶部部分如下所示:

[5003C49E]{rtl150.bpl  } System.@UStrAsg (Line 17745, "System.pas" + 30) + $0
[149038D1]{DatasetVisualiserProject.bpl} Datasetvisualiserframe.TDatasetVisualiserFrame.ThreadNotify + $151
[20A2CA9A]{coreide150.bpl} DebuggerMgr.TDebuggerMgr.OnShowVisualizer (Line 1112, "DebuggerMgr.pas" + 4) + $3B

所以这是字符串赋值的问题,可能是未分配的内存?与TStrings实现类似,我的ThreadNotify过程中没有代码。

我的'work'例程替换了TStrings实现的AddStringListItems调用,如下所示:

procedure TDatasetVisualiserFrame.SetDataset(const Expression, TypeName, EvalResult: string);
var
  TempFilename: string;
begin
  FAvailableState := asAvailable;
  FExpression := Expression;
  IntDataset.Close;

  TempFileName := GetTempFile('DSDebug');
  try
    if FTypeName = TADODataset.Classname then
    begin
      Evaluate(Format('%s.SaveToFile(%s)', [FExpression, TempFileName]));

      IntDataset_ADO.LoadFromFile(TempFileName);
      srcIntDataset.DataSet := IntDataset_ADO;
    end
    else if FTypeName = TKBMMemTable.Classname then
    begin
      Evaluate(Format('%s.SaveToFile(%s)', [FExpression, TempFileName]));
      IntDataset.LoadFromFile(TempFileName);
      srcIntDataset.DataSet := IntDataset;
    end
    else raise Exception.Create('Unhandled class type ' + TypeName);
  finally
    if fileexists(TempFileName) then
    begin
      DeleteFile(TempFileName);
    end;
  end;

  DebugDatasetView.beginupdate;
  try
    DebugDatasetView.ClearItems;
    DebugDatasetView.DataController.CreateAllItems(false);
  finally
    DebugDatasetView.endupdate;
  end;
end;

框架本身有一个TADODataset,Datasource和一个用于显示的QuantumGrid组件(尽管DBGrid应该可以工作)

我是否需要对线程处理做一些事情,因为我正在处理数据集或者它是更基本的东西?

作为一个额外的问题:我最初的计划是采用TDataset并使用KBMMemTable的LoadFromDataset例程传入原始数据集,但在启动后不久我发现我只能从调试器中获取字符串,所以这是不可能的。我错了,还是有一种狡猾的方式呢?

1 个答案:

答案 0 :(得分:2)

在获得如何调试IDE的方法后(感谢@David M),我注意到我没有正确实现FrameCreated

除此之外,SaveToFile还需要使用QuotedStr的文件名,否则文件将被创建为空,LoadFromFile将因空流而失败。

现在它完美无缺: - )