【问题标题】:Missing implementation for ToolsAPI interface method when upgrading to Delphi 10.4 Sydney升级到 Delphi 10.4 Sydney 时缺少 ToolsAPI 接口方法的实现
【发布时间】:2020-11-13 08:23:01
【问题描述】:

我在一个新的虚拟机中安装了 Delphi 10.4 Sydney w/ Patch 2,并将 Delphi 10.3 Tokyo 源复制到它。

重建可视化工具时(用于 DevExpress TcxSchedulerEvents)我收到此错误:

[dcc32 错误] EventVisualizr.pas(19): E2291 缺少接口方法 IOTAThreadNotifier.EvaluateComplete 的实现

我只删除了编译包cxLibraryRS26cxSchedulerRS26dxCoreRS26dxGDIPlusRS26,并添加了cxLibraryRS27cxSchedulerRS27dxCoreRS27dxGDIPlusRS27 - 没有其他代码更改:

我在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 文件时,我看到:

  • 在 10.3 中被命名为 EvaluteComplete(缺少 'a'),并且已修复为 EvaluateComplete
  • IOTAThreadNotifier160.EvaluateComplete 现在获得了一个重载指令(当然,与我认为的问题无关)

会不会是改名的原因?在 10.3 版本中也没有 EvaluateComplete 过程的“实现”(这似乎很好,从我对接口的了解很少)。

Why do I get the error Missing implementation of interface method in Delphi XE2?Why do I get error Missing implementation? 了解到,错误的原因可能是参数列表不同,但我不知道在这种情况下到哪里寻找正确的。

【问题讨论】:

    标签: delphi interface toolsapi delphi-10.4-sydney


    【解决方案1】:

    您的 TEventViewerFrame 仍然包含“旧”EvaluteComplete 的实现。

    只需将 TEventViewerFrame.EvaluteComplete 重命名为 TEventViewerFrame.EvaluateComplete 即可修复它(以满足新的接口协定)。

    【讨论】:

      猜你喜欢
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 2012-08-12
      • 2014-09-20
      • 2015-08-31
      • 2021-06-13
      相关资源
      最近更新 更多