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

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

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

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

Сообщение zub » 18.04.2018 15:09:26

Появилась нужда в некоей надстройке над TAction:
Код: Выделить всё
TPopUpMenyProxyAction=class(TAction)

    MenuItem:TMenuItem;
    MainAction:TAction;

    function Execute: Boolean; override;
  end;

Нужно чтобы он наружу выставлял все от MainAction, а при Execute делал некие махинации с MenuItem и выполнял MainAction.Execute. Как такое сделать с минимумом копипасты? достаточно ли будет скопипастить публишед секцию у TAction и "перенаправить" ее в MainAction?
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Ichthyander » 18.04.2018 20:25:22

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

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

Сообщение zub » 18.04.2018 21:30:57

Чуток наврал в условиях, на смысл не влияет, но всеже. класс выглядит так:
Код: Выделить всё
  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; - "старый" экшен, который был на пункте меню до установки "прокладки"
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Снег Север » 19.04.2018 09:51:20

Для расширения возможностей стандартного класса очень удобны Helper'ы. Особенно, если нужно только одно-два свойства или метода добавить.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение olegy123 » 19.04.2018 15:06:10

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

А не проще использовать IndexImage или Tag?
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

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

Сообщение zub » 19.04.2018 15:23:16

>>А не проще использовать IndexImage или Tag?
Не проще. или я непонимаю о чем вы
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение olegy123 » 20.04.2018 00:54:59

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

Добавлено спустя 1 минуту 2 секунды:
TToolButton имеет IndexImage, который тоже имеет некоторое состояние.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

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

Сообщение zub » 20.04.2018 01:22:23

Из меня плохой объясняльщик.
Обезличено: Есть 2 класса связанные между собой и работающие вместе - вызывают какието методы у другдлуга. нужно некоторые эти вызовы перехватить и выполнить еще какоето дополнительное действие в этот момент (на этапе создания и связки этих 2х классов неизвестно что там будут за дополнительные действия). Лезть туда где создаются и связываются между собой эти классы нету никакого желания - работает, нетрож. Вот я и думал вместо одного из классов всунуть "прокладку" где все вызовы форвардить на старый класс, но нужные моменты вылавливать и делать дополнительные действия.
Конкретика: Есть кнопка и привязаное к ней контекстное меню. На пунктах меню и на кнопке привязаны экшены. Все прекрасно работает, но захотелось запущеный экшен из пункта меню привязывать к кнопке, чтобы в следующий раз просто ее кликать, а не лезти в меню.
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение pupsik » 20.04.2018 02:57:58

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

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

п.с.
Или и это не в тему? :)
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

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

Сообщение zub » 20.04.2018 14:53:47

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

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

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

Возможно eсть какойто стандартный неизвестный мне способ достич результата?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 31

Рейтинг@Mail.ru