自定义组件和选项卡顺序

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(使用前将#替换为@)

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

  • Delphi 中表单分发与其生命周期相关的接口对象的安全方法?

    我有一个 Delphi 表单 它提供接口对象背后的功能 代码的其他部分也通过属于该表单的属性获取引用 我无法将接口功能委托给子对象 因为太多的功能是由表单上的控件 组件提供的 我无法使用 TAggregateObject 或 TContai
  • Delphi 的内存分析工具?

    我建立了一个项目并运行它 然后在 Process Explorer 中查看它 结果发现它在启动时使用的 RAM 比我想象的要多 5 倍 现在 如果我的程序运行得太慢 我会将其连接到分析器并让它告诉我什么正在使用我的所有周期 有没有类似的工具
  • FireMonkey iOS RAD Studio XE2 - 在从 URL 加载的表单上显示图像

    是否可以将 TImage 放置在 iOS 的 FMX 表单上 并将图像 jpg 从 URL 加载到此 TImage 中以在 iOS 应用程序中显示 我尝试过但没有成功 任何正确方向的提示或指出都会受到赞赏 将 TButton TImageC
  • 如何在按键时识别 unicode 键?

    我的应用程序使用 unicode 字符 并且我有几个文本字段 我想限制用户输入特殊字符 例如 begin if not Key in a z A Z 0 9 13 8 then Key 0 if Key 13 then bOk Click
  • TFrame继承重构

    我提出的另一个 TFrame IDE 注册组件问题 感谢各位程序员的帮助 尝试 Darrian 的 TFrame 继承建议here https stackoverflow com questions 382562 delphi visual
  • 为什么 TImage 旋转我的图像?

    编写一个移动应用程序 它从安全网站提取图像 如下所示 第一个图像 提取不正确 注意网络版本与移动版本 第二个图像在网站上正确显示 但 Delphi TImage 由于某种原因正在旋转它我不明白为什么 旋转设置为 0 并且在 TImage 组
  • 使用 Delphi 10.2.1 Tokyo 的模态 Android 对话框

    我有以下用于在 Android 上显示模式消息的 Delphi 代码 该代码在 10 1 Berlin 上运行良好 但在 Delphi 10 2 1 Tokyo 上停止运行 此过程现在会挂起 Android 应用程序 procedure c
  • 如何修复这个 delphi 7 编译错误 - “重复资源”

    我正在尝试编译我继承的 Delphi 7 项目 但收到此错误 错误 警告 重复资源 错误 类型 2 位图 ID 编辑 错误 文件 C 路径缩短 common CRGrid res 资源已保留 文件 c common raptree RES
  • 将字符串作为 PChar 从 CSharp 传递到 Delphi DLL

    我正在尝试将字符串从 C 传递到 Delphi 构建的 DLL Delphi DLL 需要 PChar 这是Delphi导出 procedure DLL Message Location PChar AIntValue integer st
  • 使用远程数据编写 Android、iPad、iPhone 客户端的技术

    我需要探索世界 你写了一个杀手级应用程序 但你有 Android iPhone iPad 客户端吗 我的问题是 1 向这些设备发送数据的最佳方式是什么 按照建议进行肥皂和休息here https stackoverflow com ques
  • Delphi 应用程序被 Google Chrome 视为“危险”

    我经常用Delphi 2009制作数学软件 并将其发布在我的网站上 然而 去年左右 Google Chrome 开始认为我的一小部分 但数量不断增加 EXE 是 有害的 并且 Google Chrome 拒绝下载它们 例如 今天我编写了一个
  • 如何将IDL导入到Delphi中?

    我如何导入接口定义语言 idl 文件存入Delphi 将类型和接口转换为 pascal 文件 我试过了 File Open 它只显示 idl 文本文件的文本 Project 添加到项目 它只是 就像 添加了一个 idl文本文件到项目 成分
  • 我有进程 ID,需要使用 Delphi 5 以编程方式关闭关联进程

    任何人都可以帮我提供一个编码示例 以便在我拥有进程 ID 时关闭关联的进程 我将使用 Delphi 5 在 Windows 2003 服务器上以编程方式执行此操作 如果您有进程 ID 并希望强制终止该进程 可以使用以下代码 function
  • 如何使用 IdTCPClient 等待来自服务器的字符串?

    我的 IdTelnet indy 10 1 有问题 我无法以 Unicode 模式从服务器读取数据 现在我想用 IdTCPClient 编写 telnet 终端 服务器有时发送一行 有时发送越来越多的行 但发送之间没有固定的时间 现在我的问
  • 让线程在窗体关闭时保持运行

    我在我的应用程序上创建了一个同步线程 我想知道如果我关闭申请表 是否有办法让该线程保持打开状态 直到完成同步过程 调用线程的WaitFor方法在您的 DPR 文件中 之后Application Run线 如果线程已经运行完毕 那么WaitF
  • 指针^ 与 s[1]

    在读取数据的函数中 数据含义只字符串 从磁盘 我应该更喜欢哪个 哪个更好 A DiskStream Read Pointer s Count or B DiskStream Read s 1 Count Note 我知道两者都有相同的结果
  • 如何在Delphi中实现人工神经网络? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想要一个人工神经网络 42 个输入神经元 168 个隐藏神经元 7个输出神经元 这个网络就是玩 连四子 的游戏 每场比赛结束时 网络
  • 如何获取属于某个进程的打开句柄的计数?

    您可以使用该程序流程浏览器 http technet microsoft com en us sysinternals bb896653查看正在运行的应用程序有多少个句柄 有没有办法用Delphi代码来获取这个数字 我有兴趣跟踪应用程序本身
  • Delphi:如何检查是否按下了任何鼠标按钮 - 在鼠标事件之外?

    我有一个 TDrawGrid 想要处理单击单元格并使用鼠标滚轮滚动单元格的方式略有不同 使用鼠标滚轮滚动时 视图应以选定的单元格为中心 而仅单击单元格时 视图不应居中移动 因为这会令人困惑 用鼠标滚轮滚动会触发OnSelectCell事件
  • 如何等到我启动的程序使用完该文件后才删除该文件?

    我一直在寻找一种方法来打开通过 Delphi 应用程序及其适当的应用程序保存到我的计算机上的文件 该文件存储在 SQL 数据库中的 Varbinary 字段中 加载到内存流中 然后通过 TMemoryStream 的 SavetoFile

随机推荐

  • 如何在 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 键顺序 在选项卡顺序设计器中 我只能访问组件本身 该组件本身无法获得焦点 因为它是一个面板 在运行时发生的情况是 我可