Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.10;
Скачать: CL | DM;

Вниз

Формирование меню из таблици базы данных   Найти похожие ветки 

 
Lex_! ©   (2006-09-21 07:51) [0]

Всем доброе время суток.
Вопрос собственно следующий: имеется таблица с пунктами меню, требуется сформировать это самое меню, но ... пункты меню некоторые должны быть вложенные.. т.е.
есть допустим:

1 "Пункт 1" "СубМеню" "n1" ""
2 "Пункт 2" "НеСубМеню" "n2" "n1"

n1,n2 именя меню пунктов, во втором пункте n1 имя родительсмкого пункта... внутри чего он быть должен...

Так вот как программно организовать это вложение?


 
ЮЮ ©   (2006-09-21 07:58) [1]


> Так вот как программно организовать это вложение?

Написать код. Или это за тебя кто-то должен сделать?


 
Mike Kouzmine ©   (2006-09-21 07:59) [2]

Так же как и не программно. Самое понятное - почитать справку. Там ВСЕ НАПИСАНО.


 
evvcom ©   (2006-09-21 08:32) [3]

> [0] Lex_! ©   (21.09.06 07:51)

Обычно структуру делают типа такого:
Id,ParentId,Caption
1,null,"Пункт 1"
2,1,"Пункт 1.1"
3,1,"Пункт 1.2"
4,null,"Пункт 2"
и т.д.


 
Lex_! ©   (2006-09-21 09:43) [4]


> ЮЮ

Типа сумничал? .......
Если бы я знал как это сделать я бы не спрашивал .....  Не знаешь или не хочешь говорить как - лучче промолчать .....


> evvcom

Оно так и с делано только порядок не такой ....
Вопрос в том как это писать ....

сейчас так:
 dm.MainMenuSql.Open;
 dm.MainMenuSql.First;
 for  i:= 1 to dm.MainMenuSql.RecordCount do
     Begin
      mn:=TMenuItem.Create(n1);
      mn.Name:=dm.MainMenuSql.FieldByName("NameMenu").AsString;
      mn.Caption:=dm.MainMenuSql.FieldByName("TextMenu").AsString;
      MainMenu.Items.Insert(tmpMenu.Items.Count+i,mn);
      dm.MainMenuSql.Next;
     end;

но .... тут что - то не так....
Где не так.... другой ворпос ... о чем я и спрашиваю ....


 
Сергей М. ©   (2006-09-21 09:57) [5]


> тут что - то не так.


"Не так" здесь начинается уже с использования RecordCount.

Цикл д.б. таким:

 dm.MainMenuSql.Open;
 while not dm.MainMenuSql.Eof do
    Begin
     ...
     dm.MainMenuSql.Next;
    end;


 
Lex_! ©   (2006-09-21 10:27) [6]

Сергей М.  - не принципиально.
Конкретно по теме можно?


 
ЮЮ ©   (2006-09-21 10:35) [7]


> Lex_! ©   (21.09.06 09:43) [4]
> > ЮЮ
> Типа сумничал? .......


А сразу код привести нельзя было, чтобы умничать не приходилось?

if dm.MainMenuSql.FieldByName(<5-е, там где "n1">).AsString = 0 then
 //пункт главного меню
 MainMenu.Items.Insert(tmpMenu.Items.Count+i,mn)
else begin
 // подменю
 <ищем пункт меню по имени и в него делаем  Items.Insert>
end;


 
ЮЮ ©   (2006-09-21 10:36) [8]

AsString = "", конечно. Это я опять сумничал :)


 
Lex_! ©   (2006-09-21 10:53) [9]

:)
про значение понятно... )


 
Lex_! ©   (2006-09-21 11:11) [10]

procedure TMainForm.FormShow(Sender: TObject);
var mn:TMenuItem;
    i:integer;
    s:string;
begin
 dm.MainMenuSql.Open;
 dm.MainMenuSql.First;
 for  i:= 1 to dm.MainMenuSql.RecordCount do
     Begin
      s:=dm.MainMenuSql.FieldByName("OwnerMenu").AsString;
      if s<>"" then
      mn:=TMenuItem.Create(MainMenu)else mn:=TMenuItem.Create(TMenuItem(MainMenu.FindComponent(s)));
      if s = "" then
      MainMenu.Items.Insert(MainMenu.Items.Count+i,mn)
     else begin
       TMenuItem(MainMenu.FindComponent(s)).Insert(TMenuItem(MainMenu.FindComponent(s)) .Count+1,mn);
          end;
          dm.MainMenuSql.Next;
 end;

end;


 
Lex_! ©   (2006-09-21 11:11) [11]

Вот так тоже не пашить ...
Или я туплю или одно изх двух ... :о\


 
ЮЮ ©   (2006-09-21 11:38) [12]

var
 parentName: string;
 newItem , parentItem:  TMenuItem;

....
 

while not dm.EOF do begin
 parentName := dm.MainMenuSql.FieldByName("OwnerMenu").AsString;
 newItem := TMenuItem.Create(MainMenu);
 newItem.Caption := ...
 ...
 if ParentName = "" then
   parentItem := MainMenu.Items;
 else
   parentIem := TMenuItem(MainMenu.FindComponent(parentName));
 if parentIem = nil then begin
   // подумать над структурой запроса, чтобы такого не случалось
   // или над механизмом отложенной вставки, если элемент подменю
   // поднят из базы раньше самого подменю
 end
 else
   parentItem.Inser(newItem);
 dm.MainMenuSql.Next;
end;


 
Lex_! ©   (2006-09-22 05:06) [13]

ЮЮ - благодарю, все работает ..)


 
evvcom ©   (2006-09-22 08:58) [14]

> [6] Lex_! ©   (21.09.06 10:27)

Это будет принципиально в другом твоем вопросе. Чтобы его предотвратить, воспользуйся советом и попробуй понять, почему RecordCount в данном случае использовать нельзя.


 
Lex_! ©   (2006-10-05 13:22) [15]

А таки пояснить необразованному?...


 
MsGuns ©   (2006-10-05 13:33) [16]

>Lex_! ©   (05.10.06 13:22) [15]
>А таки пояснить необразованному?...

Необразованный может в ДВУХ словах объяснить нафига задумано пункты меню держать в БД и каким макаром назначить обработчики этим пунктам и кто проверит "на лету" корректность назначения этих обработчиков ?

Точно также нельзя объяснить в двух словах почему Jet (OLE DB) или ODBC (это такие хреновины, которые испрользуются ADO для "общения с различными СУБД) не считает нужным открывать курсор на клиенте только после того, как на него на свалятся все 10 000 000 записей, выданных сервером в ответ на запрос, посланный подобным НЕОБРАЗОВАННЫМ программером.


 
Lex_! ©   (2006-10-05 13:54) [17]

пунктов меню максимум 100.
а никак не 10 млн.


 
MsGuns ©   (2006-10-05 13:59) [18]

>Lex_! ©   (05.10.06 13:54) [17]
>пунктов меню максимум 100. а никак не 10 млн.

???

Умываю руки.. Чего и остальным советую


 
Lex_! ©   (2006-10-05 14:03) [19]

конкретно касаемо даного случая я говорю ..



Страницы: 1 вся ветка

Текущий архив: 2006.12.10;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.035 c
1-1161938497
Krants
2006-10-27 12:41
2006.12.10
PopupMenu и Hint


2-1164360390
susergey
2006-11-24 12:26
2006.12.10
запуск программы


2-1163878857
c0rben
2006-11-18 22:40
2006.12.10
Фиксированный вывод


4-1154079901
Alkid
2006-07-28 13:45
2006.12.10
ShellExecuteEx и ошибка 1155


15-1164265481
SerJaNT
2006-11-23 10:04
2006.12.10
Возвраст