|
Вопрос # 6 401/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты! Банальный вопрос - как проверить есть ли submenu у item' а? Без использования try except.
Примечание #1 (31 марта 2013, 11:42): PopupMenu
 |
Вопрос задал: eclipse (статус: Посетитель)
Вопрос отправлен: 31 марта 2013, 11:02
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 13; последнее сообщение — 11 апреля 2013, 17:21; участников в обсуждении: 4.
|
Александр Дубик (статус: 1-ый класс), 31 марта 2013, 11:46 [#1]:
Всё очень просто. Проверить наличие подменю пожно по свойству Count:
if PopupMenuItem1.Count > 0 then
ShowMessage('Тут ещё что-то есть ;-)');
|
|
eclipse (статус: Посетитель), 31 марта 2013, 11:49 [#2]:
Так этим самым мы проверим только самое первое (так сказать) меню. А у этого меню есть item' ы, у которых надо узнать есть ли у них субменю.
|
|
Александр Дубик (статус: 1-ый класс), 31 марта 2013, 11:55 [#3]:
Тебе надо пройтись по всем элементам меню?
В таком случае ничего, кроме рекурсии в голову не приходит.
|
|
eclipse (статус: Посетитель), 31 марта 2013, 12:42 [#4]:
Рекурсии? Это типа по parent добраться до нужной?
|
|
Александр Дубик (статус: 1-ый класс), 31 марта 2013, 13:03 [#5]:
procedure CheckMenuItems(const MenuItem: TMenuItem; Level: Integer = 0);
var I: Integer;
begin
for I := 0 to MenuItem.Count - 1 do
begin
Memo1.Add(IntToStr(Level) + ' ' + MenuItem[I].Name);
if MenuItem[I].Count > 0 then
CheckMenuItems(MenuItem[I], Level + 1)
end;
Memo1.Add('');
end;
И вызов:
CheckMenuItems(MainMenu1.Items)
|
|
eclipse (статус: Посетитель), 31 марта 2013, 13:21 [#6]:
Не не то. И не работает.
|
|
eclipse (статус: Посетитель), 31 марта 2013, 13:39 [#7]:
Короче.... изначально была такая задумка: по правому клику появляется popupmenu в которое подгружается скан директории диска (ну допустим С), только первые папки, затем по наведению курсора должно выполняться сканирование, на наведённую папку, и результат добавлять в этот item, на который был наведён курсор... и так далее. В общем сделать что-то вроде дерева каталогов, только организовать это в PopupMenu.
Как найти куда наведён курсор я сделал, но вот много вопросов осталось:
1. как узнаеть есть ли субменю у Itema, куда наведён курсор;
2. построить полный путь по Caption' ам к выделенной Item;
3. по наведению на Item, если у него есть субменю, оно открывается (это пофиг), но при разворачивании субменю происходит событие OnClick! (это тоже большая проблема).
Ну вот как-то так.
|
|
Александр Дубик (статус: 1-ый класс), 31 марта 2013, 15:00 [#8]:
Сама по себе идея вывода дерева каталогов посредством MenuItem не очень хороша.
Первые два вопроса можно решить следующим образом:
function BuildPath(const MenuItem: TMenuItem): string;
var
CurItem: TMenuItem;
begin
Result := '';
CurItem := MenuItem.
while CuItem is TMenuItem do
begin
Result := Format('%s > %s', [CurItem.Caption, Result]);
CurItem := CurItem.Parent;
end
end;
procedure frmMain.pmiClick(Sender: TObject);
begin
with (Sender as RMenuItem) do
begin
Memo1.Lines.Add(BuildPath(Items));
if Count > 0 then
Memo1.Items.Add(Format('Пункт "%s" не пустой', [Caption]));
end
end;
А, вот по 3 вопросу, если необходимы какие-то действия во всех случаях, независимо от того есть ли у выбранного пункта дочерние элементы или нет. То без написания собственного компонента не обойтись.
П.с. Код не проверял, может сразу не скомпилироваться
|
|
eclipse (статус: Посетитель), 31 марта 2013, 15:11 [#9]:
[quote]А, вот по 3 вопросу[/quote]
Мда... тут самое сложное. С этим пунктом ещё одна проблема - дерево не строится при наведении.
|
|
min@y™ (статус: Доктор наук), 1 апреля 2013, 08:13 [#10]:
А зачем через меню? Не проще ли и красивее будет через TTreeView? Да есть и TShellTreeView, зачем мучиться?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Ерёмин А.А. (статус: *Администратор), 10 апреля 2013, 16:35 [#12]:
Цитата (eclipse):
Так этим самым мы проверим только самое первое (так сказать) меню. А у этого меню есть item' ы, у которых надо узнать есть ли у них субменю.
А как у пункта меню могут внутри быть подменю второго уровня, если нет подменю первого? 
Вижу, что обсуждение пошло в другую сторону, но не удержался ответить
|
|
eclipse (статус: Посетитель), 11 апреля 2013, 17:21 [#13]:
Не надо смеяться... вы же меня поняли. Может быть и правильнее было сказать что у Item' a узнать есть ли итемы.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|