Отсутствует реализация для метода интерфейса ToolsAPI при обновлении до Delphi 10.4 Sydney

Я установил Delphi 10.4 Sydney с патчем 2 на новую виртуальную машину и скопировал на нее исходники Delphi 10.3 Tokyo.

При перестройке визуализатора (для DevExpress TcxSchedulerEvents) я получаю такую ​​ошибку:

[Ошибка dcc32] EventVisualizr.pas(19): E2291 Отсутствует реализация метода интерфейса IOTAThreadNotifier.EvaluateComplete

Я удалил только скомпилированные пакеты cxLibraryRS26, cxSchedulerRS26, dxCoreRS26, dxGDIPlusRS26, и добавил cxLibraryRS27, cxSchedulerRS27, dxCoreRS27, dxGDIPlusRS27 - никаких других изменений кода:

Я получаю сообщение об ошибке в первой строке TEventViewerFrame определение типа:

unit EventVisualizr;
// Copied and modified from TStringListVisualizer. Shows values for TcxSchedulerEvent properties:
// - ID
// - Caption
// - Custom property tt_fromdate (if it exists)
// - Custom property tt_todate (if it exists)
// - Start
// - Finish

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ToolsAPI, Vcl.ExtCtrls;

type
  TAvailableState = (asAvailable, asProcRunning, asOutOfScope, asNotAvailable);

  TEventViewerFrame = class(TFrame, IOTADebuggerVisualizerExternalViewerUpdater, IOTAThreadNotifier, IOTAThreadNotifier160)
    EventListView: TListView;
    procedure EventListViewData(Sender: TObject; Item: TListItem);
  private
    FOwningForm: TCustomForm;
    FClosedProc: TOTAVisualizerClosedProcedure;
    FNotifierIndex: Integer;
    FCompleted: Boolean;
    FDeferredResult: string;
    FDeferredError: Boolean;
    FPropValues,
    FPropNames: TStrings;
    FAvailableState: TAvailableState;
    function Evaluate(Expression: string): string;
  protected
    procedure SetParent(AParent: TWinControl); override;
  public
    procedure CloseVisualizer;
    procedure MarkUnavailable(Reason: TOTAVisualizerUnavailableReason);
    procedure RefreshVisualizer(const Expression, TypeName, EvalResult: string);
    procedure SetClosedCallback(ClosedProc: TOTAVisualizerClosedProcedure);
    procedure SetForm(AForm: TCustomForm);
    procedure AddEventItems(const Expression, TypeName, EvalResult: string);

    { IOTAThreadNotifier }
    procedure AfterSave;
    procedure BeforeSave;
    procedure Destroyed;
    procedure Modified;
    procedure ThreadNotify(Reason: TOTANotifyReason);
    procedure EvaluteComplete(const ExprStr, ResultStr: string; CanModify: Boolean;
      ResultAddress, ResultSize: LongWord; ReturnCode: Integer);
    procedure ModifyComplete(const ExprStr, ResultStr: string; ReturnCode: Integer);

    { IOTAThreadNotifier160 }
    procedure EvaluateComplete(const ExprStr, ResultStr: string; CanModify: Boolean;
      ResultAddress: TOTAAddress; ResultSize: LongWord; ReturnCode: Integer);
  end;

в ToolsAPI.pas, оба имеют EvaluateComplete определение, но без реализации в этом исходном файле:

IOTAThreadNotifier = interface(IOTANotifier)
  ['{34B2E2D7-E36F-11D1-AB0E-00C04FB16FB3}']
  { This is called when the process state changes for this thread }
  procedure ThreadNotify(Reason: TOTANotifyReason);
  { This is called when an evaluate that returned erDeferred completes.
    ReturnCode <> 0 if error }
  procedure EvaluateComplete(const ExprStr, ResultStr: string; CanModify: Boolean;
    ResultAddress, ResultSize: LongWord; ReturnCode: Integer);
  { This is called when a modify that returned erDeferred completes.
    ReturnCode <> 0 if error }
  procedure ModifyComplete(const ExprStr, ResultStr: string; ReturnCode: Integer);
end;

IOTAThreadNotifier160 = interface(IOTAThreadNotifier)
  ['{46F94C52-E225-4054-A5F0-F5E67E29B2C2}']
  { This is called when an evaluate that returned erDeferred completes.
    ReturnCode <> 0 if error }
  procedure EvaluateComplete(const ExprStr, ResultStr: string; CanModify: Boolean;
    ResultAddress: TOTAAddress; ResultSize: LongWord; ReturnCode: Integer); overload;
end;

При сравнении файлов ToolsAPI я вижу:

  • Он был назван EvaluteComplete (отсутствует 'a') в 10.3, и это было исправлено в EvaluateComplete
  • В IOTAThreadNotifier160.EvaluateComplete теперь получает директиву о перегрузке (конечно, и не имеет отношения к проблеме, я думаю)

Может ли это изменение имени быть причиной? Нет "реализации" дляEvaluateComplete процедуры также и в версии 10.3 (что, кажется, нормально, исходя из того очень мало, что я знаю об интерфейсах).

Из Почему я получаю сообщение об ошибке Отсутствует реализация метода интерфейса в Delphi XE2? и Почему я получаю сообщение об ошибке Отсутствует реализация?, Я понимаю, что причиной ошибки может быть то, что списки параметров различаются, но я не знаю, где искать правильные в этом случае.

1 ответ

Решение

Ваш TEventViewerFrame все еще содержит реализацию для "старого" EvaluteComplete.

Исправьте это, просто переименовав TEventViewerFrame.EvaluteComplete к TEventViewerFrame.EvaluateComplete (чтобы удовлетворить новый интерфейсный контракт).

Другие вопросы по тегам