Расширение действий Delphi TeDitcopy Также скопируйте элементы списка в буфер обмена

StackOverflow https://stackoverflow.com/questions/2652322

  •  27-09-2019
  •  | 
  •  

Вопрос

У меня есть форма с большинством его функциональных возможностей, реализованных с использованием стандартных ворот. У меня есть меню, панель инструментов и некоторые тообаттоны. Я реализовал копию буфера обмена / вставить без кода вообще, просто используя действия TEDITCOPY и TEDITITPASASTE. Работает идеально в ящиках TEDIT и TMEMO.

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

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

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

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

Это было полезно?

Решение

Вы должны либо переопределить обработчики событий aCaction или создать новый потомк, который сочетает в себе код из TEDITACTION / TEDITCOPY с дополнительным обращением для TLiStbox.

Точка расширения для действий устанавливает обработчики событий Onexecute / OnUpdate, и это не будет работать здесь, потому что она отключит существующую обработку TEDIT. Вы можете сходить из TEDITCOPY и переопределить методы, но это, вероятно, будет столько же кода, как новый класс, который спустился прямо от Taction. Там может быть какой-то другой низкоуровневый взлом, который будет работать, но я его не вижу, и даже если бы было, он гарантированно будет менее поддерживаться, чем задокументированный подход.

Другие советы

Вот взлом я вышел на реализацию.

Не требуется вручную изменить действие билетов или меню и инструментов для инструментов, у меня уже есть, потому что я держу то же имя 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;

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

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

Однако, что я помню, это то, что действие проверяет, его можно применить (или нет) к конкретной цели, используя метод «TBAsiaction. HandleStarget» - который является виртуальным. Вы должны проверить, как методы «HandleStarget», «Updatetarget» и «Executetarget» (все члены TBasicaction) используются при выполнении действия.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top