4

RAD Studio 10.1 Berlin中,与以前的版本相比,有很多东西发生了变化。在 FMX 中,有一些以前发布的事件现在已更改为仅公开。

我有一个使用 TStringGrid 组件和 OnDblClick 事件的多平台项目。在 Studio 10.1 中打开此项目时,我收到警告说属性 OnDblClick 不存在。

现在的问题是如何使用不再发布的事件?

我必须说,很难理解他们为什么不再将鼠标事件设置为已发布。据我所知,大多数普通 PC 和 OSX 机器都没有触摸功能。真正的多目标项目应该能够针对这些系统没有他们在西雅图 10 号工作室所做的麻烦

4

3 回答 3

3

如果事件处理程序已经存在(我通过错误消息暗示),您可以将这些处理程序分配给它们在 FormCreate 中的事件。

procedure TForm1.FormCreate;
begin
  StringGrid1.OnDblClick := StringGrid1DblClick;
end;
于 2016-07-09T14:50:37.087 回答
2

一种解决方案是制作自己的组件,在其中扩展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.
于 2016-07-09T14:12:35.487 回答
2

这已被报告为此处的错误

查看 Delphi 10.1 berlin 中的源代码,公共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为 。

如果您查看 Delphi 10 Seattle 源代码,您会看到该属性在首次发布OnDblClick的几个TStringGrid父类中重新声明。TCustomScrollBox

于 2016-07-09T15:28:45.157 回答