Delphi中如何识别发送者的Tobject类型?

2024-01-30

我正在为带有无线电组的对话框创建代码,作为首选项表单的一部分。我们代码的一部分是,当打开首选项表单时,单击单选按钮组,这会配置一堆内容(即,如果单选按钮处于“关闭”状态,则隐藏一堆配置内容)。

我想要知道用户何时实际单击单选按钮组,而不是在首选项对话框打开时触发单选按钮组。

所以代码看起来像这样:

(open preferences)...
rgMyGroupClick(nil)

procedure  TdlgPreferences.rgMyGroupClick(Sender:TObject)

if sender <> nil then
begin
 //do something useful
end;

但是当打开首选项对话框时也会执行此代码。我应该在那里放置什么,以便仅在用户实际单击按钮上的鼠标时执行?

Thanks


测试您的发件人

您可以通过两种方式测试发件人:

procedure TdlgPreferences.rgMyGroupClick(Sender:TObject)
begin
  if sender = RadioButton1 then //do action
  else if sender = RadioButton2 then ....

或者您可以测试发件人的类型。

procedure TdlgPreferences.rgMyGroupClick(Sender:TObject)
begin
  if sender is TRadioButton then //do action
  else if sender is TForm then ....

The is关键字测试以查看对象是否属于某种类型。
请注意,测试if AObject is TObject始终为真,因为每个对象都是从 TObject 派生的。

打字更有趣

事实是is对对象类型和所有祖先的测试也可用于其他目的:

procedure TdlgPreferences.rgMyGroupClick(Sender:TObject)
begin
  //TObject does not have a 'tag' property, but all TControls do...
  if (sender is TControl) and (TControl(Sender).Tag = 10) then ....

因为短路布尔求值 http://en.wikipedia.org/wiki/Short-circuit_evaluationDelphi首先会检查(sender is TControl) and only如果这是真的,请继续。进行后续测试(TControl(Sender).Tag = 10)使用安全。

如果你不明白其构造TControl(Sender)你可以阅读有关类型转换的内容。
here: http://delphi.about.com/od/delphitips2007/qt/is_as_cast.htm http://delphi.about.com/od/delphitips2007/qt/is_as_cast.htm
和这里:http://delphi.about.com/od/oopindelphi/a/delphi_oop11.htm http://delphi.about.com/od/oopindelphi/a/delphi_oop11.htm

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

Delphi中如何识别发送者的Tobject类型? 的相关文章

  • 处理 TShellListView 后代中的文件放置

    我正在尝试创建 TShellListView 的后代 它接受从 Windows 资源管理器中删除的文件 我想在组件定义中处理拖 放操作 而不必在任何使用该组件的应用程序中实现它 我找到了接受从 Windows 资源管理器中拖放的文件的示例
  • 如何在 Delphi DBLookupComboBox 中选择正确的项目

    我有一个数据库查找组合框连接到数据库查询 那部分工作正常 当我运行程序时数据库查找组合框填充有查询的结果 我想看看数据库查找组合框填充第一项 请选择 当 的时候程序第一次运行或者当一个新项目行动已启动 见下图 另外 如果我正在加载以前保存的
  • Delphi 2009 IDE结构视图折叠功能

    现在有谁知道折叠 Delphi 2009 IDE 结构视图中的所有项目吗 我不知道折叠所有项目 这使我很难从视图中找到我的课程 Thanks 选择根节点 类 并按数字键盘上的 除号 那会让一切崩溃 然后按数字键盘上的 加号 键 第一级将展开
  • 如何在运行时(Delphi/Windows)程序中添加代码?

    我正在Windows XP Delphi 7上工作 我需要在正在运行的程序中添加一些过程 或函数 并且我不想在完成后再次重新编译它 我只有一个具有 5 个功能的主机应用程序来发送不同类型的警报 但是还有其他新的警报类型 所以我必须执行新的功
  • 如何将纹理传递给 DirectX 9 像素着色器?

    我有像素着色器 fxc exe tiles fs T ps 3 0 Fotiles fsc Fctiles fsl struct PSInput float4 Pos TEXCOORD0 float3 Normal TEXCOORD1 fl
  • TListView 中的中心子项目图像

    Is it possible to fix the drawing of subitem images in a TListView so that they are not cut off on the left hand side as
  • 查找字符串是否在列表中的最佳方法(没有泛型)

    我想做这样的事情 Result MyString in string1 string2 string3 string4 这不能与字符串一起使用 我不想做这样的事情 Result MyString string1 or MyString st
  • 任意通用列表的通配符

    我有一个类 MyClass 它不是通用的 包含任意 TList 并对其执行某些操作 我希望用通用 TList 替换 TList 但 MyClass 必须保持非通用 由于 Delphi 是不变的 这样的事情是行不通的 list1 TList
  • 可以在滚动条上绘画吗?

    是否可以在 TMemo TListbox 等标准控件的滚动条上进行绘制 我所需要的只是在滚动条上绘制一些基本形状 并且我试图避免从 stratch 实现整个滚动内容 有什么指点吗 蒂亚 确实有可能 你可能想看一下WM NCPAINT消息 这
  • delphi THashSHA2 在大文件上返回错误的 SHA256

    Data Cloud CloudAPI pas has class function TCloudSHA256Authentication GetStreamToHashSHA256Hex const Content TStream str
  • 创建无边框表单而不丢失 Windows 命令

    我已将表单更改为无边框表单 我只是更改了BorderStyle财产给bsNone 但现在我的应用程序失去了 Windows 锚点和一些命令 例如 WIN 对齐表单客户端 WIN 最小化表格 WIN 表格右对齐 WIN 表格左对齐 我尝试过设
  • 当系统文件实际存在时找不到它

    系统找不到alg exe但它确实存在 c windows system32 alg exe 我最近从 Win 7 x86 迁移到 x64 当我使用 x86 时 我对此没有任何问题 尝试了 Delphi 7 和 XE2 我正在使用的代码 if
  • 如何改变TDateTimePicker的颜色?

    如何更改 a 的颜色TDateTimePicker A 日期和时间选择器可以有一种颜色 通常这是通过设置来完成的Color procedure TForm1 FormCreate Sender TObject begin DateTimeP
  • 将数据从 DLL 传递到应用程序时出现问题

    我对如何在我的场景中正确使用指针感到有点困惑 我有一个 DLL 其中包含一些嵌入式资源 我在此 DLL 中公开了一个函数 该函数将这些资源之一的二进制数据传递回其调用应用程序 在本例中 我嵌入了 JPG 图像文件 我的 DLL 确实将文件正
  • 如何取消注册我的应用程序的文件格式?

    在 Windows 10 中的 Delphi 10 4 2 win 32 VCL 应用程序中 我注册了 ICO我的图形应用程序的文件格式使用DSiWin32 DSiRegisterUserFileAssoc https github com
  • 如何在 iOS 和 Android 上获取应用程序恢复状态?

    当应用程序恢复时 是否可以从代码角度检查某些内容iOS and Android 例如当应用程序最小化并恢复时 应用程序仍在设备后台运行 你需要使用IFMX应用程序事件服务 http docwiki embarcadero com Libra
  • 挂钩到文件,实时读取新内容

    我如何连接到另一个程序当前正在使用的文件 该程序不断向该文件写入内容 假设有一个 10 行的文本文件 当我启动我的应用程序时 每次写入程序保存其内容时 它都必须检测并读取其中的任何内容 可以在不不断检查文件大小 日期的情况下完成此操作吗 您
  • Delphi 生成的 Dylib 在 OSX 上的可靠部署

    我想在 OSX 上部署一个 dylib 它是用 Delphi 创建的 这个 dylib 应该是可由第三方应用程序加载 这看起来像是一个重复的问题 但经过大量搜索后 我找不到答案 这和这个是同一个问题 https forums embarca
  • 应用程序需要很长时间才能同步线程(或根本不同步)

    我在 Delphi XE5 iOS 和 Android 中使用 REST 组件 我目前正在通过 iOS 模拟器进行测试 我的应用程序often挂在我的代码中的以下行 R Request Execute 经过一些调试后 我发现它特别挂在 RE
  • 如何使用 LiveBindings 在 TStringGrid 中显示超过 200 行?

    我有一个TDataSource这是由一个支持TClientDataset绑定到一个TStringGrid 我通过右键单击网格并选择 Link to DB Datasource 然后选择数据源 这为我设置了 LiveBindings 当我运行

随机推荐