расширение действия delphi TEditCopy для копирования элементов списка в буфер обмена - PullRequest
2 голосов
/ 16 апреля 2010

У меня есть форма, большая часть ее функций реализована с использованием стандартного TAction. У меня есть меню, панель инструментов и некоторые кнопки. Я реализовал копирование / вставку буфера обмена вообще без кода, просто используя действия TEditCopy и TEditPaste. Он отлично работает в коробках TEdit и TMemo, которые у меня есть.

Теперь я хочу, чтобы он работал и с TListBox. В частности, я хочу иметь возможность копировать выбранный элемент списка в TListBox, используя те же самые элементы меню, сочетания клавиш и кнопки инструментов.

Итак, я считаю, что мне нужно будет расширить действие TEditCopy. Но это не кажется мне очень прямым. В частности, TEditAction проверяет, является ли сфокусированный элемент управления элементом управления TCustomEdit, а не TListBox. Я немного боюсь, что это будет слишком много работы.

Очевидная альтернатива - просто забыть о стандартных действиях и реализовать копию в буфер обмена в методе OnExecute универсального TAction.

Но, прежде чем сдаться, есть ли у вас какая-то идея, подсказка или хитрость, которая поможет мне расширить стандартное действие TEditCopy?

Ответы [ 3 ]

2 голосов
/ 17 апреля 2010

Вот хак, который я реализовал.

Не требуется вручную изменять ActionList или уже имеющиеся у меня MenuItems и ToolButton, потому что я сохраняю то же имя TEditCopyдля класса.

type
 TEditCopy = class(StdActns.TEditCopy)
  public
   function HandlesTarget(Target: TObject): Boolean; override;
   procedure ExecuteTarget(Target: TObject); override;
   procedure UpdateTarget(Target: TObject); override;
  end;

Он расширяет стандартное действие TEditCopy и обеспечивает необходимую функциональность поддержки TListBox.

function TEditCopy.HandlesTarget(Target: TObject): Boolean;
 begin
  result:=(inherited handlesTarget(Target)) or (target is TListbox);
 end;

procedure TEditCopy.ExecuteTarget(Target: TObject);
 begin
  if (target is TListBox) and (TListBox(Target).ItemIndex<>-1) then
    clipboard.AsText:=TListBox(Target).Items[TListBox(Target).ItemIndex]
  else
    inherited;
 end;

procedure TEditCopy.UpdateTarget(Target: TObject);
 begin
  if target is TListbox then
    Enabled := true
  else
    inherited;
 end;

Остальная часть приложения не изменяется.Весь функционал копирования / вставки по-прежнему реализован без кода.

0 голосов
/ 16 апреля 2010

Вы должны либо переопределить обработчики событий TAction, либо создать нового потомка, который комбинирует код из TEditAction / TEditCopy с дополнительной обработкой для TListBox.

Точкой расширения для действий является установка обработчиков событий OnExecute / OnUpdate, и это не сработает, потому что отключит существующую обработку TEdit. Вы можете выйти из TEditCopy и переопределить методы, но это, вероятно, будет столько же кода, сколько новый класс, который произошел прямо от TAction. Могут быть и другие низкоуровневые хаки, которые сработают, но я этого не вижу, и даже если бы они были, они гарантированно менее ремонтопригодны, чем документированный подход.

0 голосов
/ 16 апреля 2010

Я помню, что прочитал что-то об этом в Интернете, но не могу найти ссылку назад.Если я найду его, я расскажу вам более точно об этом.

Однако я помню, что действие проверяет, может ли оно быть применено (или нет) к определенной цели с помощью "TBasiAction".HandlesTarget »- виртуальный.Вы должны проверить, как методы «HandlesTarget», «UpdateTarget» и «ExecuteTarget» (все члены TBasicAction) используются при выполнении действия.

Опять же, подробнее об этом, если я найду ссылку обратно.

[Редактировать]

Это не тот пост, который я искал, но, похоже, он точно описывает то, что вы хотите: учебные пособия: определение пользовательских действий

...