原来有一个菜单原型PopupMenu1
我想在菜单上动态增加一些不顶项的子项
所以用动态数组
sMenuItem:array of TMenuItem;
然后给它设置长度(从数据库中取出记录个数)setLength(sMenuItem,记录个数);
然后把它添加到Popupmenu1成功。
但是我想再创建一次动态的菜单,就会出现错误,错误提示:不能创建两次菜单。
那我要怎么样才能,动态创建无数次的菜单呢?
类似联众或QQ的游戏,就是右键点一下改房间图标,菜单创建出房间里用户的姓名。信息等。
注释部分本来想消除创建部分,可以没有效果,还是提示不能创建第二次。
--下面是部分源代码---用ListView的SelectItem事件。。
procedure TfrmMainForm.ListViewSelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
var i,s,t:integer;
begin
if Selected=true then begin
GuestsDataSet.Close;
GuestsDataSet.CommandText:='select * from AllGuests where RoomNO='''+Item.Caption+'''';
LKGrid.DataSource:=DataSource1;
GuestsDataSet.Open;
//
//for t:=3 to PopupMenu1.Items[2].Count-1 do begin
// PopupMenu1.Items[2].Items[t].Destroy;
//end;
RoomDataSet.CommandText:='select * from AllGuests where RoomNo='''+Item.Caption+'''';
RoomDataSet.Open;
if RoomDataSet.RecordCount>0 then begin
SetLength(sMenuItem,RoomDataSet.RecordCount);
for i:=low(sMenuItem) to High(sMenuItem) do begin
sMenuItem[i]:=TMenuItem.Create(self);
sMenuItem[i].Name:='GN'+InttoStr(i);
sMenuItem[i].Caption:=RoomDataSet.fieldbyName('Name').AsString;
sMenuItem[i].Hint:=RoomDataSet.fieldbyName('Name').AsString;
PopupMenu1.Items[2].Add(sMenuItem[i]);
s:=3+i;
PopupMenu1.Items[2].Items[s].Add(xMenuItem);
RoomDataSet.Next;
end;
end;
RoomDataSet.Close;
//
end;
end;
我想在菜单上动态增加一些不顶项的子项
所以用动态数组
sMenuItem:array of TMenuItem;
然后给它设置长度(从数据库中取出记录个数)setLength(sMenuItem,记录个数);
然后把它添加到Popupmenu1成功。
但是我想再创建一次动态的菜单,就会出现错误,错误提示:不能创建两次菜单。
那我要怎么样才能,动态创建无数次的菜单呢?
类似联众或QQ的游戏,就是右键点一下改房间图标,菜单创建出房间里用户的姓名。信息等。
注释部分本来想消除创建部分,可以没有效果,还是提示不能创建第二次。
--下面是部分源代码---用ListView的SelectItem事件。。
procedure TfrmMainForm.ListViewSelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
var i,s,t:integer;
begin
if Selected=true then begin
GuestsDataSet.Close;
GuestsDataSet.CommandText:='select * from AllGuests where RoomNO='''+Item.Caption+'''';
LKGrid.DataSource:=DataSource1;
GuestsDataSet.Open;
//
//for t:=3 to PopupMenu1.Items[2].Count-1 do begin
// PopupMenu1.Items[2].Items[t].Destroy;
//end;
RoomDataSet.CommandText:='select * from AllGuests where RoomNo='''+Item.Caption+'''';
RoomDataSet.Open;
if RoomDataSet.RecordCount>0 then begin
SetLength(sMenuItem,RoomDataSet.RecordCount);
for i:=low(sMenuItem) to High(sMenuItem) do begin
sMenuItem[i]:=TMenuItem.Create(self);
sMenuItem[i].Name:='GN'+InttoStr(i);
sMenuItem[i].Caption:=RoomDataSet.fieldbyName('Name').AsString;
sMenuItem[i].Hint:=RoomDataSet.fieldbyName('Name').AsString;
PopupMenu1.Items[2].Add(sMenuItem[i]);
s:=3+i;
PopupMenu1.Items[2].Items[s].Add(xMenuItem);
RoomDataSet.Next;
end;
end;
RoomDataSet.Close;
//
end;
end;
mItem: TMenuItem;
I: Integer;
begin
while not RoomDataSet.Eof do
begin
mItem := TMenuItem.Create(PopupMenu1);
mItem.Name:='GN'+InttoStr(RoomDataSet.RecNO);
mItem.Caption:=RoomDataSet.fieldbyName('Name').AsString;
mItem.Hint:=RoomDataSet.fieldbyName('Name').AsString;
PopupMenu1.Items[2].Add(mItem);
RoomDataSet.Next;
end;
end;
谢谢你的回复,不过你的方法再菜单菜单再次创建的时候还是会出错
PopupMenu1.Items[2].Items[s].Add(xMenuItem);
其余代码我测试了一下,通过
也就是962veiri(风尘旅人) 说的
PopupMenu1.Items[2].Items[s].Add(xMenuItem);
因为xMenuItem是一开始创建好了,把它放到这段程序中就ok了。哇哈哈
放分了。。