![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
PopurMenu
faiwer © (2010-09-11 15:30:00)Доброго времени суток. У меня два, наверное, простых вопроса.
1. Как можно отобразить подменю, отдельно от его родителя? К примеру у меня есть a: TPopurMenu, а в нём b: TMenuItem, в котором в свою очередь есть несколько вложенных TMenuItem. Моя задача отобразить только вложенные в b пункты меню. Это реально?
2. У меня есть подменю, в котором каждый пункт как CheckBox (выбор колонов таблице для просмотра). Хотелось бы, чтобы при нажатии на любой из пунктов, подменю не пропадало. Это реализуемо?
P.S. D2010, W7
Джо (2010-09-12 04:44:00) [1]По п. 2 я бы сделал, как предложил Германн © (11.09.10 16:04) [2].
Меню с нестандартным поведением должно и выглядеть нестандартно. Меню стандартно всегда закрывается после выбора элемента. Если оно не закрывается, это и не должно выглядеть, как меню. Пусть это будет, скажем, плавающая панель.
Джо (2010-09-12 04:39:00) [2]
> Германн © (11.09.10 18:31) [6]
> Всё равно пункт 2 в PopupMenu работать не будет. Или я что-
> то не понимаю?
Конечно, не будет :)
faiwer (2010-09-11 19:17:00) [3]Похоже пункт 2 проще всего реализовать вызывая Popur(x,y) в тех же x,y, что и раньше, а затем эмулировать клик мыши в нужное подменю (ещё надо как то найти его координаты, или послать ему сигнал perform). В общем всё что ни приходит в голову на ету тему, сплошной гемморой. Похоже проще будет делать не подменю, а по нажатию на "вид", закрывать 1 контекстное меню, и тут же грузить где нидь посередине другое... Тухловато, но хоть как то )
Германн (2010-09-11 18:31:00) [4]Всё равно пункт 2 в PopupMenu работать не будет. Или я что-то не понимаю?
Джо (2010-09-11 17:32:00) [5]Пишем приблизительно такую функцию:
procedure CopySubMenuItems(Source: TMenuItem; Dest: TPopupMenu);
var
I: Integer;
Mi: TMenuItem;
begin
Assert (Dest <> nil, 'Dest must point to existing TPopupMenu instance');
for I := 0 to Source.Count - 1 do
begin
Mi := TMenuItem.Create(Dest);
Mi.Caption := Source.Items[i].Caption;
Mi.OnClick := Source.Items[i].OnClick;
// В общем, копируем все нужные свойства
Dest.Items.Add(Mi);
end;
end;
И с ее помощью копируем пункты нужного нам подменю в отдельное TPopupMenu.
Медвежонок Пятачок (2010-09-11 17:22:00) [6]все подменю - в отдельные попап меню и затем PopupMenu1.Popup(x,y);
faiwer (2010-09-11 16:25:00) [7]Угу, а есть более кошерные варианты?
Германн (2010-09-11 16:04:00) [8]Просто своё окно внешне похожее на меню может помочь решить обе эти задачи.
faiwer (2010-09-11 15:36:00) [9]Думаю этот скрин поможет разъяснить ситуацию http://s53.radikal.ru/i140/1009/4b/e07ada34999b.jpg
Это длинное меню, создаваемое динамичеки, я хочу запускать не только из этого PopurMenu, но ещё и повесить на MainMenu, и на кнопку.
Что касается второго вопроса, думаю вполне очевидно, что если надо несколько колонок скрыть или показать, очень неудобно всё время мучать правую кнопку мыши :)