关于控件遍历的问题请教

changfenglee 2017-03-30 06:45:47
各位前辈:
现在我想实现的功能是,将控件名称保存在数据中,再通过遍历控件的方式来控制属性实现权限管理,下面这段代码在窗体模块中实现是可以的,但我想做成公共模块后就不行了,请教大家问题出在哪啊

问题点:
1.下面代码本来是想让控件的Enabled:=True,但这段代码在公共模块实现不了,不知道是什么原因
2.这种方式针对MainMenu菜单上的控件没有效果

procedure LevelLoad(MyForm:TForm;MyAdoQuery:TADOQuery);
var
MMItems:string;
cx:Integer;
Obj:TWinControl;
begin
MyAdoQuery.Close;
MyAdoQuery.SQL.Clear;
MyAdoQuery.SQL.Add('select * from 权限 where 群组名称= '''+ FrmMain.User_Group +'''');
MyAdoQuery.Open;

MyAdoQuery.First;
while not MyAdoQuery.Eof do
begin
MMItems:=MyAdoQuery.fieldbyname('菜单名称').AsString;
for cx:=0 to MyForm.ControlCount - 1 do
begin
Obj:=TWinControl(MyForm.Controls[cx]);

if Obj.Name=MMItems then
begin
Obj.Enabled:=True;
end;
end;
MyAdoQuery.Next;
end;

end;
...全文
146 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
changfenglee 2017-03-31
  • 打赏
  • 举报
回复
经过多方面测试,上面这我贴的代码是没有问题的,现在的问题变成了如果用打开方式一,那么代码能正常执行 用打开方式二动态创建标签与窗体,那么所调用的公共单元代码就会失效,还请各位帮忙看看,谢谢 打开方式一: Form2.Align:=alClient; Form2.BorderStyle:=bsNone; Form2.Parent:=RzPageControl1.ActivePage; Form2.Show; 打开方式二: procedure TForm1.OpenForm(FrmName, FrmCaption: string; MyFormCls: TFormClass); var MyForm:TForm; MyTabSheet:TRzTabSheet; MyTabSheetName:string; begin MyTabSheetName:=FrmName; MyTabSheet := TRzTabSheet(self.FindComponent(MyTabSheetName)); if MyTabSheet = nil then begin try //创建新标签页 MyTabSheet := TRzTabSheet.Create(self); MyTabSheet.Name := MyTabSheetName; MyTabSheet.PageControl := RzPageControl1; MyTabSheet.Caption := FrmCaption; MyTabSheet.Align := alClient; try MyForm:=MyFormCls.Create(Self); MyForm.Parent:=MyTabSheet; MyForm.BorderStyle:=bsNone; MyForm.Align:=alClient; MyForm.Show; except FreeAndNil(MyForm); Abort; end; except FreeAndNil(MyTabSheet); Exit; end; end; RzPageControl1.ActivePage:=MyTabSheet; end;
lyhoo163 2017-03-31
  • 打赏
  • 举报
回复
是否Obj.Name与MMItems字符类型不匹配?
santiaodahan 2017-03-31
  • 打赏
  • 举报
回复
引用 5 楼 changfenglee 的回复:
经过多方面测试,上面这我贴的代码是没有问题的,现在的问题变成了如果用打开方式一,那么代码能正常执行 用打开方式二动态创建标签与窗体,那么所调用的公共单元代码就会失效,还请各位帮忙看看,谢谢 打开方式一: Form2.Align:=alClient; Form2.BorderStyle:=bsNone; Form2.Parent:=RzPageControl1.ActivePage; Form2.Show; 打开方式二: procedure TForm1.OpenForm(FrmName, FrmCaption: string; MyFormCls: TFormClass); var MyForm:TForm; MyTabSheet:TRzTabSheet; MyTabSheetName:string; begin MyTabSheetName:=FrmName; MyTabSheet := TRzTabSheet(self.FindComponent(MyTabSheetName)); if MyTabSheet = nil then begin try //创建新标签页 MyTabSheet := TRzTabSheet.Create(self); MyTabSheet.Name := MyTabSheetName; MyTabSheet.PageControl := RzPageControl1; MyTabSheet.Caption := FrmCaption; MyTabSheet.Align := alClient; try MyForm:=MyFormCls.Create(Self); MyForm.Parent:=MyTabSheet; MyForm.BorderStyle:=bsNone; MyForm.Align:=alClient; MyForm.Show; except FreeAndNil(MyForm); Abort; end; except FreeAndNil(MyTabSheet); Exit; end; end; RzPageControl1.ActivePage:=MyTabSheet; end;
结贴真快,你的窗体用局部变量引用,再调用LevelLoadItems时没法传入新建窗体的引用参数了,也就没法更新属性了。
changfenglee 2017-03-30
  • 打赏
  • 举报
回复
代码编译没有问题,只是没有达到想要的效果 procedure LevelLoadItems(MyForm:TWinControl;MyAdoQuery:TADOQuery); 这个过程是个公共单元,所以定义时加了个MyForm:TWinControl就是为了传递窗体名称进去,我估计问题可能出在这里,但是不知道怎么改 这段代码如果稍改一下放到窗体的单元里面是可以达到效果的,但中公共单元中就不行
看那山瞧那水 2017-03-30
  • 打赏
  • 举报
回复
代码没问题, 不行是编译不了还是运行没效果? 编译不了,是你没有USES FORM和ADO单元吧。 菜单项,不包含在FORM.CONTROLS中,另外遍历菜单项。 “ShowMessage(BoolToStr(Obj.Enabled));得到的值为-1,显然是错误的” 这个是对的,TRUE 显示数值就是 -1, 用BoolToStr(Obj.Enabled, True)看下 if Obj.Name=MMItems then begin Obj.Enabled:=True; end else Obj.Enabled:=False; //一般加这个
changfenglee 2017-03-30
  • 打赏
  • 举报
回复
补充说明: 我修改了一下代码如下: 当前问题为通过 ShowMessage(Obj.Name); 可以得到正确的控件名称 ShowMessage(BoolToStr(Obj.Enabled));得到的值为-1,显然是错误的 还是不知道问题出在哪里,求高手指点啊 procedure LevelLoadItems(MyForm:TWinControl;MyAdoQuery:TADOQuery); var MMItems:string; cx:Integer; Obj:TWinControl; begin MyAdoQuery.Close; MyAdoQuery.SQL.Clear; MyAdoQuery.SQL.Add('select * from 权限 where 群组名称= '''+ FrmMain.User_Group +''''); MyAdoQuery.Open; MyAdoQuery.First; while not MyAdoQuery.Eof do begin MMItems:=MyAdoQuery.fieldbyname('菜单名称').AsString; for cx:=0 to MyForm.ComponentCount - 1 do begin Obj:=TWinControl(MyForm.Components[cx]); if Obj.Name=MMItems then begin Obj.Enabled:=True; ShowMessage(Obj.Name); ShowMessage(BoolToStr(Obj.Enabled)); end; end; MyAdoQuery.Next; end; end;

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧