Форум: "Базы";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
ВнизФормирование меню из таблици базы данных Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.043 c