用Application Wizard写的程序与平常的不同?(50分)

  • 主题发起人 主题发起人 631229
  • 开始时间 开始时间
6

631229

Unregistered / Unconfirmed
GUEST, unregistred user!
我练习写一个简单编辑器。菜单由Application Wizard生成标准的File(其下有New、Open等)、Edit(其下有Undo、Cut、Copy、Paste等)...等等。如果你自己写的话,窗体代码中会有
Filemenu:TmenuItem;
FileNewItem:TmenuItem;
FileOpenItem:TmenuItem;
...
Editmenu:TmenuItem;
CutItem:TmenuItem;
CopyItem:TmenuItem;
PasteItem:TmenuItem;
...
可是Wizard写的程序,窗体代码变成:
FileNewItem:TmenuItem;
FileOpenItem:TmenuItem;
...
CutItem:TmenuItem;
CopyItem:TmenuItem;
PasteItem:TmenuItem;
...
这样我想在运行时动态改变菜单的属性(例如我想将Filemenu的Caption属性"File"改为"文件")就没有办法了,因为如果你写Filemenu.Caption:="文件";编译时说:Undeclared identifier:'FileMenu'
这是怎么回事?怎么解决?
奇怪的是,在Object inspector里却又可以看到FileMenu:TMenuItem
 
不会吧!
 
怎麼會這樣!名字不一樣而已了
 
>>因为如果你写Filemenu.Caption:="文件";编译时说:Undeclared identifier:'FileMenu'
你怎么写的,是使用代码吗?
其实你可以直接设置控件属性的,那个自动生成的东西和你自己写的一样。
使用代码的话?将你的代码贴出来,估计是你的procedure写法问题。
 
To yzhshi:
那个自动生成的东西名字就叫Filemenu我说过在Object inspector里却又可以看到
FileMenu:TMenuItem。
 
这个没错,你直接按F11,然后修改Caption不能吗?——应该也是可以的。
 
在设计时修改是很容易的,我想要运行时动态改变,例如以后我想写成支持中文和英文的,
(当然现在还没有到那一步),这只有通过代码才能实现了。
 
动态修改当然可以了。没问题呀。
贴出来你修改的代码。
我想是你的代码有Bug。
 
我的代码就一句:FileMenu.Caption:="文件";写哪都不行。
 
你把FileMenu定义删掉了吧?
 
其实你们用Open-->New-->Projects-->Application Wizard,将自动出现的菜单
全选上就可以了,最多十分钟的事情,不要你自己打一行代码。然后你在代码里
找是否有FileMenu这个东东,但是Object Inspector分明是有的。
 
改成这样:
FileMenu.Caption:='文件'; // 注意是单引号
不知道是不是这个问题 [:)]
 
但是编译器出错的信息不是说类型不匹配呀,我觉得应该不可能吧,不知道生成的程序是什么样子的。
 
如果主菜单、编辑控件等都是你自己从控件模板上取来放到窗体上的,窗体代码就有相应的
部分。例如你放一个主菜单控件到窗体上,则窗体代码有:MainMenu1:TMainMenu;而Wizard
写的程序不需要你自己从模板上去取,只是给一个提示列表让你选择需要的控件(在其前打
上对钩),我的问题就是:我已经选了具有FileMenu、EditMenu等的一个MainMenu,为什么
在代码里没有看到FileMenu:TMenuItem;,而且自己写上FileMenu.Caption:="文件";编译时
说"Undeclare identifier:'FileMenu'",注意了是“未定义标识符”不是“类型不匹配”
我感到很不爽,难道就没有人愿意花几分钟在Delphi里试一下再来回答问题吗?我怀疑大部
分人甚至没有认真看我的帖子。这个问题看似简单,但我相信属于大侠们不屑、一般人不能
的类型,起码不能算简单,里面可能有一些我们所不了解的概念。如果单是为了解决我的具
体问题,可改为MainMenu.Items[0].Caption:="文件";就能解决。我觉得学东西有时候刨根
问底才能学得扎实。
 
批评的对!仔细看你的代码,确实发现了问题。
它确实没有给FileMenu等赋值。也无法使用!
这个确实是一个不同的地方。那个FileMenu、EditMenu、WindowMenu确实不在定义Type下面列出来。
当然修改一下名称,然后再改回去,它就出来了,然后你注释掉,就会发现,程序不出错!

仔细研究,还会发觉另外一个问题。
就是对于所有的MenuItem,你注释掉,程序都不会出问题。
为什么呢?暂时,我可以这么解释,这是因为存在MainMenu的原因,而MenuItem都是MainMenu里面的“子控件”
可以由它自己定义使用,它完全可以讲它封装在内部,而不让别的控件使用。
这点就和使用Query,同时还可以定义Query1aaa(其中aaa为Query1的字段)基本类似。

我所能作出的解释就是这些。希望别的大侠或者对这方面有研究的给仔细解释一下。
 
呵呵,好样的,这年头还有人这么认真学习

其实Delphi的Application Wizard隐藏了一些我们无需关心的东西,
要知道一个Delphi项目它除了基本的.DPR文件和.PAS文件,还有一个就是.DFM文件
在IDE中,把鼠标放到Form的空白处点击鼠标右键,在弹出的菜单中选择 View As Text
你会看到一些你要找的东西。

不过很可惜,你没有发现秘密就在.DFM里面。现在这里的大富翁们都不太轻易出手的哦。
 
Activer的办法给了我一些启发,但还是不能解释我的疑问
 
那个他没有产生,但是事实上他已经存在了。
不过是没有在pas里面显露出来,就是别的不能调用。

你自己写的Menu,也可以将其中的MenuItem从pas命名里面type下删除,照样不出错。
其实,并不是向导隐藏了很多东西,是Delphi本身决定的。可以这么做。
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部