动态创建菜单的问题 (100分)

  • 主题发起人 主题发起人 wind1
  • 开始时间 开始时间
W

wind1

Unregistered / Unconfirmed
GUEST, unregistred user!
自建组件程序如下
unit myMainMenu;

interface

uses
Windows,
Messages,
SysUtils,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
Menus;

type
TmyMainMenu = class(TMainMenu)
private
witem:TMenuItem;
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
published
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('myMenu', [TmyMainMenu]);
end;

{ TMiracleMainMenu }

constructor TMiracleMainMenu.Create(AOwner: TComponent);
begin
inherited Create(AOwner);

witem := TMenuItem.Create(Self);
witem.Caption :='123';
Items.Add (witem);
UpdateItems;
end;

end.

问题出来了,当我运行程序的时候,菜单项变成了一模一样的两个,怀疑是由我的程序
建立实例前,form自动已create了一个实例,但怎么解决呢???
 
你的FORM上已有一个menu了吗?如果FORM上已经有一个menu了,你要生成别的,你可以在程序里自己往里加呀
 
我明白了。 当设计的时候,产生了一个 TMYMainMenu1 的实例,
那么这个实例的 Item 是作为 它的一个属性值,
当程序再运行时,自然运行Create 过程,就再创建多一个 Item;

所以 关键是 1 Create 过程中增加的 Item 正是 delphi 在设计时,能保存的属性值;
2 该属性是可以多个的,也即是列表型的

// 解决的笨方法是,在设计时,把那个新建的东西del 了。
我的方法是,在Create的时候判断系统是否设计状态〔是否正在进行设计,而不是运行〕

把Create 过程改成 下面这样,就解决了!

constructor TMyMainMenu.Create(AOwner: TComponent);
begin

inherited; // Create(AOwner);

if (csDesigning in ComponentState) then //如果是设计状态
begin
witem := TMenuItem.Create(Self);
witem.Caption :='1235';
Items.Add (witem);
end;
// UpdateItems;
end;

我已经通过了。
 
可是这样的话如果在程序中动态创建一个TMyMainMenu会不会有问题呢?我觉得还是屏蔽掉
设计时的创建witem比较好。
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
728
import
I
I
回复
0
查看
633
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部