何时在 TDBGrid 后代上创建子组件?
When create subcomponents on a TDBGrid descendant?
我要在 TDBGrid 后代上添加一个 ControlButton。
type TAEDBGrid = class(TDBGrid)
private
ControlButton: TButton;
procedure ControlButton_Click(Sender: TObject);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end
constructor TAEDBGrid.Create(AOwner: TComponent);
var Menu: TPopupMenu;
Item: TMenuItem;
begin
inherited Create(AOwner);
ControlButton := TButton.Create(nil);
ControlButton.Caption := '...';
ControlButton.Font.Style := Self.Font.Style + [fsBold];
ControlButton.Top := Self.Top + 1;
ControlButton.Left := Self.Left + 1;
ControlButton.Height := 19;
ControlButton.Width := 17;
ControlButton.Parent := Self.Parent;
ControlButton.OnClick := ControlButton_Click;
Menu := TPopupMenu.Create(ControlButton);
Item := TMenuItem.Create(Menu);
Item.Caption := 'Select Columns';
Item.OnClick := ControlButton_SelectColumns;
Menu.Items.Add(Item);
Item := TMenuItem.Create(Menu);
Item.Caption := 'Export to Excel';
Item.OnClick := ControlButton_ExportToExcel;
Item.Visible := False;
Menu.Items.Add(Item);
ControlButton.PopupMenu := Menu;
end;
destructor TAEDBGrid.Destroy;
begin
ControlButton.Free;
inherited Destroy;
end;
procedure TAEDBGrid.ControlButton_Click(Sender: TObject);
var Position: TPoint;
begin
if GetCursorPos(Position) then ControlButton.PopupMenu.Popup(Position.X, Position.Y);
end;
问题是,在我创建 ControlButton 的那一刻,Self.Top、Self.Left 属性为 0,而 Self.Parent 为 nil。所以我的按钮没有父级并且不可见。
我应该覆盖什么方法来创建我的按钮,其中已经分配了网格父级?。我试过AfterConstruction,遇到同样的问题。
我发现的最佳替代方法是重写 SetFocus 并检查未分配 (ControlButton),但它仅在用户进入网格时创建按钮。
谢谢。
您可以尝试覆盖 Loaded
方法:
protected
{ Protected declarations }
procedure Loaded; override;
并在里面初始化你的子控件。
如果你想让网格成为按钮的父级,那么你应该这样写
ControlButton.Parent := Self; //(and not Self.Parent)
因为你在网格的构造函数中。
我要在 TDBGrid 后代上添加一个 ControlButton。
type TAEDBGrid = class(TDBGrid)
private
ControlButton: TButton;
procedure ControlButton_Click(Sender: TObject);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end
constructor TAEDBGrid.Create(AOwner: TComponent);
var Menu: TPopupMenu;
Item: TMenuItem;
begin
inherited Create(AOwner);
ControlButton := TButton.Create(nil);
ControlButton.Caption := '...';
ControlButton.Font.Style := Self.Font.Style + [fsBold];
ControlButton.Top := Self.Top + 1;
ControlButton.Left := Self.Left + 1;
ControlButton.Height := 19;
ControlButton.Width := 17;
ControlButton.Parent := Self.Parent;
ControlButton.OnClick := ControlButton_Click;
Menu := TPopupMenu.Create(ControlButton);
Item := TMenuItem.Create(Menu);
Item.Caption := 'Select Columns';
Item.OnClick := ControlButton_SelectColumns;
Menu.Items.Add(Item);
Item := TMenuItem.Create(Menu);
Item.Caption := 'Export to Excel';
Item.OnClick := ControlButton_ExportToExcel;
Item.Visible := False;
Menu.Items.Add(Item);
ControlButton.PopupMenu := Menu;
end;
destructor TAEDBGrid.Destroy;
begin
ControlButton.Free;
inherited Destroy;
end;
procedure TAEDBGrid.ControlButton_Click(Sender: TObject);
var Position: TPoint;
begin
if GetCursorPos(Position) then ControlButton.PopupMenu.Popup(Position.X, Position.Y);
end;
问题是,在我创建 ControlButton 的那一刻,Self.Top、Self.Left 属性为 0,而 Self.Parent 为 nil。所以我的按钮没有父级并且不可见。
我应该覆盖什么方法来创建我的按钮,其中已经分配了网格父级?。我试过AfterConstruction,遇到同样的问题。
我发现的最佳替代方法是重写 SetFocus 并检查未分配 (ControlButton),但它仅在用户进入网格时创建按钮。
谢谢。
您可以尝试覆盖 Loaded
方法:
protected
{ Protected declarations }
procedure Loaded; override;
并在里面初始化你的子控件。
如果你想让网格成为按钮的父级,那么你应该这样写
ControlButton.Parent := Self; //(and not Self.Parent)
因为你在网格的构造函数中。