Отсутствует реализация для метода интерфейса 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
(чтобы удовлетворить новый интерфейсный контракт).