如何(正确)使用带有实时绑定的枚举类型(TObjectBindSourceAdapter)

2023-12-24

我在用着TObjectBindSourceAdapter对对象使用实时绑定。 我正在使用的对象的属性之一TObjectBindSourceAdapter具有枚举类型,但是当我在对象中使用枚举类型时,适配器中的字段永远不会生成

我目前找到的唯一解决方案是将枚举类型定义为对象中的整数并对其进行类型转换。这似乎工作正常,但您必须保持枚举类型和整数的类型转换和返回。

这是一些示例代码来解释我的意思。

第一个示例使用我最初尝试的枚举类型,但似乎不起作用:

 uses Data.Bind.ObjectScope;

 Type
   TMyEnumtype = (meOne, meTwo, meThree);

   TMyObject = class
     public
       MyEnumType: TMyEnumtype;
  end;

procedure TForm9.But1Click(Sender: TObject);
var
  MyObject: TMyObject;
  aBindSourceAdapter: TBindSourceAdapter;
begin
  MyObject := TMyObject.Create;
  MyObject.MyEnumType := meTwo;
  aBindSourceAdapter := TObjectBindSourceAdapter<TMyObject>.Create(nil, MyObject, False);
  if aBindSourceAdapter.FindField('MyEnumType') <> nil then
    ShowMessage('MyEnumType found')
  else
    showmessage('MyEnumType not found');
  FreeAndNil(MyObject);
  FreeAndNil(aBindSourceAdapter);
end;

第二个例子似乎通过类型转换为整数来工作

uses Data.Bind.ObjectScope;

Type
  TMyEnumtype = (meOne, meTwo, meThree);

  TMyObject = class
    public
      MyEnumType: integer;
  end;

procedure TForm9.But1Click(Sender: TObject);
var
  MyObject: TMyObject;
  aBindSourceAdapter: TBindSourceAdapter;
  aEnumType : TMyEnumtype;
begin
  MyObject := TMyObject.Create;
  MyObject.MyEnumType := Integer(meTwo);
  aBindSourceAdapter := TObjectBindSourceAdapter<TMyObject>.Create(nil, MyObject, False);
  if aBindSourceAdapter.FindField('MyEnumType') <> nil then
    ShowMessage('MyEnumType found')
  else
    showmessage('MyEnumType not found');

  aEnumType := TMyEnumtype(aBindSourceAdapter.FindField('MyEnumType').GetTValue.AsInteger);

  if aEnumType =  meTwo then
    showmessage('meTwo');

  FreeAndNil(MyObject);
  FreeAndNil(aBindSourceAdapter);
end;

我想知道其他人是否遇到过这个问题,以及是否有其他解决方案可以解决这个问题,而无需恢复为整数并继续使用枚举类型。我也不确定我的解决方法是否是执行此操作的常用方法。


我认为最好的方法是注册转换器。事实证明这非常简单,但前提是要深入研究 VCL 源代码。我没有找到任何有用的文档。但它就在这里。

unit MyConverters;

interface

uses System.Rtti, System.Bindings.Outputs;

type
  TMyEnum = (Value1, Value2, Value3);

implementation

procedure RegisterConverters;
begin
  TValueRefConverterFactory.RegisterConversion(TypeInfo(TMyEnum), TypeInfo(string),
    TConverterDescription.Create(
      procedure(const InValue: TValue; var OutValue: TValue)
      var
        MyEnum: TMyEnum;
        S: string;
      begin
        MyEnum := InValue.AsType<TMyEnum>;
        case MyEnum of
          Value1:  S := 'First Value';
          Value2:  S := 'Second Value';
          Value3:  S := 'Third Value';
          else     S := 'Other';
        end;
        OutValue := TValue.From<string>(S);
      end,
      'TMyEnumToString',
      'TMyEnumToString',
      '', // TODO what is the AUnitName param used for?
      True, // TODO what is ADefaultEnabled used for?  What does it mean?
      'Converts a TMyEnum value to a string',
      nil)
  );
end;

initialization
  RegisterConverters;
end.

简而言之,你打电话TValueRefConverterFactor.RegisterConversion()并传入:

  • 该转换器转换的类型FROM
  • 该转换器转换的类型TO
  • TConverterDescription 包含实际执行转换的匿名过程以及一些其他元数据。

在上面的代码中,initialization部门电话RegisterConverters,因此所需要做的就是将该单元包含在您的项目中,并且实时绑定框架将在需要转换时使用转换器TMyEnum值对一个string.

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

如何(正确)使用带有实时绑定的枚举类型(TObjectBindSourceAdapter) 的相关文章

  • 在运行时创建 TQReport 元素

    在运行时创建 TQReport 元素 嗯 至少尝试一下 我不知道这份报告中应出现哪些标题或数据 我得到一个代表数据行和列的 TString 的 TList 我在组的带打印事件中植入 创建 指令 并在主数据行带的 OnNeedData 事件中
  • 如何以编程方式安排任务

    如何使用 delphi 7 像 Google updater 一样安排任务 我没有使用注册表 因为它被卡巴斯基防病毒软件检测为误报 我在注册表中作为启动项添加的任何内容都会被检测为特洛伊木马 因此我决定使用任务计划 下面的代码展示了如何删除
  • 获取 TransactSql 批处理中的语句数计数

    对于不使用 Delphi 的读者 虽然以下内容是根据 Delphi 编码来表达的 但我的实际技术问题不是特定于 Delphi 的 而是关于如何找出 Sql Server 如何 理解 TransactSql 批处理提交给它 TAdoQuery
  • 加载 Jpg/Gif/Bitmap 并转换为 Bitmap

    我必须从 XML 文件加载图像 XML 文件中没有关于图像是否为 JPG GIF BMP 的信息 加载图像后 我需要将其转换为位图 有谁知道如何在不知道实际文件格式的情况下将图像转换为位图 我正在使用 Delphi 2007 2009 谢谢
  • 如何避免使用 WinApi.Windows 的 Delphi 应用程序中的 dll 劫持

    Delphi 最新版本使用各种系统 dll 的静态链接 例如 WinApi Windows 单元中的 version dll 这会导致在单元初始化之前加载 version dll 这会打开一个安全漏洞 可以通过将受感染的 version d
  • 实体框架按枚举值按字母顺序排序

    我有一个名为Comment 其中有一个enum类型的属性CommentType public class Comment public virtual Guid Id get private set public virtual Comme
  • 在运行时按需更改组件类

    我的问题与这里的想法类似 替换delphi中的组件类 https stackoverflow com q 4685863 937125 但我需要改变一个specific按需组件类 这是一些伪演示代码 unit Unit1 TForm1 cl
  • 使用Delphi检查HTML代码中是否有对象属性值

    如何使用Delphi检查HTML代码中是否有输入对象属性值 there isn t value attribute
  • 当显示对话框时淡出应用程序的所有其他窗口?

    如何在 Delphi 2009 中调暗 淡出应用程序的所有其他窗口 Form 有一个 AlphaBlend 属性 但它仅控制透明度级别 但如果我们能有这样的东西那就太好了 集中窗口 http www anappaday com downlo
  • 什么是 Swift 枚举字节表示?

    我有以下枚举 enum Enum UInt8 case A 0x00 case B 0x01 case C 0x10 我使用以下代码将其转换为NSData var value Enum C let data NSData bytes val
  • 映射枚举列表

    我有一个名为 UserPermissions 的表 其中通过 userId 与用户表进行 FK 然后是一个用于枚举字符串值的字符串列 我看到的错误是 NHibernate MappingException 表 UserPermissions
  • 德尔福数据结构

    我可能需要在 Delphi 中做一个项目 并且是该领域的初学者 目前 我正在网上搜索资源 但由于资源站点太少而感到困惑 首先 你能给我一些好的网站 其中包含我迄今为止错过的 Delphi 资源吗 我也在 Delphi 中搜索数据结构 想知道
  • 时间:2019-03-17 标签:c#AlphaTelephoneNumberTranslator

    我有一个家庭作业 该程序将接受格式类似于 555 GET FOOD 的任何电话号码 任务是将字母映射到数字 并将数字翻译成其对应的数字 例如 A B C 2 D E F 3 ETC 目前我们还没有讨论类或创建地图 因此这些不是可行的解决方案
  • 如何在调试器中显示 TStringList 的内容?

    我想在调试应用程序时显示 TStringList 的全部内容 相反 我只是得到指示 Flist 仅显示地址 如果您使用的是 Delphi 2010 或更高版本 调试器允许使用调试可视化工具 http docwiki embarcadero
  • Delphi 2009 IDE结构视图折叠功能

    现在有谁知道折叠 Delphi 2009 IDE 结构视图中的所有项目吗 我不知道折叠所有项目 这使我很难从视图中找到我的课程 Thanks 选择根节点 类 并按数字键盘上的 除号 那会让一切崩溃 然后按数字键盘上的 加号 键 第一级将展开
  • 石和磅的格式正确吗?

    我有一个图表 用于显示重量 以英石和磅 lbs 为单位 该图表由记录中的数据填充 对于权重 数据类型为 Double 记录数据是在运行时编辑的 我需要知道一种正确格式化输入数据的方法 为了更好地理解 首先看一下这些示例值 它们表示为石和磅
  • 使用 enum.values() 与字符串数组相比,性能是否会受到影响?

    我正在使用枚举来替换String我的 java 应用程序 JRE 1 5 中的常量 当我在不断调用的方法中将枚举视为名称的静态数组时 例如 在渲染 UI 时 是否会对性能造成影响 我的代码看起来有点像这样 public String get
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 在 Delphi 中编程延迟的最佳方法是什么?

    我正在开发的 Delphi 应用程序必须延迟一秒 有时甚至两秒 我想使用最佳实践来对此延迟进行编程 在阅读 stackoverflow 上有关 Delphi Sleep 方法的条目时 我发现了以下两条评论 我遵循这样的格言 如果你觉得需要使
  • 如何调试仅在应用程序关闭时发生的崩溃? (德尔福)

    因此 经过最近的一些更改 我们发现我们最古老的应用程序之一有时会在关闭时崩溃 这会以 运行时错误 216 消息的形式或来自 Windows 错误报告的消息的形式表明应用程序已停止工作 该应用程序已经发出OutputDebugString 每

随机推荐

  • Android Square Picasso 无法加载土耳其字符图像 url

    我尝试使用 square picasso 一个网络应用程序 但是如果我的图片网址包含土耳其字符 毕加索未加载 该网址正在运行 http www bulenttiras com wp content uploads 2014 02 kokhu
  • 虚拟类中的抽象方法

    我有一个 C 类 它有很多虚拟方法 其中一些方法本质上是抽象的 它们在子类中完全实现 基类是空的 为了让它编译 我在基类中抛出一个 InvalidOperationException 并注释应该做什么 这只是感觉很脏 有更好的方法来设计我的
  • Android,日文字符文件名比较问题

    我正在尝试将搜索字符串与文件名与 Android 上的递归目录搜索相匹配 问题是字符是日语 在某些情况下不匹配 例如 我尝试匹配文件名开头的搜索字符串是 呼 当我从 file getName 打印文件名时 这会准确反映 例如打印到控制台的文
  • Oracle中如何进行条件插入?

    我读了here http psoug org snippet INSERT WHEN 588 htm语法如下所示 INSERT WHEN Condition THEN INTO TableName ColumnName VALUES VAL
  • 使用 Polly 断路器处理多种服务的正确方法

    我有一个应用程序 我们可以在其中与数百个 HTTP 端点进行通信 该应用程序是某种代理 在使用 polly 进行测试时 我注意到如果一个端点 比如说api endpoint1 com失败 调用api endpoint2 com and ap
  • 如何使用SQL查询来定义dbtable中的表?

    In JDBC 到其他数据库 http spark apache org docs latest sql programming guide html jdbc to other databases我找到了以下解释dbtable范围 应读取
  • 当单元格内容被截断时,将 VB.Net DataGridView 中的三个点(省略号)(...) 更改为自定义字符

    我正在 VB Net 中开发一个项目 并且使用古吉拉特语字体 非 Unicode 我放置了一个 DaraGridView DGV 并在 DGV 中显示数据库中存储的数据 在 DGV 中 如果单元格的内容被截断 则 DGV 显示椭圆 三个点
  • iPhone 应用程序和 Web 应用程序之间的双向同步

    我有一个依赖于 MySQL 数据库的 Web 应用程序 我正在考虑为其构建一个 iPhone 应用程序 该应用程序将允许用户在网络应用程序上浏览 插入 更新 删除其帐户的数据 最简单的方法是将 iPhone 应用程序简单地构建为 Web 应
  • java.lang.IllegalStateException:凭证加密存储中的 SharedPreferences 在用户解锁之前不可用

    Google Pixel 设备 OS 9 0 pie 上的 cashlytics 中不会记录崩溃 Playstore 将 ANR Crashes 报告为 java lang IllegalStateException 凭证加密存储中的 Sh
  • C# catch(FileNotFoundException) 和 CA1031

    所以这段代码会触发CA1031 try logic catch FileNotFoundException exception type handle error 虽然这个没有 try logic catch FileNotFoundExc
  • 密码确认验证 CakePHP

    我进行了广泛的搜索 尝试了书中的每一个技巧 但我仍然无法让我的 CakePHP 应用程序执行简单的密码确认验证 我尝试创建一个自定义验证规则 如下所示 passwordequal gt array rule gt checkpassword
  • 无法让此正则表达式适用于 Snakemake 中的 wildcard_constraints

    我有一个用 Snakemake 编写的工作流程 用于分析生物测序数据 工作流程期望对所有数据文件进行组织 以便每个原始读取文件都以检测类型 RNASeq DNaseSeq 等 开头 并且在工作流程生成的所有文件中都保持此文件名约定 我有一个
  • Chrome中如何区分浏览器关闭和刷新事件?

    如何使用 JavaScript for CHROME 区分浏览器关闭和刷新事件 我尝试过下面的 JavaScript 代码 但它不适用于 Chrome window onbeforeunload function e var e e win
  • 如何打印问题中的变量值?

    我做一点补充 sumbit CIN A B CO R sumbit 0 1 1 CO R write CIN nl write A nl write nl write B nl write nl write CO write R nl 我想
  • Kotlin Gson 反序列化

    我收到一个带有地图包装器的 JSON 数据模型Table 我试图使用泛型来传递超出包装器的类型 但它在运行时翻译得不好 这是我的 JSON 文件的示例 Table paymentmethod id 1 paymentmethod descr
  • 合并两个纠缠的凸包

    如何合并两个纠缠的凸包 例如this https i stack imgur com ALM4G jpg 使用格雷厄姆扫描或任何其他算法在线性时间内形成凸包 基本上 你使用安德鲁的修改 https en wikibooks org wiki
  • 本机查询支持 SQL Server 的 Spring data jpa 流

    我们需要使用 Spring data jpa 从 SQL Server 检索数据 由于我们有数百万条记录 因此我们无法一次请求加载所有数据 是否可以使用本机查询进行流式传输 是的 您可以让您的查询方法在 Spring Data JPA 中返
  • 添加翻转到 JTree 句柄

    我正在尝试对Collapsed Icon https docs oracle com javase 8 docs api javax swing plaf basic BasicTreeUI html collapsedIcon对于 JTr
  • 堆栈溢出 C++

    所以我试图解决一个任务 a 已经有代码 但系统输出 堆栈溢出 我是 C 新手 我的英语不好 所以很抱歉造成误解 include
  • 如何(正确)使用带有实时绑定的枚举类型(TObjectBindSourceAdapter)

    我在用着TObjectBindSourceAdapter对对象使用实时绑定 我正在使用的对象的属性之一TObjectBindSourceAdapter具有枚举类型 但是当我在对象中使用枚举类型时 适配器中的字段永远不会生成 我目前找到的唯一