问题标签 [tcollection]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
3306 浏览

delphi - 如何重新排序 TCollection 中的项目?

我正在尝试实现 MoveItemUp 和 MoveItemDown 方法,它们将选定的行向上或向下移动一个索引TCollection

添加到我的 TCollection 子类的以下代码不起作用:

我相当肯定这在运行时必须是可能的,因为它在设计时由 Delphi IDE 本身完成,它提供了一种重新排序列表中集合项的方法。我希望通过简单地重新排序现有对象来做到这一点,而无需创建、销毁或分配任何对象。这可能来自 Classes.pas TCollection 的子类吗?(如果没有,我可能必须从源克隆制作自己的 TCollection)

0 投票
3 回答
5940 浏览

delphi - 创建具有命名子组件的组件?

我需要了解使组件生成和管理子组件的基础知识。我最初通过创建一个 来尝试这个TCollection,并尝试在每个TCollectionItem. 但我知道这并不像我希望的那么容易。

所以现在我要从头开始这个项目,这次我想把它做好。这些子组件不是可视组件,不应该有任何显示或窗口,只是基于TComponent. 包含这些子组件的主要组件也将基于TComponent. 所以这里没有任何东西是可视的,我不想在我的表单上(在设计时)为每个子组件添加一个小图标。

我希望能够以类似集合的方式维护和管理这些子组件。重要的是这些子组件应该被创建、命名并添加到表单源中,就像菜单项一样。这首先是这个想法的全部要点,如果它们不能被命名,那么这整个想法就是 kaput。

哦,还有一件重要的事情:作为所有子组件的父组件的主组件需要能够将这些子组件保存到 DFM 文件中。

例子:

而不是访问这些子项目之一,例如:

相反,我想做类似的事情:

所以我不必依赖于知道每个子项的 ID。

编辑:

我觉得有必要包含我的原始代码,以便可以看到原始集合是如何工作的。这只是从整个单元中剥离的服务器端收集和收集项目:

0 投票
1 回答
564 浏览

delphi - 将集合转换为“命名组件” - 编译器错误

这与我问的另一个问题的公认答案特别相关。在将我已经存在的集合转换为这个新的“命名集合项”结构期间(如上一个问题中所述),我遇到了编译器错误......

[Error] JDSockets.pas(818): Incompatible types: 'tagWNDCLASSA' and 'Class reference'

这是来自Register程序,在第一行RegisterClass(TSvrCommandComp);

TSvrCommandComp是我TChildComponent在上一个答案中的TJDServerSocket版本,并且是我的TParentComponent.

现在在上一个答案中,实际上定义了 2 个单位。我跳过了这个概念并将它们构建到同一个单元中。而且这个单位非常庞大。在这里,我把它放在下面,尽可能多地去掉不相关的东西......

0 投票
2 回答
1066 浏览

serialization - 未在 TComponent 中声明的 TCollection 的序列化?

是否可以序列化未封装在 TComponent 中的 TCollection ?

例如,我有一个自定义 TCollection。我不能在我的 TCollection 后代上使用 TMemoryStream.WriteComponent() 。仅当我将集合封装在 TComponent 中,然后编写此组件时,它才会起作用。

从技术上讲没有问题,但是声明一个拥有 TCollection 的 TComponent 似乎有点奇怪。

也许我只是错过了 Delphi RTL 的一个功能?TPersistent 后代是否可以在不封装在 TComponent 中的情况下进行流式传输?

0 投票
1 回答
364 浏览

delphi - 如何更改从 TCollection 继承的类的 ItemClass

我有一个从 TCollection 继承的类(我们称之为“TMyCollection”),我必须从它继承一个新类(我们称之为“TMyItems”)

通常我们在 TCollection 的构造函数中传递 ItemClass 类型,但在我的情况下,TMyCollection 的构造函数被新的构造函数覆盖,它不接受 ItemClass,它只接受 Owner。

如果继承的构造函数不接受 ItemClass 参数,我需要知道如何更改“TMyItems”中的 ItemClass。

问候。

0 投票
1 回答
659 浏览

delphi - TColumn.FieldName 属性编辑器

我正在分析DBGrids.pas单位。有一个TColumn类已经发布了该FieldName属性

它被声明为一个字符串,但在对象检查器中它显示为一个可编辑的组合框 ( TDataFieldProperty)

我分析了几乎所有DBGrids单元,但找不到完成该技巧的地方。我应该去哪里看?

0 投票
1 回答
1092 浏览

delphi - 日期/时间选择器作为 TCollectionItem 后代中的属性编辑器

我正在编写一个需要日期、时间和日期/时间类型属性的组件。我希望这些属性在对象检查器中可见,并可以选择使用弹出属性编辑器。

我已尝试TDate将其作为已发布的属性,这为我提供了仅 Date 所需的结果。但是我需要同样的东西TTimeTDateTime但它们没有属性编辑器,实际上它甚至不接受我在那里输入的任何值。

我发现TDateTimePropertywhich 可以用作属性编辑器,或者无论如何我都理解。我在注册这个组件时已经完成了必要的实现。我需要应用它的这个属性实际上是一个TCollectionItem后代,不一定是组件的一部分,而是在其中。

我就是这样注册的...

虽然这可以编译,但当我安装它时,这个属性上没有属性编辑器。我尝试使用我的组件的类名来代替TMyCollectionItem相同的问题。

我在这里做错了什么来显示这个属性编辑器?

0 投票
1 回答
3766 浏览

delphi - 对于所有/对于每个循环通过 Delphi TCollection?

Delphi 是否提供了任何好方法来迭代 TCollection 中的 TCollectionItems?

一些东西,也许,沿着......

虽然没有编译

或者真的没有什么比这更优雅的了:

0 投票
2 回答
4107 浏览

performance - 在 Delphi FireDAC 中加载数组 DML 的最快方法

我正在使用 Delphi XE8 和 FireDAC 来加载大型 SQLite 数据库。为此,我使用 Array DML 执行技术一次有效地插入大量记录,如下所示:

将数据实际加载到 SQLite 数据库中的速度非常快,我对此速度没有任何问题。

让我慢下来的是在重复循环中将所有值分配给参数所花费的时间。

参数内置在 FireDAC 中并且是一个 TCollection。我无权访问源代码,所以我看不到 AsStrings 和 AsIntegers 方法实际上在做什么。

在我看来,将每个值分配给每个插入的每个参数并不是加载此 TCollection 的一种非常有效的方法。有没有更快的方法来加载这个?我在想一种方法可以一次加载一整套参数,例如 (IndiKey, HasData, ... FirstAncestralLoop) 全部作为一个。或者尽可能高效地加载我自己的TCollection,然后使用TCollection 的Assign 方法将我的TCollection 复制到FireDAC 的TCollection 中。

所以我的问题是,加载 FireDAC 所需的 TCollection 参数的最快方法是什么?


更新:我包括了 Arnaud 的一些时间安排。

将 SQLite 与 FireDAC 一起使用(请参阅其数组 DML 部分)中所述:

从 v 3.7.11 开始,SQLite 支持具有多个 VALUES 的 INSERT 命令。当 Params.BindMode = pbByNumber 时,FireDAC 使用此功能来实现 Array DML。否则,FireDAC 会模拟 Array DML。

我已经测试了插入 33,790 条记录来更改数组大小(每次执行要加载的记录数),并使用 pbByName(用于仿真)和 pbByNumber(使用多个值插入)来计时加载时间。

这是时机:

现在,关于这些时间的有趣之处在于,将这 33,790 条记录加载到 TCollection 中每次测试运行都需要整整 93 毫秒。无论是一次添加 1 个还是一次添加 10000 个,填充 TCollection 参数的开销总是存在的。

为了比较,我只为 pbByNumber 做了一个更大的测试,插入了 198,522 个:

对于此测试的所有情况,加载 TCollection of Params 的开销大约需要 503 毫秒。

因此,TCollection 的加载似乎是每秒大约 400,000 条记录。这是插入时间的重要部分,一旦我开始使用数百万的大型数据库,这个增加的时间对于我的程序的用户来说将是非常明显的。

我想改进这一点,但我还没有找到一种方法来加快参数的加载。


更新 2:通过将我的所有代码放在 StartTransaction 和 Commit 之间,我能够获得大约 10% 的时间改进,以便立即处理所有块。

但我仍在寻找某种方法来更快地加载 TCollection of Params。


另一个想法:

如果可能的话,可能会运行良好并且速度可能会提高 16 倍,例如ParamValues 方法。这一次分配了多个参数,并具有直接提供变量数组的额外优势,并且避免了转换值的需要。

它会像这样工作:

但是,ParamValues 只会分配给第一组 Params,即 NumIndiParms = 0。

有没有办法为循环中的每个索引执行此操作,即 NumIndiParms 的每个实例?


Bounty:我真的很想加快 Params 的加载速度。我现在为某人提供赏金,以帮助我找到一种方法来加快在 FireDAC 中实现的 Params 数组 TCollection 的加载。

0 投票
3 回答
665 浏览

delphi - Delphi 中的持久多态列表

我需要一个多态对象列表(不同的对象类,但具有公共基类),我可以将其作为表单文件的一部分“保留”。

TList 不是持久的,TCollection 不是多态的。

我可能可以自己动手,但不想重新发明轮子。想法?