很简单的动态创建子菜单的问题(50分)

  • 主题发起人 主题发起人 LeonSu
  • 开始时间 开始时间
L

LeonSu

Unregistered / Unconfirmed
GUEST, unregistred user!
源程序如下:
procedure TForm1.LoadMenuItem(var aMenuList: array of TMenuItem);
var
RFile: TIniFile;
I: Integer;
S: String;
begin
RFile:=TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini'));
Try
For I:=0 to high(aMenuList)-1 do
begin
S:=RFile.ReadString('Recent File','Rec'+IntToStr(I),'');
If S<>'' then
begin
aMenuList:=TMenuItem.Create(Self);
With aMenuList do
begin
Caption:=Format('&amp;%d %s',[I,S]);
Name:='Recent'+IntTostr(I);
OnClick:=MyMenuItemClick;
end;
end;
end;
Finally
RFile.Free;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
aMenuItem: array[0..9] of TMenuItem;
begin
LoadMenuItem(aMenuItem);
RecFile1.Add(aMenuItem);
end;
从外部的INI文件中读取字串,生成一个子菜单数组最后一次性插入到一个固定的菜单(RecFile1)中,
插入是成功了,但每次都要说:menu insert twice!菜单插入了两次,搞不懂,
把代码改为一个个的读取、插入就没问题了
请大虾指教。
 

For I:=0 to high(aMenuList)-1 do改为
for I := low(aMenuList) to high(aMenuList)即可
 
首先 high(aMenuList)-1 没有必要 -1
如果10个菜单项都定义了,你的程序是不会有问题的。
[Recent File]
Rec0=AAAAAAA
Rec1=AAAAAAA
Rec2=AAAbbbb
Rec3=ccccccc
Rec4=ddddddd
Rec5=ddddddd
Rec6=ddddddd
Rec7=ddddddd
Rec8=ddddddd
Rec9=ddddddd

象以下这样就会出错:

[Recent File]
Rec0=AAAAAAA
Rec1=AAAAAAA
这里缺一项
Rec3=ccccccc
Rec4=ddddddd
Rec5=ddddddd
Rec6=ddddddd
Rec7=ddddddd
Rec8=ddddddd
Rec9=ddddddd


你的问题是 aMenuList 中存在空项的情况会出错。 Add 不允许这样。
所以在初始菜单应该有几项菜单,aMenuList的长度就为多少!

修改成以下的程序就可以了:

procedure TForm1.bb1Click(Sender: TObject);
begin
showmessage('a menu');
end;

procedure TForm1.LoadMenuItem(var aMenuList: array of TMenuItem;var ms:integer);
// ^<<添加一个参数
//ms 返回初始化的菜单项数
var
RFile: TIniFile;
N,I: Integer;
S: String;

begin
RFile:=TIniFile.Create('d:/tmp.ini');
N:=0;
Try
For I:=0 to high(aMenuList) do
begin
S:=RFile.ReadString('Recent File','Rec'+IntToStr(I),'');
If S<>'' then
begin
aMenuList[n]:=TMenuItem.Create(Self);
With aMenuList[n] do
begin
Caption:=Format('&amp;%d %s',[I,S]);
Name:='Recent'+IntTostr(I);
OnClick:=bb1Click;
end;
inc(n);
end;
end;
Finally
RFile.Free;
end;
ms:=n;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
aMenuItem: array of TMenuItem;//声明为动态数组,以便调整项数
n:integer;
begin
SetLength(aMenuItem,10);
LoadMenuItem(aMenuItem,n);
if n>0 then
begin
SetLength(aMenuItem,n)
//调整项数。前 n 项都是有效的。
RecFile1.Add(aMenuItem);
end;
SetLength(aMenuItem,0);
end;
 
我的INI文件中是这样定义的:
[Recent File]
Rec0=AAAAAAA
Rec1=AAAAAAA
Rec2=
Rec3=
Rec4=
Rec5=
Rec6=
Rec7=
Rec8=
Rec9=

其次,为什么会报“菜单插入两次”这个错误。
 
因为你的以下值全为 '' ,原因已经上面讲得很清楚。
这和缺该项的效果是一样的,相应的菜单项没有创建,添加时会失败。
Rec2=
Rec3=
Rec4=
Rec5=
Rec6=
Rec7=
Rec8=
Rec9=
我上面的是成功代码,你用就可以了。
 
接受答案了.
 
后退
顶部