我正在尝试为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例程传入原始数据集,但在启动后不久我发现我只能从调试器中获取字符串,所以这是不可能的。我错了,还是有一种狡猾的方式呢?
答案 0 :(得分:2)
在获得如何调试IDE的方法后(感谢@David M),我注意到我没有正确实现FrameCreated
。
除此之外,SaveToFile
还需要使用QuotedStr
的文件名,否则文件将被创建为空,LoadFromFile
将因空流而失败。
现在它完美无缺: - )