Расширение действий Delphi TeDitcopy Также скопируйте элементы списка в буфер обмена
Вопрос
У меня есть форма с большинством его функциональных возможностей, реализованных с использованием стандартных ворот. У меня есть меню, панель инструментов и некоторые тообаттоны. Я реализовал копию буфера обмена / вставить без кода вообще, просто используя действия 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) используются при выполнении действия.
Опять больше об этом, если я нахожу ссылку назад.
Редактировать
Это не пост, который я искал, но, похоже, описывает именно то, что вы хотите:Учиты: Определение пользовательских действий