【问题标题】:How can I create an event handler for a non published but public event in delphi?如何在 delphi 中为未发布但公共事件创建事件处理程序?
【发布时间】:2016-11-11 22:42:59
【问题描述】:

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

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

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

(我必须说,很难理解他们为什么不再将鼠标事件设置为已发布。据我所知,大多数普通 PC 和 OSX 机器都没有触摸功能。真正的多目标项目应该能够像在西雅图 Studio 10 中那样轻松定位这些系统

【问题讨论】:

  • 好的,我明白了。有趣的是,帮助文件反映了这些事件属性的更改状态。因此,我认为这是故意的。或者,也许是故意的,但没有经过深思熟虑??
  • 帮助是从源代码创建的。所以这个错误也被记录了;o)

标签: delphi events tstringgrid delphi-10.1-berlin


【解决方案1】:

一种解决方案是制作自己的组件,在其中扩展 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.

【讨论】:

  • 谢谢约翰!这肯定会起作用,但是还有其他更简单的方法可以做到这一点吗?每次 Embarcadero 发布标准组件的新实现时都必须创建新组件感觉不对。
【解决方案2】:

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

procedure TForm1.FormCreate;
begin
  StringGrid1.OnDblClick := StringGrid1DblClick;
end;

【讨论】:

  • 谢谢你!这正是我想要的。虽然我自己没有得到这个,但我感到有点尴尬......
【解决方案3】:

这是reported as a bug here

查看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 中发布。

【讨论】:

    猜你喜欢
    • 2013-12-24
    • 1970-01-01
    • 2015-01-17
    • 2023-04-04
    • 2021-12-05
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 2019-12-08
    相关资源
    最近更新 更多