Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 401

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты! Банальный вопрос - как проверить есть ли submenu у item' а? Без использования try except.

Примечание #1 (31 марта 2013, 11:42):
PopupMenu

eclipse Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

eclipse (статус: Посетитель), 31 марта 2013, 11:49 [#2]:

Так этим самым мы проверим только самое первое (так сказать) меню. А у этого меню есть item' ы, у которых надо узнать есть ли у них субменю.
Александр Дубик

Александр Дубик (статус: 1-ый класс), 31 марта 2013, 11:55 [#3]:

Тебе надо пройтись по всем элементам меню?
В таком случае ничего, кроме рекурсии в голову не приходит.
eclipse

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

eclipse (статус: Посетитель), 31 марта 2013, 13:21 [#6]:

Не не то. И не работает.
eclipse

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

eclipse (статус: Посетитель), 31 марта 2013, 15:11 [#9]:

[quote]А, вот по 3 вопросу[/quote]

Мда... тут самое сложное. С этим пунктом ещё одна проблема - дерево не строится при наведении.
min@y™

min@y™ (статус: Доктор наук), 1 апреля 2013, 08:13 [#10]:

А зачем через меню? Не проще ли и красивее будет через TTreeView? Да есть и TShellTreeView, зачем мучиться?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
eclipse

eclipse (статус: Посетитель), 2 апреля 2013, 06:06 [#11]:

Вот посмотрите и всё сразу станет понятно http://rghost.ru/44970109
Ерёмин А.А.

Ерёмин А.А. (статус: *Администратор), 10 апреля 2013, 16:35 [#12]:

Цитата (eclipse):

Так этим самым мы проверим только самое первое (так сказать) меню. А у этого меню есть item' ы, у которых надо узнать есть ли у них субменю.

А как у пункта меню могут внутри быть подменю второго уровня, если нет подменю первого? :-)

Вижу, что обсуждение пошло в другую сторону, но не удержался ответить ;-)
eclipse

eclipse (статус: Посетитель), 11 апреля 2013, 17:21 [#13]:

Не надо смеяться... вы же меня поняли. Может быть и правильнее было сказать что у Item' a узнать есть ли итемы.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:36
Выполнено за 0.04 сек.