将“增强记录”分配给普通“数据类型”变量时,应重载什么运算符?

2024-01-07

首先,我需要知道我想做的事情是否可行。如果可能的话,我需要知道如何做。

演示问题比解释问题要容易得多,所以这里是:

我有一个“增强记录”(目的 - 虽然对这个问题并不重要 - 是生成一个“智能字符串”类型,以替换普通的字符串类型):

TLKString = record
  Value: String;
  // Some methods here to operate on and build String values

  // Allows me to assign String values directly to "instances" 
  // of this record type! I have others (hence "overload") to 
  // handle other data types (such as Integer etc.)
  class operator Implicit(const AValue: String): TLKString; overload; 
end;

我现在可以使用这个 TLKString 类型,如下所示:

var
  LSmartString: TLKString;
begin
  LSmartString := 'Hello World'; // The "Implicit" operator then 
                                 // assigns this to LSmartString.Value
end;

好的,到目前为止一切都很好!现在我们遇到问题了......

我需要能够将 LSmartString (TLKString 的“实例”)的值分配给普通的字符串变量......

var
  LSmartString: TLKString;
  LNormalString: String;
begin
  LSmartString := 'Hello World';

  // The next line works fine, but is not what I want!
  LNormalString := LSmartString.Value; 
  LNormalString := LSmartString; // E2010 (Incompatible Types)
end;

这就是我遇到困难的地方,因为(我相信你会注意到),上面片段的最后一行结果是E2010 不兼容的类型:“string”和“TLKString”。当然,我知道情况会是这样……我不知道是否可以通过在 TLKString 记录类型上重载运算符来克服这个问题,如果可以,我需要重载哪个运算符来完成它。

如果这不可能,那么 CodeGear 和 Embarcadero 让我觉得有点愚蠢Implicit and Explicit运算符来处理将值分配给增强的 Record 类型,但没有运算符来处理相反的情况。


好吧,我自己已经回答了这个问题......这就是我所说的“显而易见”。

这是解决方案(为了他人的利益)

TLKString = record
  Value: String;
  // Some methods here to operate on and build String values
  class operator Implicit(const AValue: String): TLKString; overload; // handles String to TLKString assignment
  class operator Implicit(const AValue: TLKString): String; overload; // handles TLKString to String assignment! THIS IS THE ANSWER!
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将“增强记录”分配给普通“数据类型”变量时,应重载什么运算符? 的相关文章

  • XE2 中的 COM 是否损坏?我该如何解决它?

    Update XE2 Update 2 修复了下述错误 下面的程序是从实际程序中截取的 在 XE2 中失败并出现异常 这是 2010 年的回归 我没有 XE 来测试 但我希望该程序在 XE 上运行良好 感谢 Primo 确认代码在 XE 上
  • 为什么我不能在接收数组参数的函数中使用 SetLength?

    我正在尝试使用以下函数来设置动态数组 即 var 参数 的长度 当我尝试编译代码时只有一个错误 dcc64 错误 lolcode dpr 138 E2008 不兼容类型 function execute var command array
  • 如何更改 Delphi 2010 IDE 中编辑器选项卡的字体大小?

    有谁知道如何更改 Delphi 2010 IDE 中编辑器选项卡的字体大小 我的 1080p 22 显示器的字体太小 无法阅读 而且会导致眼睛疼痛 一些笔记 它不尊重系统的 DPI 设置 因此更改系统设置没有帮助 而且 我现在已经使用 14
  • delphi定时器比定时器服务中断例程更快

    大家好 我被要求为某人维护一个基于 Delphi 5 的程序 该程序使用一个计时器对象每 50 毫秒计时一次 并且在每次计时结束时运行单线程代码块 我只是想知道 如果执行这段代码所花费的时间比计时器滴答间隔长 会发生什么 这会很糟糕吗 例如
  • 递归遍历树视图中的节点?

    我有一个树视图 其中已经填充了另一个过程中的文件 文件夹 我想按照从上到下的确切顺序逐项迭代树视图中的项目 但是 与普通列表不同 我不能仅使用简单的for对此的声明 我必须进入每个节点等 我该怎么做呢 我希望有一种方法可以在不运行递归过程的
  • 根据模板参数的模板函数名称

    我一直在寻找与我的问题相关的示例 但仍然找不到解决方案 我发现的最接近的是 模板函数作为模板参数 https stackoverflow com questions 4697180 template function as a templa
  • Delphi 7,加载PNG到TImage

    只是想加载 PNG 尝试使用适用于其他格式的 OleGraphic 来使用我的 LoadPic 但在 PNG 上失败 目标是将图像复制到隐藏位图 然后将其屏蔽并复制到可见的工作图像画布 如果 CopyRect 不这样做 请随意提出其他建议
  • VCL.位图到 FMX.位图

    我在网上找到了这段代码 但 FMX Bitmap 没有扫描线 是否可以以某种方式将 VCL TBitmap 复制或绘制到 FMX Bitmap IFDEF MSWINDOWS type TBitmap FMX Types TBitmap T
  • 如何在滚动框上创建缓慢的滚动效果?

    我喜欢在滚动框中平移图像后创建平滑的减慢滚动效果 就像平移地图一样谷歌地图 http maps google com 我不确定它是什么类型 但行为完全相同 当快速移动地图时 当您释放鼠标时它不会立即停止 而是开始减慢速度 有什么想法 组件
  • Indy 的 TIdHTTPProxyServer:如何过滤请求?

    我正在使用 TIdHTTPProxyServer 来实现一个简单的 HTTP 代理 但我现在想阻止一些与某些 URL 匹配的连接 哪个事件和 或组件最适合实现这一目标 Indy 文档并没有太多解释 Thanks 作为基本过滤器 您可以使用
  • 在运行时按需更改组件类

    我的问题与这里的想法类似 替换delphi中的组件类 https stackoverflow com q 4685863 937125 但我需要改变一个specific按需组件类 这是一些伪演示代码 unit Unit1 TForm1 cl
  • 如何在 Delphi REST 中发布内容类型为“multipart/form-data”的数据?

    我正在尝试使用 REST API 发送请求multipart form data作为内容类型 我总是收到 HTTP 1 1 500 Internal Error 作为响应 我尝试向需要的方法发送请求application x www for
  • 这是重载,不同类中具有相同名称和不同签名的方法吗?

    如果我有以下 Java 代码 class A public int add int a int b return a b class B extends A public float add float a float b return a
  • 运行delphi客户端自动化程序后excel.exe保持加载状态的原因是什么?

    我编写了一个 Delphi 程序 该程序从单个 XLS 文件的多个不同电子表格中提取数据并将其合并到文本文件中以供以后处理 这是德尔福7console程序 最相关的代码片段的摘录将向您表明 显然 我的程序表现得相当好 或者至少达到了它需要的
  • Async InputQuery 不处理“取消”按钮

    我正在使用一个简单的调用TDialogServiceAsync InputQuery 使用单个输入 它只是忽略了Cancel按钮和窗口的X关闭按钮 But the Ok按钮工作正常 这是我的代码 uses FMX DialogService
  • 如何遍历任意给定集合中的枚举?

    我有很多枚举类型 它们与相应的集合相结合 例如 type TMyEnum meOne meTwo meThree TMyEnums set of TMyEnum 我正在尝试提出一组可以运行的函数any枚举集 而不是为每个枚举编写单独的函数
  • 宏可以按参数数量重载吗?

    如何this https stackoverflow com q 9183993 153285工作 如何实现 C99 C 11 可变参数宏以仅根据为其提供多少个参数来扩展到不同的事物 编辑 请参阅末尾以获得现成的解决方案 要获得重载的宏 首
  • 不断断点?如何去除它们?

    我下载了一个用Delphi 2009制作的项目 这也是我使用的 但是有一个断点我无法删除 如果我尝试删除它 它会在程序执行后再次执行 我在其他调试器中遇到了这样的事情 称为硬件断点 但这并不重要 如何删除断点 EDIT Article ht
  • Word 2010 自动化:“转到书签”

    我有一个用 Delphi 7 编写的程序 它打开一个基于模板的新 Word 文档 文档打开后 系统会自动跳转到书签 在模板中预定义 并在其中添加一些文本 以下代码在 Word 2003 中工作正常 但会导致invalid variant o
  • 每次 TDbGrid 的选定位置更改时都会触发什么事件?

    我的项目中有一个 TDbGrid 每次更改所选行时我都试图触发一个事件 行中的任何更改都已经更新了链接到同一数据源的所有数据感知控件 但还需要进行其他更改 我需要一个事件处理程序 我认为 OnColEnter 会起作用 根据帮助文件 它在以

随机推荐

  • 如何将AppHarbor与Slack集成?

    似乎没有官方集成 a t m 我怎样才能手动完成呢 我想要实现的是 每次构建从 通过 变为 失败 时 Slack 上都会发布一条 悲伤的 消息 每次构建从 失败 变为 通过 时 都应该发布不同的 快乐 消息 None
  • 如何将 Youtube 视频嵌入到我的应用程序中?

    我正在尝试为我的 Swift 应用程序创建一个视频播放器 但我不断收到 无法解析的标识符 AVPlayerViewController 的错误 我缺少什么 我是这方面的初学者 通俗地说我可能要问几千次 我已经在互联网上搜索了大约一天的视频
  • Django 多个 slug url

    我有两种蛞蝓 path
  • 两个极限之间缩放数字的数学方程不从 0 开始? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 例如 我有一个 1 100 之间的数字 我需要将其缩放到 20 80 之间 例子 1 scales to 20 100 scales to
  • 错误的键类:文本不是 IntWritable

    这似乎是一个愚蠢的问题 但我在 hadoop 的 mapreduce 代码中没有看到我的类型中的问题 正如问题中所述 问题是它需要 IntWritable 但我在减速器的collector collect 中向它传递了一个 Text 对象
  • 不支持的方法:eth_sendTransaction。 Alchemy 不持有用户的私钥

    我无法通过 Alchemy 从前端执行智能合约的发送交易方法 我是一个初学者 我正在尝试从我的前端执行一个方法 将交易发送到区块链 但我从 alchemy 收到一个错误 说该交易需要使用我的私钥签名 但我不知道如何执行此操作我在互联网上没有
  • 在 Swift 上从 kCBAdvDataManufacturerData 中提取数据

    我有一个 TI 传感器标签作为外设 以 kCBAdvDataManufacturerData 的形式广播 BLE 数据 我想从 iOS 中的数据中提取不同的值 我正在 Swift 中执行以下命令 func centralManager ce
  • 如何以 <60 秒的间隔运行 ColdFusion 计划任务?

    我有一个 CFC 方法 希望以 30 秒的间隔运行一次 但是 问题是 ColdFusion 不允许我安排以 60 秒或更短的时间间隔运行的任务 有人对我如何 并且应该 实现这一目标有建议吗 为了抢先回答 当你的脚本运行超过 30 秒时会发生
  • 调整居中径向渐变的半径大小

    我正在重新设计当前的项目 并找到了一种简单的方法来使用以下方法淡化 div 背景的左右边缘 我一直在尝试编辑中心圆的半径 以使其更小 我似乎无法改变它 除非整个渐变样式消失 我试图将黄色区域设置为文本的背景 逐渐淡入透明 我需要做什么才能获
  • 以编程方式从 *.cls 或类似文件将模块导入 access

    如果打开 Microsoft Access 则打开 Visual Basic 窗口 以便您可以看到 Access 项目中的模块和代码列表 您可以从 Windows 资源管理器中拖动基于文本的文件 txt cls bas 等 并将其放入模块文
  • 是否可以替换操作系统的Loader?有什么办法获得Loader的控制权吗?

    我只是想知道是否可以替换操作系统的加载程序 可执行程序加载程序而不是引导加载程序 Windows 是我的选择 是否有任何第三方加载程序可以修补默认加载程序 有什么方法可以让我获得对 OS Loader 的控制权吗 我的意思是 我希望它所做的
  • 有 ISO-Prolog 参考实现吗?

    Java https jdk7 java net java se 7 ri has a 参考实现 http en wikipedia org wiki Reference implementation ISO Prolog 有参考实现吗 我
  • OSError:未找到名为“cairo-2”的库(从 Custom_Widgets 导入 ProjectMaker)

    如何修复这个错误 C Users vanvl OneDrive Bureaublad Progammeren Project 1 02 2 gt python Python 3 9 13 tags v3 9 13 6de2ca5 May 1
  • 如何使用 D3DPT_TRIANGLESTRIP 基元类型在 DirectX 中绘制两个分离的矩形

    我是 DirectX 新手 我正在尝试使用以下命令在一个场景中绘制两个矩形D3DPT TRIANGLESTRIP 一个矩形没问题 但两个矩形则完全不同 是的 我可以使用用 绘制的四个三角形来绘制它们D3DPT TRIANGLELIST原始类
  • 如何向工具栏添加调用 JavaScript 函数的自定义按钮?

    我想在工具栏上添加一个按钮来调用 JavaScript 函数 例如Tada 关于如何添加这个有什么想法吗 还有一种很好的方法允许人们在不创建插件的情况下添加按钮 html
  • 如何使用 CSS 或 Jquery 覆盖 left:0?

    我有一个元素 它具有以下 CSS elem left 0 position fixed right 0 width 60 z index 1000 该元素不跨越整个屏幕 我希望它 对齐 到屏幕的右侧 如果我删除的话 这会很容易left 0
  • SNMP 代理的测试 URL

    我正在尝试查找 SNMP 代理的 URL 列表 我可以将其用于测试目的 到目前为止 我已经使用了 NET SNMP 测试 url gt test net snmp org 我还使用 Verax Simulator 来模拟特定代理 不过 请问
  • Django 根据 ChoiceField 选择显示字段

    我一直很难找到如何在 django 中创建一个依赖于表单中另一个字段的选择的文本字段 仅当选择设置为 购买 时才需要显示此字段 现在我遇到一个问题 它不会根据下拉选择进行更新 而是仅在我点击按钮 提交 表单后进行更新 有没有办法获取当前选择
  • RISC-V 使用 LUI 和 ADDI 构建 32 位常量

    LUI 加载立即数 用于构建32位常量并使用U型格式 LUI 将 U 立即数放入目标寄存器 rd 的高 20 位 并用零填充最低 12 位 我在手册中找到了这个 但是如果我想将 0xffffffff 移动到寄存器 我需要的所有代码是 LUI
  • 将“增强记录”分配给普通“数据类型”变量时,应重载什么运算符?

    首先 我需要知道我想做的事情是否可行 如果可能的话 我需要知道如何做 演示问题比解释问题要容易得多 所以这里是 我有一个 增强记录 目的 虽然对这个问题并不重要 是生成一个 智能字符串 类型 以替换普通的字符串类型 TLKString re