[英]How can I Delphi Mocks an event handler or, assign interface method as delegate in Delphi?
[英]How can I create an event handler for a non published but public event in delphi?
在RAD Studio 10.1柏林,很多东西与以前的版本有所不同。 在FMX中,有一些以前发布的事件现在已被更改为仅公开。
我有一个使用TStringGrid组件和OnDblClick事件的多平台项目。 在Studio 10.1中打开此项目时,我收到警告,该属性OnDblClick不存在。
现在的问题是如何使用不再发布的事件?
( 我必须说,很难理解为什么他们没有将鼠标事件设置为已发布。据我所知,大多数常规PC和OSX机器都没有触摸。真正的多目标项目应该能够针对这些系统没有他们在Studio 10西雅图所做的麻烦 )
如果事件处理程序已经存在(我通过错误消息暗示),您可以将这些处理程序分配给FormCreate中的事件。
procedure TForm1.FormCreate;
begin
StringGrid1.OnDblClick := StringGrid1DblClick;
end;
一种解决方案是创建自己的组件,将FMX.TStringGrid
扩展为再次发布事件处理程序。
请参阅此处如何创建新的FMX组件: 创建firemonkey组件
这是重新发布鼠标事件的代码。
unit MyStringGrid;
interface
uses FMX.Grids;
type
TMyStringGrid = class(TStringGrid)
published
property OnDblClick;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnMouseWheel;
property OnMouseEnter;
property OnMouseLeave;
end;
procedure Register;
implementation
uses FMX.Types;
procedure Register;
begin
RegisterComponents('NewPage', [TMyStringGrid]);
end;
initialization
RegisterFmxClasses([TMyStringGrid]);
end.
看着德尔福10.1柏林的源代码公开OnDblClick
事件实际上是从继承TControl
类。
类似的OnDblClick
事件也从继承TControl
类不同之处在于它是公开的,像从的TControl类继承的许多其他事件。
无论如何,Embarcadero的家伙一直在通过清理母公司的重新申报来进行一些重构(不确定这是否是正确的术语),如:
type
TParentClass = clas(Tobject)
public
property ParentPropery: Integer read GetParentProperty write SetParentProperty;
TExampleClass = class(TParentClass)
public
property ParentPropery;
end;
不需要在上述情况下重新声明ParentProperty
,因为它将在所有子类中可用,除非您想要将其可见性从public
更改为published
。
如果你看一下德尔福西雅图10的源代码,你看到属性OnDblClick
在几个重新声明TStringGrid
父类被刊登在TCustomScrollBox
首次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.