自定义按钮,使用PopupMenu进行OnClick

时间:2019-07-04 07:00:58

标签: delphi events components

所以我基于cxButton创建了一个自定义Button。我希望在单击此按钮时显示一个Popupmenu。但是由于某种原因,Popupmenu没有显示。 我什至没有出错,我也不知道为什么。

type
  TcxGridButton = class(TcxButton)
  private
    FGridView : TcxGridDBTableView;
    FPopup : TPopupMenu;

    procedure AutoSize(Sender : TObject);
    procedure ClearFilter(Sender : TObject);
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner : TComponent); override;

    procedure Click; override;
  published
    property GridView : TcxGridDBTableView read FGridView write FGridView;
  end;

这是我创建弹出菜单的部分

constructor TcxGridButton.Create(AOwner: TComponent);
var Item : TMenuItem;
    P : TPoint;
begin
  inherited;

  Text:='Options';

  FPopup := TPopupMenu.Create(Self);

  Item := TMenuItem.Create(FPopup);
  Item.Caption:='Nach Excel exportieren';

  Item := TMenuItem.Create(FPopup);
  Item.Caption:='Automatische Größenanpassung';
  Item.OnClick:=AutoSize;

  Item := TMenuItem.Create(FPopup);
  Item.Caption:='Filter löschen';
  Item.OnClick:=ClearFilter;
end;

现在,当我将此按钮放在窗体上时,它立即显示了“文本选项”,因此构造函数似乎运行正常。

但是当我单击此按钮时,我得到了Click,Self.ToString和Done。 但是Popup菜单从不弹出。我怎么了?

procedure TcxGridButton.Click;

begin
  inherited; // call the inherited Click method.

  ShowMessage('CLICK');

  if not Assigned(FGridView) then Exit;

  ShowMessage(Self.ToString);


  FPopup.Popup(0,0);


  ShowMessage('DONE');

end;

1 个答案:

答案 0 :(得分:4)

答案很简单-您忘记了将项目添加到弹出菜单中

{ after creating each item }
FPopup.Items.Add(Item);

如果您未绑定到TCxButton,则可以使用标准VCL按钮,该按钮通过设置为bsSplitButton的属性Style和属性{{ 3}}。否则,您至少可以研究VCL的TCustomButton源代码,以启发自己的实现。