如何在delphi中为未发布但公开的事件创建事件处理程序?

时间:2016-07-09 13:28:05

标签: delphi events tstringgrid delphi-10.1-berlin

RAD Studio 10.1柏林中,有很多内容与以前的版本有所不同。在FMX中,有一些以前发布的事件现在已被更改为仅公开。

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

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

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

3 个答案:

答案 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)

这是reported as a bug here

查看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父类中重新声明。