Так-с, сделать задуманное таки получилось. Для этого я использовал метод Evaluate, который содрал из StringListVisualizer, там говорится следующее:
function TTDoublePointArrayVisualizerFrame.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;
Сумасшедший дом да?
Вызываю я это так:
procedure TTDoublePointArrayVisualizerFrame.RefreshVisualizer(const Expression,
TypeName, EvalResult: string);
var
H, L: Integer;
I: Integer;
X: Double;
Y: Double;
begin
L := StrToInt(Evaluate(Format('Low(%s)', [Expression])));
H := StrToInt(Evaluate(Format('High(%s)', [Expression])));
for I := L to H do
begin
X := StrToInt(Evaluate(Format('%s[%d].X', [Expression, I])));
Y := StrToInt(Evaluate(Format('%s[%d].Y', [Expression, I])));
Series1.AddXY(X, Y);
end;
end;
Невероятно долго но это работает.
Для того, чтобы визуализатор стал действительно полезным нужно сделать быстрее. Есть предложения?