首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从线程更新StringGrid

从线程更新StringGrid
EN

Stack Overflow用户
提问于 2015-02-18 05:50:30
回答 2查看 870关注 0票数 0

工作是在许多线程中完成的,并且从这些线程中更新了一个TListView。它们各自在ListView中都有对其关联的listview的引用,因此,如果稍后对listview进行排序并不重要。无论如何,正确的单元格将被更新。

但是现在我想使用一个字符串网格而不是listview。但是,如果用户对字符串网格进行排序,线程如何知道要更新哪个单元格?我发现在回调线程中没有引用。我想要一份推荐信,不用每次都查到正确的单元格。这个是可能的吗?

编辑:下面是我在评论中讨论过的列表中存储的内容:

TInfoPackList包含类型为:

代码语言:javascript
复制
TInfoPack = class
  ID: Integer;
  Name: string;
  Location: string;
  Thread: TMyThread;
end;

有更多的成员,但这些是相关的网格显示。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-18 07:32:47

德尔菲中的TStringGrid不具备排序功能,在这种情况下,您必须手动对其进行排序,因此您将能够保留哪个单元格属于哪个线程的列表。很简单。

使用TMS TAdvStringGrid,您可以使用OnRawCompare事件对每个单元格进行比较,以进行手动排序,您还可以保存哪个单元格属于哪个线程的列表。

但老实说,我宁愿做以下几件事:

  • 在每个线程中创建一个字符串指针。线程将随时更改该字符串。
  • 将该字符串指针添加到全局或父-全局TList或TThreadList中,这取决于您是否有访问TList的线程安全方式。
  • 根据您想要排序的时间,我将在线程更改其字符串指针中的字符串时,或者在许多线程的字符串指针发生更改之后,可能通过计时器进行排序,或者在ChangeCounter中进行一定数量的排序之后,对列表进行排序。TList有一个排序函数,您必须阅读它是如何完成的。
  • 在每种排序之后,我将使用已经排序的列表中的字符串手动填充StringGrid。

请始终记住,您必须有访问列表的线程安全方法。比如CriticalSections。TThreadList具有锁功能,它将列表访问锁定,直到解锁。

您必须在这里做更多的工作,因为就像MBo在这里回答的那样,与TListView不同,StringGrid只存储它显示的字符串,而不是可以从线程访问的对象。因此,除非您搜索字符串,否则线程很难知道字符串在StringGrid中的位置,但是重复字符串又如何呢?因此,答案在于将数据存储在其他地方,就像我前面描述的那样,然后只使用StringGrid作为数据的显示。

票数 1
EN

Stack Overflow用户

发布于 2015-02-18 07:05:27

线程必须处理一些数据存储,而不是可视化组件。网格只是以所需的顺序显示数据存储的内容。如果需要在存储中保持排序顺序,请维护索引。

注意,这种方法类似于DataSet+TDBGrid

编辑:

  1. 当然,线程可以更新可视化控件,但是使用最少的信息和最少的数据流。它们不是用来与接口进行连续交互的。
  2. 不应将可视化控件用于数据存储。考虑模型-视图-控制器模式,它激励我们分离内部数据表示和用户视图表示的机制。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28576862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档