Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 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.042 c
14-1135611667
Fl@sh
2005-12-26 18:41
2006.01.22
Настройки редактора


14-1135769635
Johnmen
2005-12-28 14:33
2006.01.22
Модераторам


2-1136464753
ArtemESC
2006-01-05 15:39
2006.01.22
Получить иконку...


2-1136528300
dreamse
2006-01-06 09:18
2006.01.22
Как обновить структуру базы данных не теряя данные ?


14-1135506830
boriskb
2005-12-25 13:33
2006.01.22
Полностью согласен :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский