Пользовательский компонент delphi с элементом всплывающего меню по умолчанию - PullRequest
0 голосов
/ 16 апреля 2019

Я использую пользовательский компонент списка, и мне нужен элемент всплывающего меню «Копировать данные в буфер обмена».Если нет назначенного всплывающего окна, я создаю его и добавляю пункт меню, если уже есть назначенное меню, добавьте элемент в текущее всплывающее окно.Пытался поместить код в конструктор, но потом понял, что popupmenu до сих пор не создано или не связано с моим списком.Так есть идеи, когда создать мой элемент по умолчанию?

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;

1 Ответ

1 голос
/ 16 апреля 2019

Переопределить виртуальный метод 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;
...