Форум: "Компоненты";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];
ВнизПодскажите, как создать TPopupMenu у любого виз. компанента Найти похожие ветки
← →
mmms (2005-07-08 15:04) [0]Например, переделал под себя TLabel, как на нее можно "привязать" TPopupMenu, с парой любых менюшек?
в компаненте, от TLabel, пишу:private
pm_grid: TPopupMenu;
...
constructor TMyComp.Create (AOwner:TComponent);
var
ti: TMenuItem;
begin
inherited Create(AOwner);
ti:=TMenuItem.Create();
// ti.Caption:="Ghfgghfhhf";
pm_grid.Items.Caption:="dfhdh";
PopupMenu:=pm_grid;
end;
То что тут наворотил, конечно же лажа, просто пробовал, как бы это можно сделать, подскажите плз, как правильно создать TPopupMenu у виз компанента? (Понятно, что как и любой компанент, но интересует частичка кода, как это в Delphi реализовать) Заранее благодарю.
← →
icWasya © (2005-07-11 09:35) [1]
private
pm_grid: TPopupMenu;
private
procedure Ghfgghfhhf(Sender:TObject);
procedure qwerty(Sender:TObject);
...
constructor TMyComp.Create (AOwner:TComponent);
var
ti: TMenuItem;
begin
inherited Create(AOwner);
pm_grid:=TPopupMenu.Create(Self);
ti:=TMenuItem.Create(Self);
ti.Caption:="Ghfgghfhhf";
ti.OnClick:=Ghfgghfhhf;
pm_grid.Items.Add(ti);
ti:=TMenuItem.Create(Self);
ti.Caption:="Qwerty";
ti.OnClick:=qwerty;
pm_grid.Items.Add(ti);
PopupMenu:=pm_grid;
end;
procedure TMyComp.Ghfgghfhhf(Sender:TObject);
begin
end;
procedure TMyComp.qwerty(Sender:TObject);
begin
end;
← →
mmms (2005-07-11 11:34) [2]icWasya © (11.07.05 09:35)
Спасибо, не знаю почему у самого не получилось :) Добавил Destroy, и все стало Ок!!! Ещё раз, благодарю!begin
pm_grid.Free;
inherited Destroy;
end;
← →
Юрий Зотов © (2005-07-11 12:11) [3]> mmms (11.07.05 11:34) [2]
Вот только интересно, как будет работать Ваш компонент, если его пользователь назначит ему в Инспекторе Объектов свое собственное PopupMenu?
← →
mmms (2005-07-11 13:07) [4]Юрий, это ошибка в тут приведенном коде, или ошибка в том, что нельзя TPopupMenu применять к элементам таким образом? Мне надо просто что бы были элементы, с одним TPopupMenu, и не планируется добавлять внешние TPopupMenu.
← →
mmms (2005-07-11 13:10) [5]И ещё вопрос, хочу в этот код TPopupMenu прицепить ImageList, и определить для элемента меню свою картинку. Вот только как ImageList "заполнить картинкой"? Посмотреть на нормальной форме, как в DFM файле заполняется структура BMP картинки в ImageList, и скопировав его использоватьть в PAS, или можно каким нибудь другим образом?
← →
Юрий Зотов © (2005-07-11 15:58) [6]> mmms (11.07.05 13:07) [4]
Ошибка в том, что нельзя назначать popup-меню таким образом. Потому что ничто не мешает юзеру назначить в ИО свое popup-меню - и компонент работать перестанет. Даже если скрыть свойство "PopupMenu" из ИО, то реально это не ничего не даст, потому что юзер может сделать то же самое и в коде, а вот этого ему уже никак не запретишь.
Обрабатывая в компоненте правую кнопку мыши напрямую, можно активировать его внутреннее popup-меню, а заодно и блокировать внешнее popup-меню, даже если юзер его назначит. Но такое решение вряд ли можно назвать удачным - потому что юзер имеет полное право ожидать от компонента стандартного поведения и будет крайне удивлен тем, что назначенное им внешнее меню не вызывается. Скорее всего, такой компонент он тут же отправит в корзину.
А других решений задачи я не вижу. Да и смысла в ней, честно говоря, не вижу тоже. Чем Вас не устраивает стандартное назначение внешнего меню, к которому все давно привыкли? Там и картинки, и ActionList, и прикрепление к кнопкам тулбаров и еще много чего вкусного. И все уже готовое.
← →
mmms (2005-07-11 16:06) [7]
Юрий Зотов © (11.07.05 15:58)
Юрий, в том то и дело, что нужен не стандартный TPopupMenu, а именно созданные вместе с компанентом. Ладно с меткой, а например с TGrid, сделать TPopupMenu, где в меню куча функций, типа просмотр перед печатью, созранить в Excel файл, настройка показа/скрытия всех колонок, с записью инфа по каждому полю в реестр. Если для каждого грида писать свои TPopupMenu, то это просто ужас какой будет (Гридов в проекте под сотню). Я сделал с помощью этого сайта, и с помощью вас Юрий, в другой ветке, и очень доволен :)
← →
Юрий Зотов © (2005-07-12 01:59) [8]> mmms (11.07.05 16:06) [7]
> Если для каждого грида писать свои TPopupMenu, то это просто
> ужас какой будет (Гридов в проекте под сотню).
Действительно, будет ужас. Поэтому такого безобразия делать не нужно. Нужно положить на главную форму один (только один!) компонент TPopupMenu и назначить его (стандартным образом!) всем гридам (всем! один и тот же!).
И тогда для всех гридов получим "просмотр перед печатью, сохранить в Excel файл, настройка показа/скрытия всех колонок" и все прочее. И все это - в ОДНОМ меню. Стандартном.
← →
mmms (2005-07-12 15:34) [9]
Юрий Зотов © (12.07.05 01:59)
Это согласен, а как узнать, для какого DBGrid надо создать действие? Если TPopupMenu один, то как оперделить, с какого DBGrid его вызвали? У меня же сколько гридов - столько и TPopupMenu, гриды все разные, TPopupMenu тоже разные. При вызове PopupMenu, понятно, с какого грида его вызвали, и понятно над чем совершать действия.
← →
Юрий Зотов © (2005-07-12 16:29) [10]> Если TPopupMenu один, то как оперделить, с какого DBGrid его
> вызвали?
PopupComponent.
← →
Reindeer Moss Eater © (2005-07-25 11:05) [11]Создай в конструкторе своего компонента свое попап меню с нужными тебе элементами.
Затем переопредели метод loaded, в котором проверяй, было ли назначено пользователем компонента свое попапменю.
Если нет - ничего не делай.
Если да, то добавь пункты своего попап к меню пользователя.
Правда пользователь может назначать свое попапменю в рантайме и эта схема не будет работать.
Страницы: 1 вся ветка
Форум: "Компоненты";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.05 c