在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
整个FMX.HintManager.pas代码在这里: http://pastebin.com/XSfahpV0
第79行是:
THintItem = class;
任何人都可以提供帮助,并告诉我应该添加什么,以便编译? 如果需要,我可以提供TeamViewer会话。
代码是使用FireMonkey中的提示,但似乎没有人更新它。 完整的源代码来自Delphipraxis。
此致 ģ
答案 0 :(得分:4)
好吧,编译器告诉你是什么。您只需要学习如何解码其错误消息。这是怎么做的。
让我们看看第一个错误:
FMX.HintManager.pas(79):E2291缺少接口方法IControl.GetIsFocused的实现
这首先指向第79行。其中包括:
THintItem = class;
问题出在THintItem
上。现在这有点令人困惑,因为这是一个前瞻性声明。真正的问题是在单元下面进一步发现的,但编译器总是指着它认为类声明开始的地方。这就是前瞻性声明。因此,每当您在前向声明中遇到错误时,请转到实际声明。这是:
THintItem = class(TFmxObject, IControl)
因此,这是一个派生自TFmxObject
的类,它实现了IControl
接口。现在,错误消息告诉我们该类缺少接口方法IControl.GetIsFocused 的实现。好吧,编译器当然是正确的。没有这样的方法。对于所有其他缺失的函数,所有其他错误都具有相同的性质。
因此,要解决此问题,您需要提供IControl
中所有方法的实现。毫无疑问,FMX框架自最初发布以来已经发生了广泛的变化,其中XE2是FMX v1,而XE5附带的版本是FMX v3。您需要研究并理解框架中的差异,并将此代码从FMX v1移植到FMX v3。
快速查看THintItem
,似乎IControl
方法的大部分实现都是null。例如:
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;
因此,您的10个启动器将为每个缺少的方法添加空或存根实现。例如:
function THintItem.GetIsFocused: boolean;
begin
Result := False;
end;
procedure THintItem.MouseClick(Button: TMouseButton; Shift: TShiftState;
X, Y: Single);
begin
end;
然后,您应该更仔细地研究框架,以确定任何方法是否需要更多这些存根。