Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Формирование меню из таблици базы данных


Lex_! ©   (2006-09-21 07:51:00) 

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

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

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

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


Lex_!   (2006-10-05 14:03:00) [1]

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


MsGuns   (2006-10-05 13:59:00) [2]

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

???

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


Lex_!   (2006-10-05 13:54:00) [3]

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


MsGuns   (2006-10-05 13:33:00) [4]

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

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

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


Lex_!   (2006-10-05 13:22:00) [5]

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


evvcom   (2006-09-22 08:58:00) [6]

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

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


Lex_!   (2006-09-22 05:06:00) [7]

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


ЮЮ   (2006-09-21 11:38:00) [8]

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-21 11:11:00) [9]

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:00) [10]

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


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

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


ЮЮ   (2006-09-21 10:36:00) [12]

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


ЮЮ   (2006-09-21 10:35:00) [13]


> 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;


Lex_!   (2006-09-21 10:27:00) [14]

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


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


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


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

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

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


Lex_!   (2006-09-21 09:43:00) [16]


> ЮЮ

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


> 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;

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


evvcom   (2006-09-21 08:32:00) [17]

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

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


Mike Kouzmine   (2006-09-21 07:59:00) [18]

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


ЮЮ   (2006-09-21 07:58:00) [19]


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо