dynamic menu problem



Hi,

Im trying to get a dynamic main menu loading from a db I have some code
that almost works but instead of having the menus build correctly they
just span across the mainmenu instead of dropping down.

The MSSQL table and Delphi code are below ,If someone is able to point
out where I have gone wrong that would be greatly apprechiated.

Database table is as follows
{begin sql script}
if exists (select * from dbo.sysobjects where id =
object_id(N'[dbo].[TRAK_MENU]') and OBJECTPROPERTY(id, N'IsUserTable')
= 1)
drop table [dbo].[TRAK_MENU]
GO

CREATE TABLE [dbo].[TRAK_MENU] (
[MENU_ID] [int] IDENTITY (1, 1) NOT NULL ,
[MENU_NUM] [int] NULL ,
[COLUMN_NUM] [int] NULL ,
[SORT_NUM] [int] NULL ,
[CAPTION] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[EXEC_DATA] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
) ON [PRIMARY]
GO

{End sql script}


the peice of code im having trouble with is

{begin code}
//Menu_Count is for how many items should always be there i.e
File==>Log off==>Exit
....

Load_Menus(Data.UserAuth.FieldByName('ACCESS').AsInteger,MenuBase,DynamicMenuClick);
.....


procedure TMainForm.Load_Menus(Menu_ID,Menu_Count : integer; Notify:
TNotifyEvent);
procedure BuildASubMenu (mnu : TMenuItem;var ix: integer; level :
integer);
function MakeNewItem(const caption,data: string;Image : integer):
TMenuItem;
begin
Result := TMenuItem.Create(Self);
Result.Caption := Caption;
Result.ImageIndex := Image;
if Data <> '' then
begin
Result.Hint := Data;
Result.OnClick := Notify;
end;
end;
var
last : TMenuItem;
lvl : integer;
begin
showmessage(Data.ReadMenu.FieldByName('COLUMN_NUM').AsString);
last := mnu;
lvl := Data.ReadMenu.FieldByName('COLUMN_NUM').AsInteger;
while (lvl >= level) and (not Data.ReadMenu.Eof) do
begin
if lvl = level
then begin
last :=
MakeNewItem(Data.ReadMenu.FieldByName('CAPTION').AsString,Data.ReadMenu.FieldByName('EXEC_DATA').AsString,-1);
mnu.Add(last);
Data.ReadMenu.Next;
end
else begin
if lvl > level
then BuildASubMenu (last, ix, Level+1);
end;
if ix < Data.ReadMenu.RecordCount
then
begin
lvl := Data.ReadMenu.FieldByName('COLUMN_NUM').AsInteger;
Data.ReadMenu.Next;
end;
end;
end;
var
MENUSQL : string;
i : integer;
last: TMenuItem;
lvl: integer;
begin
MENUSQL := 'SELECT * FROM TRAK_MENU WHERE MENU_NUM =
'+InttoStr(Menu_ID)+' ORDER BY SORT_NUM';
Data.ReadMenu.Close;
Data.ReadMenu.SQL.Text := MENUSQL;
Data.ReadMenu.open;
Data.ReadMenu.First;
for i := BaseMenu.Items.Count - 1 downto Menu_Count do
BaseMenu.Items.Delete(i);
if data.ReadMenu.RecordCount > 0 then
BuildASubMenu(BaseMenu.Items, i, 0);
end;

{end code}




Regards
Martin B

.