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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2011, 10:05   #1
Ky3Heu,
Пользователь
 
Регистрация: 01.04.2009
Сообщений: 94
Лампочка Многоуровневое дропдаун меню

Есть проблемка. Нужно составить многоуровневое дропдаун меню в виде:

3 уровня:
Служба->Список цехов в службе->По каждому цеху список участков

2 уровня:
Служба->Cписок участков.

Вложенность уровней у каждой службы своя но не менее 2-х и не более 3-х.
Вот код, но он не совсем работает. Подскажите, что не так.
Код:
procedure TRegF.FormShow(Sender: TObject);
var l2,l3,ab :String;
begin

MainF.OpenTables;

  for I := 0 to DMF.sCeh.RecordCount-1 do
  begin

    mlvl1         := TMenuItem.Create(self);
    mlvl2         := TMenuItem.Create(self);

    ab := Trim(DMF.sCehABBR.Value);

    DMF.sDownL2.Close;
    DMF.sDownL2.SQL.Clear;
    DMF.sDownL2.SQL.Add('Select * from DownLvl2 where abbr = :ab');
    DMF.sDownL2.Parameters.ParamByName('ab').Value := ab;
    DMF.sDownL2.Open;

    mlvl1.Caption := Trim(DMF.sCehABBR.Value);
    mlvl2.Caption := Trim(DMF.sDownL2LVL2.Value);
    sObj.Items.Add(mlvl1);
    sObj.Items.Items[i].Add(mlvl2);
    mlvl1.OnClick := self.MenuSelect;
    mlvl2.OnClick := self.SubMenuSelect;

    l2 := Trim(DMF.sDownL2LVL2.Value);

    if DMF.sCehDownLvl.Value = 3 then
    begin

      DMF.sDownL3.Close;
      DMF.sDownL3.SQL.Clear;
      DMF.sDownL3.SQL.Add('Select * from DownLvl3 where downlvl2 = :dl2');
      DMF.sDownL3.Parameters.ParamByName('dl2').Value := l2;
      DMF.sDownL3.Open;

        for j := 0 to DMF.sDownL3.RecordCount-1 do
        begin
        mlvl3 := TMenuItem.Create(self);
        mlvl3.Caption := Trim(DMF.sDownL3DownLvl3.Value);
        mlvl3.Tag:=0;
        sObj.Items.Items[i].Items[j].Add(mlvl3);
        DMF.sDownL3.Next;
        mlvl3.Free;
        end;//for j := 0 to DMF.sDownL3.RecordCount-1

      mlvl3.OnClick := self.L3MenuSelect;

    end;//if DMF.sCehDownLvl.Value = 3

   DMF.sCeh.Next;
   mlvl1.Free;
   mlvl2.Free;
   mlvl3.Free;

  end; //for I := 0 to DMF.sCeh.RecordCount-1
По ракетам и хоккею - Россияне всех сильней!
Ky3Heu, вне форума Ответить с цитированием
Старый 30.06.2011, 10:50   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
Код:
        for j := 0 to DMF.sDownL3.RecordCount-1 do  begin
          mlvl3 := TMenuItem.Create(self);
          mlvl3.Caption := Trim(DMF.sDownL3DownLvl3.Value);
          mlvl3.Tag:=0;
          sObj.Items.Items[i].Items[j].Add(mlvl3);
          DMF.sDownL3.Next;
          mlvl3.Free;
        end;  //for j := 0 to DMF.sDownL3.RecordCount-1

      mlvl3.OnClick := self.L3MenuSelect;
Цитата:
mlvl3.OnClick := self.L3MenuSelect;
а почему она ВНЕ цикла. Назначать обработчик надо КАЖДОМУ вновь создаваемому (Create) объекту.
Внести внутрь цикла.

Цитата:
mlvl3.Free;
Только добавили и сразу удалять(уничтожать объект)?
Надо убрать эту строчку.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 30.06.2011, 12:15   #3
Ky3Heu,
Пользователь
 
Регистрация: 01.04.2009
Сообщений: 94
По умолчанию

спасибо, попробую. mlvl3.free добавил уже от безысходности.
По ракетам и хоккею - Россияне всех сильней!
Ky3Heu, вне форума Ответить с цитированием
Старый 30.06.2011, 12:26   #4
Ky3Heu,
Пользователь
 
Регистрация: 01.04.2009
Сообщений: 94
По умолчанию

при втором обороте цикла по j на строке
Код:
sObj.Items.Items[i].Items[j].Add(mlvl3);
выдает ошибку List index out of bounds
По ракетам и хоккею - Россияне всех сильней!
Ky3Heu, вне форума Ответить с цитированием
Старый 30.06.2011, 12:29   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
DMF.sCeh.Next;
mlvl1.Free;
mlvl2.Free;
mlvl3.Free;

end; //for I := 0 to DMF.sCeh.RecordCount-1
ЭТи Free тоже не нужны. по тем же причинам.

немного переделал код
Код:
  for I := 0 to DMF.sCeh.RecordCount-1 do
  begin

    mlvl1         := TMenuItem.Create(self);
    mlvl1.Caption := Trim(DMF.sCehABBR.Value);
    sObj.Items.Add(mlvl1);
    mlvl1.OnClick := self.MenuSelect;

    mlvl2         := TMenuItem.Create(self);
    mlvl2.Caption := Trim(DMF.sDownL2LVL2.Value);
// следующую строку наверное можно и так
    mlv1.Add(mlv2); //  sObj.Items.Items[i].Add(mlvl2);
    mlvl2.OnClick := self.SubMenuSelect;
если так то
mlvl1.OnClick := self.MenuSelect;
становится излишней. Для меню верхних уровней обычно достаточно стандартных действий. (Обработчик не назначается).

аналогично
Код:
        for j := 0 to DMF.sDownL3.RecordCount-1 do
        begin
        mlvl3 := TMenuItem.Create(self);
        mlvl3.Caption := Trim(DMF.sDownL3DownLvl3.Value);
        mlvl3.Tag:=0;
// видимо так
        mlv2.add(mlv3); //  sObj.Items.Items[i].Items[j].Add(mlvl3);
и соответственно вопрос о нужности строки
mlvl2.OnClick := self.SubMenuSelect;

P.S. Задавайте только те свойства, которые были бы введены (заданы) при создании данных пунктов меню во время проектирования.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 30.06.2011 в 12:51.
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многоуровневое рисование. Alex Cones Win Api 2 11.10.2010 20:54
Многоуровневое меню по данному css коду Vladimirko HTML и CSS 0 26.08.2010 01:11
Меню с Items в виде набора Bitmap (как меню редактирования в Word'е) chandrasecar Мультимедиа в Delphi 7 14.01.2009 09:20
MainMenu многоуровневое *Devil* Общие вопросы Delphi 1 18.06.2007 00:05