如何在自定义网格控件中响应调整大小事件?

时间:2013-02-06 11:19:20

标签: delphi

我是Delphi的新手,我正在构建一个从TStringGrid派生的自定义控件。我需要访问OnResize事件处理程序。我如何获得它? TStringGrid的父级有一个OnResize事件

3 个答案:

答案 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事件进行任何操作。