自定义组件和选项卡顺序

2024-04-22

我有一个自定义组件(继承自TCustomPanel)由另外两个组件组成(假设有两个编辑)。使用组件时如何获得正确的 Tab 键顺序?

在选项卡顺序设计器中,我只能访问组件本身,该组件本身无法获得焦点,因为它是一个面板。在运行时发生的情况是,我可以使用 Tab 键访问编辑,但前提是组件下方的两个按钮获得焦点。

在这种情况下如何更改 Tab 键顺序?


组件中这些嵌套控件的 Tab 键顺序与组件所在窗体的 Tab 键顺序不同。当您按 Tab 键切换到嵌套控件时,窗体的 Tab 键顺序列表中组件的 Tab 键顺序将由您决定。一旦所有选项卡顺序列表组合起来,就会产生最终循环:

  • 表单上的控件 (TabOrder=0)
  • 表单上的另一个控件(TabOrder=1)
  • Your panel component (TabOrder=2)
    • Edit 1 (TabOrder=0)
    • Edit 2 (TabOrder=1)
  • 表单上的另一个控件(TabOrder=3)

为了能够设置面板组件设计时的选项卡顺序:

  • 使用设计器中的 Tab 键顺序编辑器(右键单击组件的父级)并使用编辑器中的箭头更改 Tab 键顺序,或者
  • 发布TabOrder组件的属性并在对象检查器中设置它:

    type 
      TMyPanel = class(TCustomPanel) 
      published 
        property TabOrder; 
      end; 
    

在运行时,始终可以设置组件的 Tab 键顺序,因为TabOrder财产被宣布为公开TWinControl.

...它无法获得焦点,因为它是一个面板。

不,面板可以很好地获得焦点,但默认情况下不会。这是用TabStop属性,即False默认情况下。你不想要TabStop to set True对于您的组件,因为(1)面板没有指示器,它具有焦点,(2)它是不需要的(我想)。


更改嵌套控件的 Tab 键顺序最好在组件的构造函数中或在运行时完成。

为了能够在设计时设置组件内嵌套控件的 Tab 键顺序,需要做更多的工作。我不认为你想要那样,但由于我之前的答案(已删除)是垃圾(并且奇怪地投票),我已经制定了一个例子作为补偿。

首先,请注意,使用设计器中的 Tab 键顺序编辑器(右键单击面板组件)设置这些编辑的 Tab 键顺序将更改 Tab 键顺序,但不会持续。这是因为这些更改不会传输到 DFM。

为了能够流式传输/保存控件的设计时更改,您需要发布它们:

type
  TMyPanel = class(TCustomPanel)
  private
    FEdit1: TEdit;
    FEdit2: TEdit;
  public
    constructor Create(AOwner: TComponent); override;
  published 
    property Edit1: TEdit read FEdit1;
    property Edit2: TEdit read FEdit2;
  end;

constructor TMyPanel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FEdit1 := TEdit.Create(Self);
  FEdit1.SetBounds(10, 10, 100, 21);
  FEdit1.Name := 'Edit1';
  FEdit1.Parent := Self;
  FEdit1.SetSubComponent(True);
  FEdit2 := TEdit.Create(Self);
  FEdit2.SetBounds(10, 41, 100, 21);
  FEdit2.Name := 'Edit2';
  FEdit2.Parent := Self;
  FEdit2.SetSubComponent(True);
end;

当然,这会发布这些控件的所有属性,现在用户可以更改他们想要的任何内容。为了防止这种情况,请考虑限制已发布的属性TEdit控制:

unit MyPanelEdit;

interface

uses
  DesignEditors, Unit2, DesignIntf, SysUtils, Classes, TypInfo, StdCtrls;

type
  TEditProperty = class(TComponentProperty)
  private
    function FilterFunc(const ATestEditor: IProperty): Boolean;
  public
    function GetAttributes: TPropertyAttributes; override;
    procedure GetProperties(Proc: TGetPropProc); override;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterPropertyEditor(TypeInfo(TEdit), TMyPanel, '', TEditProperty);
end;

{ TEditProperty }

function TEditProperty.FilterFunc(const ATestEditor: IProperty): Boolean;
begin
  Result := ATestEditor.GetName = 'TabOrder';
end;

function TEditProperty.GetAttributes: TPropertyAttributes;
begin
  Result := [paSubProperties];
end;

procedure TEditProperty.GetProperties(Proc: TGetPropProc);
var
  LComponents: IDesignerSelections;
  LDesigner: IDesigner;
begin
  LComponents := GetSelections;
  if LComponents <> nil then
  begin
    if not Supports(
        FindRootDesigner(LComponents[0]), IDesigner, LDesigner) then
      LDesigner := Designer;
    GetComponentProperties(LComponents, [tkInteger], LDesigner, Proc,
      FilterFunc);
  end;
end;

end.

这限制了已发布的属性TEdit仅显示属性TabOrder.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义组件和选项卡顺序 的相关文章

随机推荐

  • 如何在 matplotlib 上以对数刻度可视化值?

    我的值差异非常小 例如 0 000001 我想以对数尺度可视化它们 我想知道如何在 matplotlib 中做到这一点 多谢 http matplotlib sourceforge net api pyplot api html matpl
  • “parse”在交互和非交互模式下的行为不同

    我认为这可能是一个错误parse 但想检查一下是否还有其他人有更好的主意 在交互模式 RStudio 下 以下代码可以正常工作 txt lt c c integer 3L 1 3 c integer 1 3 1L TRUE c intege
  • 用颤动绘制虚线弧

    Flutter 有没有办法画虚线弧 目前我正在使用 canvas drawArc 但我不知道如何获得正确的结果 canvas drawArc rectangle startAngle fullArcRadius false Paint co
  • 带有 pfx 文件的 Azure https

    我正在尝试创建一个https我的天蓝色服务的端点 我被给予了p7b我转换成的文件cer文件 来自cer我能够用几行 c 转换为pfx var cert new X509Certificate2 certpath var bytes cert
  • 返回 clickhouse 数组作为列

    Clickhouse 是否可以将包含一对数组的结果转换为列 形成这个结果 f1 f2 f3 a 1 2 3 x y z b 4 5 6 x y z to f1 x y z a 1 2 3 b 4 5 6 这个想法是不必为每行重复标题值 就我
  • Webpack - 如何捆绑/需要文件夹(子文件夹)的所有文件

    我想看看是否有更短的方式来运行 webpack 包 以及为什么我的加载器不起作用 这是我的代码 module exports context path join dirname dist entry ES6bundle js jQuery
  • JS 库来模拟 Internet Explorer?

    Webkit中有一些JS库可以模拟IE吗 例如 IE8不支持border radius目前 可能在 IE10 上 所以我运行一个 JS 库来检查我是否正在使用border radius然后将其删除以制作类似于IE的视觉 我知道这是一个疯狂的
  • Android Accessibility 服务实时音频处理

    有人可以为我提供 Android 辅助功能服务实时音频处理的示例代码吗 我需要处理通话音频 但不知道如何实现这一点 请分享您对此的想法 请找到下面的清单
  • 我如何在create js中更改图形的填充颜色

    我用它来改变创建js中的填充颜色 这不起作用 var shape rect new createjs Shape shape rect graphics beginFill FFD64B drawRect 61 253 398 25 sha
  • 检查混音器线路中的音频播放电平?

    我试图弄清楚 Windows 中是否正在播放任何类型的声音 通过任何应用程序 如果某处有什么东西发出噪音 我想知道 在遵循文档之后 我找到了如何获取机器上的混音器列表以及这些混音器的线路 如果我理解正确的话 这些线路是用于混音器的输入 输出
  • 如何设置选择器的边框

    我有来自 反应本机 Picker Item有 周一 周二 周三等 我想设置选择器的属性 例如borderRadius 10 even style borderRadius 30 没有帮助
  • CSS3 使文本在三角形内居中

    我在页面的左上角有一个三角形图像 以及一些需要在底部居中的文本 使用 CSS3transform rotate 我可以通过一些定位 边距来做到这一点 但它在浏览器中看起来并不相同 它看起来有点向左或向右 有没有办法将其居中 以便它在所有浏览
  • FindFirstFile 和 FindNextFile 问题

    输出 The first file found is LOG 09 TXT Next file name is LOG 10 TXT Next file name is LOG 11 TXT Next fi cut off word fil
  • 当文件名有重音符号时使用 pandas.read_csv 进行编码

    我正在尝试使用 pandas 加载 CSV 但如果文件名有重音符号 则会遇到问题 这显然是一个编码问题 但尽管如此read csv允许您设置文件内文本的编码 我不知道如何正确编码文件名 input file r C Datasets s P
  • 我应该用 C++ 封装 Lua 代码的哪些代码?

    我终于将 LuaBind 配置为与我的 C 项目一起使用 我最近发现 Tiled 地图编辑器可以选择将文件导出为 lua 所以我想尝试一下 我将使用什么代码来封装下面粘贴的代码以使其与我的 C RPG 项目一起使用 return versi
  • 空 Repeater 控件的默认文本

    使用 VS 2008 我有一个 Repeater 控件
  • GPUImage 的 GPUImageOpacityFilter 行为不符合预期,不会更改 Alpha 通道

    我正在尝试做一个Overlay Blend具有相机源输出的库存图像 其中库存图像的不透明度小于 100 我想我可以放一个GPUImageOpacityFilter在过滤器堆栈中 一切都会好起来的 GPUImageVideoCamera gt
  • DOM 元素的样式对象更改后可以触发 JavaScript 钩子吗?

    一个元素有一个 JavaScriptstyle包含 CSS 样式的不同名称和值的对象 我想在每次该对象发生变化时触发一个函数不使用轮询 有没有什么方法可以跨浏览器兼容并且可以与第三方代码可靠地工作 因为假设您提供了一个嵌入式脚本 绑定 Ja
  • 从 WebBrowser 控件以横向模式打印?

    System Windows Forms WebBrowser wb new System Windows Forms WebBrowser wb DocumentStream new FileStream C a html FileMod
  • 自定义组件和选项卡顺序

    我有一个自定义组件 继承自TCustomPanel 由另外两个组件组成 假设有两个编辑 使用组件时如何获得正确的 Tab 键顺序 在选项卡顺序设计器中 我只能访问组件本身 该组件本身无法获得焦点 因为它是一个面板 在运行时发生的情况是 我可