Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.5 MB
Время: 0.044 c
2-1164272147
Bless
2006-11-23 11:55
2006.12.10
Зачем в TCustomForm.CreateNew второй параметр?


2-1163773206
KyRo
2006-11-17 17:20
2006.12.10
не могу передать файл через TServerSocket


1-1161938497
Krants
2006-10-27 12:41
2006.12.10
PopupMenu и Hint


15-1163783232
TUser
2006-11-17 20:07
2006.12.10
Не сочтите за рекламу,


15-1164098826
Rouse_
2006-11-21 11:47
2006.12.10
Всетаки Мерлин гений, такие проекты поднял в свое время :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский