Пользовательская кнопка, OnClick с PopupMenu - PullRequest
1 голос
/ 04 июля 2019

, поэтому я создал пользовательскую кнопку на основе cxButton.Я хочу показать 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.Но всплывающее меню никогда не всплывает.В чем моя ошибка?

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 Ответ

4 голосов
/ 04 июля 2019

Ответ довольно прост - вы забыли добавить элементы во всплывающее меню:

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

Если вы не привязаны к TCxButton, вы можете использовать стандартную кнопку VCL, предоставляющую функциональность, которую вы пытаетесь реализовать, через свойство Style, установленное на bsSplitButton и свойство DropDownMenu. В противном случае вы можете, по крайней мере, изучить исходный код VCL TCustomButton как источник вдохновения для своей собственной реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...