具有默认弹出菜单项的delphi自定义组件

问题描述 投票:0回答:1

我使用自定义listview组件,我需要它有一个弹出菜单项“将数据复制到剪贴板”。如果没有分配弹出窗口,我创建一个并添加menuitem,如果已经分配了菜单,则将该项目添加到当前弹出窗口。试图将代码放在构造函数中,但后来我意识到,popupmenu仍未创建或与我的listview相关联。那么任何想法何时创建我的默认项目?

constructor TMyListView.Create(AOwner: TComponent);
var
  FpopupMenu: TPopupMenu;
begin
  inherited;
  .....
  FPopUpMenuItem := TMenuItem.Create(self);
  FPopUpMenuItem.Caption := 'Copy data to clipboard';
  FPopUpMenuItem.OnClick := PopupMenuItemClick;
  if assigned(PopupMenu) then begin
    popupMenu.Items.Add(FPopUpMenuItem);
  end
  else begin
    FpopupMenu := TPopupMenu.Create(self);
    FpopupMenu.Items.Add(FPopUpMenuItem);
    PopupMenu := FpopupMenu;
  end;
...
end;
delphi components popupmenu
1个回答
1
投票

覆盖虚拟TControl.DoContextPopup()方法,例如:

type
  TMyListView = class(TListView)
  protected
    ...
    procedure DoContextPopup(MousePos: TPoint; var Handled: Boolean); override;
    ...
  end;

procedure TMyListView.DoContextPopup(MousePos: TPoint; var Handled: Boolean);
var
  LPopupMenu: TPopupMenu;
  LItem: TMenuItem;

  function IsSameEvent(const E1, E2: TNotifyEvent): Boolean;
  begin
    Result := (TMethod(E1).Code = TMethod(E2).Code) and
              (TMethod(E1).Data = TMethod(E2).Data);
  end;

begin
  inherited DoContextPopup(MousePos, Handled);
  if Handled then Exit;

  LPopupMenu := PopupMenu;
  if not Assigned(LPopupMenu) then
  begin
    LPopupMenu := TPopupMenu.Create(Self);
    PopupMenu := LPopupMenu;
  end;

  for I := 0 to LPopupMenu.Items.Count-1 do
  begin
    LItem := LPopupMenu.Items[I];
    if IsSameEvent(LItem.OnClick, PopupMenuItemClick) then
      Exit;
  end;

  LItem := TMenuItem.Create(Self);
  LItem.Caption := 'Copy data to clipboard';
  LItem.OnClick := PopupMenuItemClick;
  LPopupMenu.Items.Add(LItem);
end;
© www.soinside.com 2019 - 2024. All rights reserved.