4

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

4

3 回答 3

10

发布OnResize事件,默认情况下在TControl.


在自己的后代中,您不应使用事件本身,而应使用触发事件的方法。这样做会让组件的用户有机会实现自己的事件处理程序。

覆盖调整大小方法:

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;
于 2013-02-06T11:25:35.007 回答
2

覆盖 Resize 有一个问题:不仅会在实际调整网格大小时调用该事件,而且还会在您更改 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;
于 2014-04-22T15:42:56.357 回答
0

您可以简单地将 TStringGrid 放置在 TPanel 内并将其与 alClient 对齐,然后使用 TPanel 的已发布 Resize 事件进行任何操作。

于 2014-01-18T21:33:24.040 回答