我有一个自定义组件(TScrollBox),当它放在表单上时,它会在ScrollBox中添加一个标签。如何禁用ScrollBox的事件(onClick,OnMouseDown,等等),而是为子项启用事件(Tlabel)
unit MyScrollBox;
interface
uses
System.SysUtils, System.Classes, Vcl.Controls, Vcl.Forms, Vcl.StdCtrls;
type
TMyScrollComponent = class(TScrollBox)
private
FLabel : TLabel;
procedure SetLabelText(AText : string);
function GetLabelText : string;
protected
constructor Create(AOwner : TComponent); override;
published
property LabelText : string read GetLabelText write SetLabelText;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TMyScrollComponent]);
end;
constructor TMyScrollComponent.Create(AOwner : TComponent);
begin
inherited;
FLabel := TLabel.Create(self);
FLabel.Parent := self;
FLabel.Caption := 'Hello From Scrollbox!';
end;
procedure TMyScrollComponent.SetLabelText(AText : string);
begin
FLabel.Caption := AText;
end;
function TMyScrollComponent.GetLabelText : string;
begin
result := FLabel.Caption;
end;
end.
答案 0 :(得分:2)
在TScrollBox
中发布的事件无法在派生类中被抑制。所以,从字面上处理你的问题,没有办法实现你的要求。
您可以做的是从TScrollingWinControl
派生。这是TScrollBox
的祖先。它不会发布您要与滚动框中包含的控件关联的事件。
然后,您可以在自定义控件中显示连接到自定义控件中包含的控件的事件。
从你最近的问题来看,我不禁认为你的方法是错误的。我觉得你应该有一个内置滚动功能的自定义控件。
答案 1 :(得分:1)
TControls
的事件处理程序声明为protected
和dynamic
。使用派生类中的override
指令重新声明它们 - 请参阅TScrollBox Members Protected Methods;
To override MouseDown, add the MouseDown method to the TDBCalendar class和许多其他页面。
但是:如果您想要实施自己的新 活动,您必须执行以下操作:
...
private
fNewEvent:TNotifyEvent;
procedure setNewEvent(notify:TNotifyEvent);
function getNewEvent:TNotifyEvent;
procedure DoOnNewEvent;
....
published
property OnNewEvent:TNotifyEvent read getNewEvent write setNewEvent;
即。 - 您需要实现方法类型的属性,例如内置于Delphi中的TNotifyEvent
。如果需要,您也可以创建自己的。如果你想在IDE中看到你的事件,就像其他Delphi组件一样。事件,您必须将其声明为published
。
然后:在您的新组件实现部分中执行以下操作:
procedure TMyclass.DoOnNewEvent;
begin
if assigned (fNewEvent) then
begin
....doStuff...
fNewEvent(self);
end;
end;
当您要控制的事件发生时,请致电DoOnNewEvent
'在您的代码中,以便在代码中的那一点调用分配给fNewEvent
的函数。 (这通常称为callback
- 当某些事情发生时#34;在模块A中它回调进入模块B,让它知道它发生了,等等。)< / p>
如果您想定义新的GUI行为,您必须检查您感兴趣的控件,并了解如何捕获他们的实际&#34;物理&#34;事件 - 即滚动条滚动的时间,点击鼠标的时间,以及何时发生这种情况,请调用DoOnNewEvent
方法。 (这通常涉及检查进入您的应用程序的Windows消息,&#34;消息破解等等 - 这些消息通知您的应用程序在外部世界中发生了什么&#34;。)< / p>
在您的消费者类中,例如您放置滚动框的主要表单,成功发布新活动后,您将在新组件的IDE中看到您的活动,并指定它和在您的消费者类中定义您想要的行为,就像在IDE中的任何其他事件一样。
查看一个简单组件的VCL源代码,以便更好地了解它的外观。
但是:只有当您确实需要自己的新发布的事件时才会这样做,因为覆盖父母的事件并不足以满足您的需求。