Move() 从动态字符串数组中插入/删除项目

2024-05-02

使用 System.Move() 从字符串数组中插入/删除项目并不像从其他简单数据类型数组中插入/删除项目那么容易。问题是...字符串在 Delphi 中是引用计数的。在引用计数数据类型上使用 Move() 需要对内部编译器行为有更深入的了解。

这里有人可以解释我实现这一目标所需的步骤,或者更好地使用一些代码片段,或者指导我在互联网上找到一个很好的参考吗?

哦,请不要告诉我使用“懒惰但缓慢的方式”,即for循环,我知道。


我之前演示过如何从动态数组中删除项目:

  • Delphi 问答:如何从数组中删除元素? http://www.cs.wisc.edu/~rkennedy/array-delete

在那篇文章中,我从以下代码开始:

type
  TXArray = array of X;

procedure DeleteX(var A: TXArray; const Index: Cardinal);
var
  ALength: Cardinal;
  i: Cardinal;
begin
  ALength := Length(A);
  Assert(ALength > 0);
  Assert(Index < ALength);
  for i := Index + 1 to ALength - 1 do
    A[i - 1] := A[i];
  SetLength(A, ALength - 1);
end;

You 不会出错与该代码。使用任何值X你要;在你的情况下,将其替换为string。如果你想变得更喜欢并使用Move,那么也有办法做到这一点。

procedure DeleteX(var A: TXArray; const Index: Cardinal);
var
  ALength: Cardinal;
  TailElements: Cardinal;
begin
  ALength := Length(A);
  Assert(ALength > 0);
  Assert(Index < ALength);
  Finalize(A[Index]);
  TailElements := ALength - Index;
  if TailElements > 0 then
    Move(A[Index + 1], A[Index], SizeOf(X) * TailElements);
  Initialize(A[ALength - 1]);
  SetLength(A, ALength - 1);
end;

Since X is string, the Finalize调用相当于将空字符串分配给该数组元素。我用Finalize不过,在这段代码中,因为它适用于all数组元素类型,甚至包括记录、接口、字符串和其他数组的类型。

对于插入,只需将其向相反方向移动即可:

procedure InsertX(var A: TXArray; const Index: Cardinal; const Value: X);
var
  ALength: Cardinal;
  TailElements: Cardinal;
begin
  ALength := Length(A);
  Assert(Index <= ALength);
  SetLength(A, ALength + 1);
  Finalize(A[ALength]);
  TailElements := ALength - Index;
  if TailElements > 0 then begin
    Move(A[Index], A[Index + 1], SizeOf(X) * TailElements);
  Initialize(A[Index]);
  A[Index] := Value;
end;

Use Finalize当你要做一些超出语言范围的事情时,例如使用非类型安全Move覆盖编译器管理类型的变量的过程。使用Initialize当您重新输入语言的定义部分时。 (该语言定义了当数组增长或收缩时会发生什么SetLength,但它没有定义如何在不使用字符串赋值语句的情况下复制或删除字符串。)

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

Move() 从动态字符串数组中插入/删除项目 的相关文章

  • 为什么 Delphi 中的 ADO Next 记录处理速度变慢?

    我有一个多年前开发的 Delphi 4 程序 它使用Opus 直接访问 http sourceforge net projects directaccess 按顺序搜索 Microsoft Access 数据库并检索所需的记录 Delphi
  • 如何在表单上绘制半透明图像?

    我想在 Delphi 窗体上绘制半透明图像 但由于某种原因它不起作用 Here is the original PNG border is semi transparent 我将图像加载到TImage object Image1 Trans
  • 在 Delphi 中淡入 alpha 混合 PNG 表单

    几年前 当 Vista 首次发布时 我曾提出过这个问题 但始终没有解决这个问题 并把它搁置起来 留待以后再考虑 我有一个启动屏幕 我花了很大力气让它看起来很棒 这是 32bpp alpha 混合的 PNG 我有一些代码 如果需要 我可以挖掘
  • 如何读取和更改 TEdit 控件的值?

    我有一个表格TForm1有 5TEdit and 2 TBitBtn 我还需要该程序 以便在输入数字数据后Edit1 and Edit2 on BitBtn1Click Edit1 and Edit2值将被求和并显示在Edit3 你想做这样
  • 似乎有时 Delphi 是区分大小写的 - “覆盖方法应该与祖先的大小写匹配”

    今天我遇到了一个 奇怪 的提示 覆盖方法 xxxx 应匹配祖先 yyyy 的大小写 解决方案是完全按照祖先中的方式声明方法名称 我相信这是自 Delphi Net 编译器以来编译器中保留的东西 与祖先中完全相同的方法声明方法使编译器 沉默
  • FireDac 添加下划线 1 以区分具有相同名称的 2 个列名

    我有一个连接 2 个表的选择 因此这些表中存在具有相似名称的列 因此现在在检索结果时 FireDac 将下划线 1 添加到第二个列名称以区分这两个表 Select from Table1 inner join Table2 on Table
  • 如何修复这个 delphi 7 编译错误 - “重复资源”

    我正在尝试编译我继承的 Delphi 7 项目 但收到此错误 错误 警告 重复资源 错误 类型 2 位图 ID 编辑 错误 文件 C 路径缩短 common CRGrid res 资源已保留 文件 c common raptree RES
  • 面向 Delphi 开发人员的 Qt

    有人知道为 Delphi C Builder VCL 开发人员解释 Qt 的书籍或教程吗 对于具有该背景的开发人员来说 学习 Qt 的最佳方法是什么 我对如何使用 Qt 完成我知道如何在 Delphi 中完成的事情特别感兴趣 例如 Qt 相
  • 在 Delphi 中获取 TCheckbox 的总大小,包括框和文本

    我想获得 TCheckbox 的总大小 包括 Delphi 中的框和文本 我查看这篇文章Delphi FMX TCheckbox TRadiobutton 自动调整大小 https stackoverflow com questions 4
  • Android中如何检测程序的终止?

    当 Windows 程序终止时 它会调用事件处理程序 例如 OnClose OnDestroy 和析构函数 Destroy 当我想保存一些 INI 设置时 这些地方就是我要保存的地方 我为所有这些事件编写了事件处理程序 但当我终止程序时它们
  • 新编译的应用程序需要 UAC/elevation?

    我有一个系统 我将其设置为普通的 UAC 并在我的 delphi 环境中编译名为 ka exe 的项目 并为其创建一个 installshield 项目 设置完毕 一切顺利 但每当我开始我的程序时 它都需要提升 而我不知道为什么 为了确保
  • 如何从窗体单元外部访问delphi控件?

    我试图从如下定义的过程中调用计时器的 Enabled 属性 procedure Slide Form TForm Show Boolean 并且没有固定的形式名称 例如 Form2 Timer 将表单的单位放入使用列表后 这可以工作 For
  • 在 ADO 查询 (mysql/MyConnector) 中使用参数

    今天我下载并安装了 MyConnector 这样我就可以通过 ADO 使用 Mysql 一切都安装好了 我可以与 ODBC 连接并从我的 delphi 环境进行连接 当我在运行时构建查询时 我收到一条错误消息 项目 Project1 exe
  • “已发布集 '%s' 的大小大于 4 字节”。如何修复这个编译器错误?

    我有一组包含 138 个值的枚举值 就像是 type TSomething sOne sTwo sThree sOnehundredAndThirtyeight TSomethings set of TSomething TSomethin
  • 如何将 Delphi Chromium Embedded (TChromium) 组件的声音静音?

    我需要将某个声音静音TChromium组件来制作无声浏览器 主要问题是在 Windows XP 上 当我将浏览器的声音静音时 它会静音整个系统的声音 有没有办法让电脑静音TChromium成分 我已经成功使用以下代码 procedure C
  • 在该对象调用的事件期间销毁该对象

    我有一个按钮 它的 OnClick 事件调用一个销毁按钮的过程 但随后 线程 想要返回到 OnClick 事件 并且我遇到了访问冲突 我完全被难住了 您需要在按钮的所有代码执行完毕后销毁该按钮 执行此操作的标准方法是将用户定义的消息发布到表
  • 在 tlistbox 中绘制缩略图

    在 DelphiXE 中 我使用 tFileOpenDialog 选择一个文件夹 然后在 tListBox 中列出该文件夹中的所有 jpg 文件 我允许将列表项拖放到列表中进行自定义排序 以便稍后按顺序显示它们 我希望能够在文件名旁边绘制图
  • 如何获取属于某个进程的打开句柄的计数?

    您可以使用该程序流程浏览器 http technet microsoft com en us sysinternals bb896653查看正在运行的应用程序有多少个句柄 有没有办法用Delphi代码来获取这个数字 我有兴趣跟踪应用程序本身
  • Delphi XE 和 OmniXML:使用 SelectNode()?

    我将以下 XML 片段作为一个更大的 XML 文件的一部分 我正在使用最新的 OmniXML 快照进行处理
  • 有没有其他方法可以在delphi上观看youtube视频?

    我看到http www delphiflash com demo youtube video http www delphiflash com demo youtube video关于如何在 delphi 上加载 flash 视频 但它不是

随机推荐