【问题标题】:Dynamically set visible property for a page in delphi在delphi中动态设置页面的可见属性
【发布时间】:2017-05-03 05:50:54
【问题描述】:

我正在使用带有许多页面(AdvPage1、AdvPage2、AdvPage3...)的 TAdvToolBarPager。每个页面都包含许多编辑、导航器等。基于用户权限,我想约束属性,即我想为 ADMIN显示所有页面 (1,2,3),但对于用户,我只想显示页面 (1,2) 或 (1)。

我可以使用下面给出的代码禁用所有编辑、导航器。有人可以帮助我如何根据约束/任何其他替代方法在 TAdvToolBarPager 中设置页面。提前致谢!

Procedure SetForm(Form: TForm; enabled: Boolean);
var   PropInfo :  PPropInfo;
 i       :  Integer;
begin
  for i := 0 to Pred(Form.ComponentCount) do
  begin
   if (Form.Components[i] is TDBEdit) or (Form.Components[i] is DBNavigator) then
  begin
    PropInfo := GetPropInfo(Form.Components[i].ClassInfo, 'Enabled');
    if PropInfo <> nil then
        SetOrdProp(Form.Components[i], PropInfo, Ord(enabled));
    end;
  end;
end;   

【问题讨论】:

  • 你不能把第 3 页的 TabVisible 属性设置为 False 吗?如果您希望页面可见但不可选,则可以将 TabEnabled 设置为 False。
  • 是的,我可以使用提到的来做到这一点。我如何迭代并将 TabVisible / TabEnabled 设置为 TAdvToolBarPager 中的 AdvPage? Form.AdvToolBarPager1.AdvPages[1].TabVisible := False; Form.AdvToolBarPager1.AdvPages[2].TabVisible := False; Form.AdvToolBarPager1.AdvPages[1].TabVisible := False;但我想动态设置。
  • 您能解释一下“动态设置”是什么意思吗?你会如何调用上面的 SetForm 过程?
  • 我在我的应用程序中使用了许多表单。每个表单都有一个 TAdvToolBarPager。每个 TAdvToolBarPager 里面都有很多页面。基于管理员/用户我想显示页面。所以我想从我的主表单中传递表单名称和可见属性(true/false)并动态控制应用程序中的所有其他表单。我通过传递表单名称来调用上面提到的 SetForm,如果用户是管理员,那么我将布尔值传递为 true,如果用户是普通用户,那么我将布尔值传递为 false
  • 创建一个(虚拟?)过程以在每个表单中执行此操作,使用用户类型作为参数?

标签: delphi delphi-xe8 tms


【解决方案1】:

根据您对问题的 cmets 并假设管理页面始终是第三个,这个简化的过程应该可以满足您的需求:

Procedure SetForm(Form: TForm; enabled: Boolean);
var
  i: Integer;
begin
  for i := 0 to Form.ComponentCount - 1 do begin
    if (Form.Components[i] is TAdvToolBarPager) then begin
      TAdvToolBarPager(Form.Components[i]).AdvPages[2].TabVisible := enabled;
      Exit; //  probably only one AdvToolBarPager available
    end;
  end;
end;

【讨论】:

  • 谢谢,工作差不多。但如果我想为用户显示第 2、3 页和为管理员显示第 1、2、3 页,则会失败。
  • 调整代码相当容易。当每个表单上的管理页面不同时,它可能会变得很棘手。因此,我最初的问题。您需要一个通用条件来决定哪个页面必须可见。只要您不完全清楚地表达这种情况,我们就只能猜测。
  • 我在过程中传递了另一个参数来决定应该显示哪个页面。使用此代码我面临另一个问题。当我制作 TAdvToolBarPager(Form.Components[i]).AdvPages[0].TabVisible := false 时。页面未显示,但显示页面内的内容
  • 您应该确保该页面当前不是活动页面。在使其不可见之前切换到另一个页面。
  • 是的,它适用于您提到的解决方法。但是有没有其他方法,因为我们实际上不确定我不会显示哪个页面
猜你喜欢
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 2011-07-28
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
相关资源
最近更新 更多