Класс "прокладка"

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Класс "прокладка"

Сообщение zub »

Появилась нужда в некоей надстройке над TAction:

Код: Выделить всё

TPopUpMenyProxyAction=class(TAction)

    MenuItem:TMenuItem;
    MainAction:TAction;

    function Execute: Boolean; override;
  end;

Нужно чтобы он наружу выставлял все от MainAction, а при Execute делал некие махинации с MenuItem и выполнял MainAction.Execute. Как такое сделать с минимумом копипасты? достаточно ли будет скопипастить публишед секцию у TAction и "перенаправить" ее в MainAction?
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

А можно чуть подробней? MainAction это поле класса? Зачем потребовалось это поле MainAction, а не попросту обращаться к объекту самого класса, тем более оно тоже TAction...
Нужно чтобы он наружу выставлял все от MainAction, а при Execute делал некие махинации с MenuItem и выполнял MainAction.Execute
то есть зачем для этого два поля. Недостаточно ли только поля MenuItem в классе, а все остальное уже есть в классе?
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Чуток наврал в условиях, на смысл не влияет, но всеже. класс выглядит так:

Код: Выделить всё

  TPopUpMenyProxyAction=class(TAction)
    ToolButton:TToolButton;
    MainAction:TAction;
    function Execute: Boolean; override;
  end;

т.е. не TMenuItem, а TToolButton.
нужно чтобы ToolButton`у с ToolButton.style:=tbsButtonDrop; присваивать экшен выбраный из контекстного меню. поясняющий анимированый скриншот https://imgur.com/a/xCmgL
Задачу решил, но без "прокладки".
>>достаточно ли будет скопипастить публишед секцию у TAction и "перенаправить" ее в MainAction?
нет недостаточно((

Добавлено спустя 33 минуты 3 секунды:
>>А можно чуть подробней?
есть попупменю с уже назначеными экшенами на элементы меню. нужно это меню привязать к кнопке так, чтобы последний экшен выбраный в меню был доступен на кнопке. Вот я между элементом меню и экшеном всовываю прокладочку:
ToolButton:TToolButton; - кнопка на которую будет привязан экшен
MainAction:TAction; - "старый" экшен, который был на пункте меню до установки "прокладки"
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3071
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Для расширения возможностей стандартного класса очень удобны Helper'ы. Особенно, если нужно только одно-два свойства или метода добавить.
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

zub писал(а):есть попупменю с уже назначеными экшенами на элементы меню. нужно это меню привязать к кнопке так, чтобы последний экшен выбраный в меню был доступен на кнопке. Вот я между элементом меню и экшеном всовываю прокладочку

А не проще использовать IndexImage или Tag?
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>А не проще использовать IndexImage или Tag?
Не проще. или я непонимаю о чем вы
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

на сколько я понял нужно сохранить текущее значение, так у TObject есть волшебный Tag - кармашек. Некорректные умудрялись туда положить объекты Pointer(tag):=PRecordData;
Без фокусов можно записать состояние и в любой момент считать.

Добавлено спустя 1 минуту 2 секунды:
TToolButton имеет IndexImage, который тоже имеет некоторое состояние.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Из меня плохой объясняльщик.
Обезличено: Есть 2 класса связанные между собой и работающие вместе - вызывают какието методы у другдлуга. нужно некоторые эти вызовы перехватить и выполнить еще какоето дополнительное действие в этот момент (на этапе создания и связки этих 2х классов неизвестно что там будут за дополнительные действия). Лезть туда где создаются и связываются между собой эти классы нету никакого желания - работает, нетрож. Вот я и думал вместо одного из классов всунуть "прокладку" где все вызовы форвардить на старый класс, но нужные моменты вылавливать и делать дополнительные действия.
Конкретика: Есть кнопка и привязаное к ней контекстное меню. На пунктах меню и на кнопке привязаны экшены. Все прекрасно работает, но захотелось запущеный экшен из пункта меню привязывать к кнопке, чтобы в следующий раз просто ее кликать, а не лезти в меню.
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

На пунктах меню и на кнопке привязаны экшены
убрать "связку" кнопка. И динамически "вешать" на неё требуемое.
Т.е. в менюшке нажали что то и оно привязалось к кнопке. Ну и дефолт выставить.

По идее, если и писать "прокладку" то к кнопке. Добавить список из действий и обработку как реагировать коды что то выбрали.

п.с.
Или и это не в тему? :)
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

У меня получилось так, не прокладка, а копия. Главный недостаток - одно контекстное меню на одну кнопку, но меня это не касается.

Добавлено спустя 3 минуты 36 секунд:
>>Т.е. в менюшке нажали что то и оно привязалось к кнопке. Ну и дефолт выставить.
Так и есть.

>>По идее, если и писать "прокладку" то к кнопке. Добавить список из действий и обработку как реагировать коды что то выбрали.
"Прокладка" для кнопки есть, но совершенно из других соображений - стандартная tbsButtonDrop шире обычной, для вертикальных тулбаров это негодится. Я изхожу из соображений невмешиваться в то что уже работает - кнопку и меню.

Возможно eсть какойто стандартный неизвестный мне способ достич результата?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Ответить