缺少接口方法 IControl 的实现

Goa*_*aul -1 delphi compiler-errors

在 XE2 上它编译没有问题,在 XE5 上显示这些错误:

    FMX.HintManager.pas(79): E2291 Missing implementation of interface method IControl.GetIsFocused
    FMX.HintManager.pas(79): E2291 Missing implementation of interface method IControl.GetEnabled
    FMX.HintManager.pas(79): E2291 Missing implementation of interface method IControl.GetAbsoluteEnabled
    FMX.HintManager.pas(79): E2291 Missing implementation of interface method IControl.GetPopupMenu
    FMX.HintManager.pas(79): E2291 Missing implementation of interface method IControl.EnterChildren
    FMX.HintManager.pas(79): E2291 Missing implementation of interface method IControl.ExitChildren
    FMX.HintManager.pas(79): E2291 Missing implementation of interface method IControl.DoActivate
    FMX.HintManager.pas(79): E2291 Missing implementation of interface method IControl.DoDeactivate
    FMX.HintManager.pas(79): E2291 Missing implementation of interface method IControl.MouseClick
    FMX.HintManager.pas(79): E2291 Missing implementation of interface method IControl.GetInheritedCursor
    FMX.HintManager.pas(79): E2291 Missing implementation of interface method IControl.SetAcceptsControls
Run Code Online (Sandbox Code Playgroud)

整个 FMX.HintManager.pas 代码在这里:http ://pastebin.com/XSfahpV0

第 79 行是:

THintItem  = class;
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助并告诉确切应该添加什么以便可以编译?如果需要,我可以提供 TeamViewer 会话。

代码是在 FireMonkey 中使用 Hints 编写的,但似乎没有长时间更新它。完整的源代码来自 Delphipraxis。

问候, G

Dav*_*nan 5

好吧,编译器会告诉你发生了什么。您只需要学习如何解码其错误消息。这是如何做到的。

让我们看看第一个错误:

FMX.HintManager.pas(79): E2291 缺少接口方法 IControl.GetIsFocused 的实现

这首先指向第 79 行。内容如下:

THintItem  = class;
Run Code Online (Sandbox Code Playgroud)

所以问题在于THintItem. 现在这有点令人困惑,因为这是一个前向声明。真正的问题是在单元的更深处发现的,但编译器总是将手指指向它认为类声明开始的地方。这就是前向声明。因此,每当您在前向声明中遇到错误时,请转到实际声明。这是:

THintItem = class(TFmxObject, IControl)
Run Code Online (Sandbox Code Playgroud)

所以,这是一个派生自TFmxObject实现IControl接口的类。现在,错误消息告诉我们该类缺少接口方法 IControl.GetIsFocused实现。嗯,编译器当然是对的。没有这样的方法。对于所有其他缺失的函数,所有其他错误都具有相同的性质。

因此,要解决该问题,您需要提供IControl. 毫无疑问,FMX 框架自首次发布 XE2(即 FMX v1)和随 XE5 发布的 FMX v3 发布以来发生了巨大变化。您需要研究和了解框架中的差异,并将此代码从 FMX v1 移植到 FMX v3。

快速浏览一下THintItem,似乎这些方法的大多数实现IControl都是空的。例如:

function THintItem.GetAcceptsControls: Boolean;
begin
  Result := False;
end;

function THintItem.GetCursor: TCursor;
begin
  Result := crNone;
end;

function THintItem.GetDesignInteractive: Boolean;
begin
  Result := False;
end;

procedure THintItem.MouseDown(Button: TMouseButton; Shift: TShiftState;
  X, Y: Single);
begin
end;

procedure THintItem.MouseMove(Shift: TShiftState; X, Y: Single);
begin
end;

procedure THintItem.MouseUp(Button: TMouseButton; Shift: TShiftState;
  X, Y: Single);
begin
end;

procedure THintItem.MouseWheel(Shift: TShiftState; WheelDelta: Integer;
  var Handled: Boolean);
begin
end;
Run Code Online (Sandbox Code Playgroud)

因此,您的 10 个入门将是为每个缺失的方法添加空或存根实现。例如:

function THintItem.GetIsFocused: boolean;
begin
  Result := False;
end;

procedure THintItem.MouseClick(Button: TMouseButton; Shift: TShiftState;
  X, Y: Single);
begin
end;
Run Code Online (Sandbox Code Playgroud)

然后,您应该更仔细地研究该框架,以确定是否有任何方法需要的不仅仅是这些存根。