我是Delphi的新手,我正在构建一个从TStringGrid派生的自定义控件。我需要访问OnResize事件处理程序。我如何获得它? TStringGrid的父级有一个OnResize事件
答案 0 :(得分:10)
发布OnResize
事件,默认情况下受TControl
保护。
在自己的后代中,您不应该使用事件本身,而应该使用触发事件的方法。这样做将使组件的用户有机会实现自己的事件处理程序。
覆盖Resize方法:
type
TMyGrid = class(TStringGrid)
protected
procedure Resize; override;
published
property OnResize;
end;
{ TMyGrid }
procedure TMyGrid.Resize;
begin
// Here your code that has to be run before the OnResize event is to be fired
inherited Resize; // < This fires the OnResize event
// Here your code that has to be run after the OnResize event has fired
end;
答案 1 :(得分:2)
覆盖调整大小有一个问题:不仅在网格实际调整大小时,而且在更改RowCount 时调用事件。
在一个程序中,我需要在用户调整网格大小时向网格添加/删除行。 换句话说,我必须保持网格充满行/数据。但是,在添加/删除行时无法访问数据。
所以,我用过这个:
protected
procedure WMSize(var Msg: TWMSize); message WM_SIZE;
.....
Implementation
procedure TMyGrid.WMSize(var Msg: TWMSize);
begin
inherited;
if (csCreating in ControlState) then EXIT; { Maybe you also need this } { Don't let grid access data during design }
ComputeRowCount;
AssignDataToRows;
end;
答案 2 :(得分:0)
您可以简单地将TStringGrid放在TPanel中并将其与alClient对齐,然后使用已发布的TPanel的Resize事件进行任何操作。