Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.02.2015, 16:47   #1
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию Динамический вложенный popupmenu

Здравствуйте! Сломал уже всю голову. Надо динамически создавать popupmenu с заранее неизвестным количеством пунктов и вложенных пунктов. Создается он исходя из текста такого вида:
Код:
Пункт 1\подпункт 1\команда 1
Пункт 1\подпункт 1\команда 2
Пункт 1\подпункт 2\команда 1
Пункт 2\подпункт 1\команда 1
Пункт 2\подпункт 1\команда 2
и так далее...
Вложений может быть много, разделителем субменю является обратный слэш. Текст у меня размещен в listview построчно. В первом столбце сам текст, приведенный выше, во втором команда, которая будет выполняться по нажатию на пункт меню. Естественно, надо, чтобы не происходило дублирования родительских пунктов меню.
Основные родительские пункты меню добавляю следующим образом:
Код:
   var
    temp,tt:string;
    FMenuItem: TMenuItem;
    i, y:Integer;
    sovp:Boolean;
Begin
      for i:=0 to ListView1.Items.Count-1 do
        begin
          tt:= ListView1.Items[i].Caption;
          sovp:=false;
          if Pos('\',tt)<> 0 then
            begin
             temp:= Copy(tt,1,Pos('\',tt)-1);
              begin
                 for y:=0 to PopupMenu2.Items.Count-1 do
                  begin
                    if PopupMenu2.Items[y].Caption=temp  then
                      begin
                        sovp:=true;
                        Break;
                      end;
                  end;
                  if sovp=false then
                    begin
                     FMenuItem := TMenuItem.Create(Self);
                      with FMenuItem do
                      begin
                        OnClick := FPopupMenuClick;
                        Caption :=temp;
                        tag:=i;
                      end;
                      PopupMenu2.Items.Add(FMenuItem);
                    end;
              end;

            end;
        end;
end;
В процедуре FPopupMenuClick идет обработка выбора пункта меню через sender.tag.
Ума не приложу, как добавить все остальные подпункты. Может, кто подскажет, в какую сторону копать, буду признателен.
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 15.02.2015, 16:55   #2
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

xml возьмите и не парьтесь по пустякам
lomastr_ вне форума Ответить с цитированием
Старый 15.02.2015, 19:05   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

xml конечно удобней, но можно и по массиву, при условии, что он корректно подготовлен. В примере просто массив констант, что идеи не меняет
Код:
const n = 5;
      a: array[0..n-1] of String = ('Пункт 1\подпункт 1\команда 1',
                                    'Пункт 1\подпункт 1\команда 2',
                                    'Пункт 1\подпункт 2\команда 1',
                                    'Пункт 2\подпункт 1\команда 1',
                                    'Пункт 2\подпункт 1\команда 2');
var i,j1,j2,k,m: Integer;
    s: String;
    Items,ItemNew: TMenuItem;
begin
  for i:=0 to n-1 do begin
    j1:=1;
    Items:=PopupMenu1.Items;
    repeat
      j2:=PosEx('\',a[i],j1);
      if j2=0 then s:=Copy(a[i],j1,Length(a[i])) else s:=Copy(a[i],j1,j2-j1);
      m:=-1;
      for k:=0 to Items.Count-1 do
        if Items.Items[k].Caption=s then begin m:=k; Break; end;
      if m=-1 then begin
        ItemNew:=TMenuItem.Create(Items);
        ItemNew.Caption:=s;
        Items.Add(ItemNew);
        m:=Items.Count-1;
      end;
      Items:=Items.Items[m];
      j1:=j2+1;
      if j2=0 then ItemNew.OnClick:=MenuItemClick;
    until j2=0;
  end;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.02.2015, 22:38   #4
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Аватар, спасибо, очень помог! К сожалению, почему-то не могу ставить отзыв на ответ уже в который раз...
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вложенный класс в шаблон. Указатель на вложенный класс в возвращаемом значении метода шаблона. Что делать? Asya1994 Помощь студентам 3 09.12.2012 01:43
Вложенный запрос GinIvan Помощь студентам 0 27.03.2012 13:01
Вложенный запрос Ti_pain) SQL, базы данных 2 17.12.2011 16:56
Динамический массив - или всё таки не динамический? vedro-compota Общие вопросы C/C++ 30 10.12.2010 23:22
не работает вложенный catch jorjik Общие вопросы C/C++ 5 13.07.2008 22:37