Конференция "Компоненты" » Как получить саму переменную в визуализаторе.
 
  • Kolan © (09.10.09 00:15) [0]
    Здравствуйте!

    Разбираюсь с визуализаторами (это такой новый тип эксперта в Делфи 2010).

    Если я правильно понял, то в метод
    Show

    , который описан в
    IOTADebuggerVisualizerExternalViewer

    данные попадают в параметре
    EvalResult

    в виде строки, которую затем надо парсить.

    А можно ли получить саму переменную?

    Зачем мне это нужно: я хочу написать визуализатор для массива. Парсить строку, которая показывается в ИДЕ противно, но возможно, а вот если массив длинный, то показать его не получится вовсе, так как строка обрывается:
    (21, 67), (89, 1), (39, 9...

  • Kolan © (10.10.09 00:19) [1]
    Так-с, сделать задуманное таки получилось. Для этого я использовал метод 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;



    Невероятно долго но это работает.

    Для того, чтобы визуализатор стал действительно полезным нужно сделать быстрее. Есть предложения?
 
Конференция "Компоненты" » Как получить саму переменную в визуализаторе.
Есть новые Нет новых   [120275   +42][b:0][p:0.002]