字符串如何转换为程序名 ( 积分: 100 )

  • 主题发起人 主题发起人 gxcddnk
  • 开始时间 开始时间
G

gxcddnk

Unregistered / Unconfirmed
GUEST, unregistred user!
在编写动态菜单是,要用到menu.onclick:=abc,abc是我的过程名,但是过程名是从一个表中取出的,是用字符串来表示的,即'abc',如何把这个'abc'变成abc?
 
这个我也碰到过.没有解决.我是用IF THEN 去赋值的.别的没好的方法.
 
你可以看看ToolsAPI,特别是里面的typinfo
 
说错了,是source/rtl/common目录中的TypInfo
 
可以使用actionList,然后在根据组件名称来指定<br>unit&nbsp;Unit1;<br><br>interface<br><br>uses<br>&nbsp;&nbsp;Windows,&nbsp;Messages,&nbsp;SysUtils,&nbsp;Variants,&nbsp;Classes,&nbsp;Graphics,&nbsp;Controls,&nbsp;Forms,<br>&nbsp;&nbsp;Dialogs,&nbsp;StdCtrls,&nbsp;ActnList;<br><br>type<br>&nbsp;&nbsp;TForm1&nbsp;=&nbsp;class(TForm)<br>&nbsp;&nbsp;&nbsp;&nbsp;Button1:&nbsp;TButton;<br>&nbsp;&nbsp;&nbsp;&nbsp;ActionList1:&nbsp;TActionList;<br>&nbsp;&nbsp;&nbsp;&nbsp;aaa:&nbsp;TAction;<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;Button1Click(Sender:&nbsp;TObject);<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;aaaExecute(Sender:&nbsp;TObject);<br>&nbsp;&nbsp;private<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;Private&nbsp;declarations&nbsp;}<br>&nbsp;&nbsp;public<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;Public&nbsp;declarations&nbsp;}<br>&nbsp;&nbsp;end;<br><br>var<br>&nbsp;&nbsp;Form1:&nbsp;TForm1;<br><br>implementation<br><br>{$R&nbsp;*.dfm}<br>procedure&nbsp;TForm1.Button1Click(Sender:&nbsp;TObject);<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;button1.Action&nbsp;:=&nbsp;FindComponent('aaa')&nbsp;as&nbsp;TbasicAction&nbsp;;<br>end;<br><br>procedure&nbsp;TForm1.aaaExecute(Sender:&nbsp;TObject);<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;showmessage('aaa&nbsp;is&nbsp;Excute!');<br>end;<br><br>end.
 
给MENUITEM的TAG设置上不同的编号,执行一个ONCLICK事件,要事件里区分<br>用&nbsp;<br>with&nbsp;tmenuitem(sender)&nbsp;do<br>&nbsp;case&nbsp;tag&nbsp;of<br>&nbsp;&nbsp;1:<br>&nbsp;&nbsp;2:<br>&nbsp;&nbsp;3:<br>&nbsp;end;<br>这样不是简单的多嘛,如果要用数据库,取出来放到一个tstringlist里,然后strings[tmenuitem(sender).tag]就知道是什么了
 
程序还要判断用户权限,不同用户权限不一样,菜单也不一样,有些用户有的菜单其他用户没有
 
首先,函数得在类的published部分声明<br>TObject有个MethodAddress方法,可以根据函数名得到published函数的指针<br>声明一个参数与指定函数相同的函数指针,然后将得到的指针强制转换,然后就能调用了
 
uses&nbsp;TypInfo<br><br>published<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;MYPROC(Sender:&nbsp;TObject);<br><br>var<br>&nbsp;&nbsp;&nbsp;&nbsp;b1:&nbsp;TMenuItem;<br>&nbsp;&nbsp;&nbsp;&nbsp;PropInfo:&nbsp;PPropInfo;<br>&nbsp;&nbsp;&nbsp;&nbsp;Method:&nbsp;TMethod;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;b1&nbsp;:=&nbsp;TMenuItem.Create(N3);<br>&nbsp;&nbsp;&nbsp;&nbsp;N3.Insert(0,b1);<br>&nbsp;&nbsp;&nbsp;&nbsp;b1.Caption&nbsp;:=&nbsp;'测试';<br><br>&nbsp;&nbsp;&nbsp;&nbsp;PropInfo&nbsp;:=&nbsp;GetPropInfo(b1,&nbsp;'OnClick');<br>&nbsp;&nbsp;&nbsp;&nbsp;Method.Code&nbsp;:=&nbsp;Self.MethodAddress('MYPROC');<br>&nbsp;&nbsp;&nbsp;&nbsp;Method.Data&nbsp;:=&nbsp;Self;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;assigned(propInfo)&nbsp;and&nbsp;assigned(Method.Code)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetMethodProp(b1,&nbsp;PropInfo,&nbsp;Method);<br>end;
 
谢谢各位了,后来我是这样解决了,受到各位的启发<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mmenu:Array[1..10]&nbsp;of&nbsp;tmenuitem;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i,j:integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PAddr:&nbsp;pointer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;M:&nbsp;TMethod;<br>begin<br>&nbsp;&nbsp;&nbsp;..........<br>.................<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PAddr&nbsp;:=&nbsp;MethodAddress(trim(adodataset1.FieldValues['procname']));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;M.Code&nbsp;:=&nbsp;PAddr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mmenu.Items[j-1].OnClick&nbsp;:=&nbsp;TNotifyEvent(M);<br>end;
 
我觉得在复杂的程序,你的窗体名字也要唯一,调用方法也不要图省事使用这种取巧的方法,单独调用吧,你将来会发现单独调用带给你的灵活性。
 

Similar threads

回复
0
查看
867
不得闲
回复
0
查看
995
不得闲
S
回复
0
查看
911
SUNSTONE的Delphi笔记
S
后退
顶部