如何(正确)使用带有实时绑定的枚举类型(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) 的相关文章

  • Winform 没有.NET 框架?

    我必须创建一些表单并将其作为直接 EXE 提供 而不是安装程序 它安装 NET 框架 最终用户对此不满意 他们想要可以直接打开和工作的东西 我知道它可以作为网络完成 但我正在寻找 winforms 吗 请建议哪种工具 技术可以处理这个问题
  • 调用泛型类型的方法?

    为什么下面的代码在 Delphi XE 中会产生错误 unit UTest interface type TTest class public procedure Foo
  • 如何让枚举存储每个条目的额外信息

    我有一组包含相关信息的项目 这些项目是由我 程序员 定义的 用户不需要更改它们 它们永远不需要根据配置进行更改 并且它们唯一可能更改的时间是在我的应用程序的未来版本中 我事先知道这些项目应该有多少 以及它们的确切数据是什么 枚举是一种很棒的
  • 如何使用用户输入来寻址 Pascal 中的特定变量(Eval/Exec?)

    我正在尝试在分形程序中做一些非常具体的事情隆起7X http apophysis 7x org 使用的脚本语言是Pascal 该项目是用德尔福写的 https svn code sf net p apophysis7x svn trunk
  • 使用 StretchDIBits 使用 Delphi 6 处理条形码图像 - 输出中缺少条形线

    我的应用程序是在 Delphi 6 中开发的 由于后台处理和大量数据 它消耗大约 60MB 120MB 物理内存 这是一个资源密集型应用程序 该应用程序的功能之一是在进行某些处理后创建条形码图像 如果用户继续生成条形码 那么至少十分之一的条
  • 枚举 NSString 的最佳方法

    我正在寻找枚举 objc 对象 例如 NSString 的方法 我记得 Xcode4 版本中有一个新功能 它提供了一种新的 enum 方法 但不清楚 有人知道吗 好吧 我自己回答 我想我犯了一个错误 这就是我上面提到的新功能 typedef
  • C#中Enum中定义的value__是什么

    What value 可能在这里 value MSN ICQ YahooChat GoogleTalk 我运行的代码很简单 namespace EnumReflection enum Messengers MSN ICQ YahooChat
  • 在 Delphi XE 中将类作为过程的参数传递

    我需要做的是这样的 procedure A type of form var form TForm begin form type of form Create application form showmodal freeandnil f
  • 如何将计算值转换为文字以进行枚举初始化

    我遇到了枚举的问题 因为我想将 case 初始化为双精度值PI 180 有没有办法通过常量或一些时髦的魔法获取这个计算值并将其转换为文字 以便我可以初始化枚举 我宁愿不必做3 14 我宁愿使用该值的实际编译器和硬件计算表示 所以我的第一次尝
  • Kotlin 中的枚举类对于 Android 来说是否像 Java 中那样“昂贵”?

    Are EnumKotlin 中的类对于 Android 来说 昂贵 就像 Java 一样 还可以用吗 IntDefs or StringDefs在科特林 当我将 Kotlin Enum 类反编译为 Java 类时 底层仍然使用了 Java
  • 在 Delphi 2009 上安装最新版本的 Indy 10 [重复]

    这个问题在这里已经有答案了 是否有更新 Delphi 2009 中的 Indy 10 组件的分步指南 我读过正在卸载线程 https stackoverflow com questions 486210 what is the proper
  • GoogleTest 枚举类的测试错误打印

    我正在使用 GoogleTest 版本 1 7 0 来测试我的 C 应用程序 我有一个枚举定义如下 namespace MyNamespace enum class MyEnum MyEnumValue MyEnumValue2 Googl
  • 查找Delphi项目中的所有编译错误

    我正在对我的 Delphi 项目进行一些重构 我希望能够做出改变 然后看看all项目中因该更改而中断的地方 类似于 Eclipse 列出项目的所有编译错误 在 Java 中 在 Delphi 中 我可以进行更改 然后重新编译我的项目 但编译
  • 如何释放 TInterfacedObject 中的 TObject 成员

    我知道接口对象是引用计数的 因此不需要手动释放它 但如果它有一个 TObject 继承成员 我是否应该在析构函数中手动释放该成员 考虑以下代码 program Project2 APPTYPE CONSOLE R res uses Syst
  • 对象的引用计数

    在我的代码中 我使用一个小的数据存储类 它是在不同的地方创建的 为了避免内存泄漏并简化事情 我想使用引用计数 所以我这样做了 type TFileInfo class TInterfacedObject IInterface 并删除了我对
  • 如何使用 FieldDefs 在运行时创建新的 SQLite 文件和表?

    我正在使用 Delphi Seattle 在全新的 SQLite 文件中创建一个全新的表 并且仅使用 FieldDefs 和非可视代码 我可以使用 ExecSQL CREATE TABLE 语法创建一个表 但不能如下所示 我得到 没有这样的
  • std::less 枚举

    标准是否保证std less
  • 如何在Delphi中显示Vista风格的气球提示?

    在输入验证时 我使用气球提示而不是消息框 我的问题是 在 Vista 上 它们具有带圆角的旧 XP 样式 而不是较新的矩形外观 我尝试使用 CreateWindowEx 创建它们并且tooltips class32或使用 SendMessa
  • 通过套接字发送动态数组(在记录内)?

    我正在尝试直接使用 SendBuf 将记录从服务器传输到客户端 但是 该记录有一个动态数组的成员 并且我在某处 在 SOF 中 读到 发送记录时 成员必须是静态的 固定长度 但问题是 我无法确定如何我会 将来 发送许多论点 我怎么解决这个问
  • 在 Delphi 或 C++ Builder 中使用 Chromium Edge WebView2 [重复]

    这个问题在这里已经有答案了 既然 Microsoft Chromium Edge 已经最终确定 是否可以在 Delphi 或 C Builder 中使用它 据我了解 它是基于WebView2成分 是否有一个组件 例如TWebView2或者E

随机推荐

  • 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具有枚举类型 但是当我在对象中使用枚举类型时 适配器中的字段永远不会生成 我目前找到的唯一