![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Формирование меню из таблици базы данных
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]
> Так вот какпрограммно организовать это вложение?
Написать код. Или это за тебя кто-то должен сделать?