在 RAD Studio 10.1柏林中,有很多内容与以前的版本有所不同。在FMX中,有一些以前发布的事件现在已被更改为仅公开。
我有一个使用TStringGrid组件和OnDblClick事件的多平台项目。在Studio 10.1中打开此项目时,我收到警告,指示Property OnDblClick不存在。
现在问题是如何使用不再发布的事件?
(我必须说,很难理解为什么他们没有将鼠标事件设置为已发布。据我所知,大多数常规PC和OSX机器都没有触摸。真正的多目标项目应该能够像在Studio 10 Seattle中那样轻松地定位这些系统)
答案 0 :(得分:3)
如果事件处理程序已经存在(我通过错误消息暗示),您可以将这些处理程序分配给FormCreate中的事件。
procedure TForm1.FormCreate;
begin
StringGrid1.OnDblClick := StringGrid1DblClick;
end;
答案 1 :(得分:2)
一种解决方案是在扩展FMX.TStringGrid
的位置创建自己的组件,以便再次发布事件处理程序。
请在此处查看如何创建新的FMX组件:creating a firemonkey component
这是重新发布鼠标事件的代码。
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.
答案 2 :(得分:2)
查看Delphi 10.1 berlin中的源代码,公共//--------------------------------------------------------------------------!
// Unveil Left to Right !
//--------------------------------------------------------------------------!
static void pUnveilL(ulong frame, ulong field)
{
Frame* thisFrame = &Frames[frame] ; // make code more readable
Field* thisField = &Fields[Frames[frame].fields[field]] ; // make code more readable
事件实际上是从OnDblClick
类继承的。
类似的TControl
事件也是从OnDblClick
类继承的,除了它是公开的,就像许多其他从TControl˙类继承的事件一样。
似乎Embarcadero的家伙通过清理父母的房产重新申报来进行一些重构(不确定这是否是正确的术语),如:
TControl
不需要在上述情况下重新声明type
TParentClass = clas(Tobject)
public
property ParentPropery: Integer read GetParentProperty write SetParentProperty;
TExampleClass = class(TParentClass)
public
property ParentPropery;
end;
,因为它将在所有子类中提供,除非您想将其可见性从ParentProperty
更改为public
。
如果您查看Delphi 10 Seattle源代码,您会看到属性published
在首次在OnDblClick
中发布的多个TStringGrid
父类中重新声明。