| 
| 
 | Вопрос # 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 узнать есть ли итемы. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |