工作在许多线程中完成,TListView从这些线程更新。它们每个都在ListView中引用了它们相关的TListItem,因此如果listview稍后进行排序并不重要。无论如何,正确的单元格将会更新。
但是现在我想使用stringgrid而不是listview。但是,如果用户对stringgrid进行排序,那么线程将如何知道要更新的单元格?我发现没有引用放入回调的线程。我希望有一个参考,而不必每次都查找正确的单元格。这可能吗?
编辑:以下是我在评论中讨论的列表中存储的内容:
TInfoPackList包含类型为
的对象TInfoPack = class
ID: Integer;
Name: string;
Location: string;
Thread: TMyThread;
end;
有更多成员,但这些是与网格中显示相关的成员。
答案 0 :(得分:1)
线程必须处理一些数据存储,而不是可视组件。 网格只按需要的顺序显示数据存储的内容。如果您需要在存储中保持排序顺序,请维护索引。
请注意,此方法类似于DataSet + TDBGrid
编辑:
当然,线程可以更新可视控件,但信息最少,数据流最小。它们不用于与界面的持续交互
2.不应将可视控件用于数据存储。考虑模型 - 视图 - 控制器模式,它刺激我们分离内部数据表示和用户视图表示的机制。
答案 1 :(得分:1)
使用TMS TAdvStringGrid,您可以使用OnRawCompare事件对每个单元格进行比较以进行手动排序,您还可以在其中保留哪个单元格属于哪个线程的列表。
但在我的诚实意见中,我宁愿做以下事情:
请记住,您必须具有访问列表的线程安全方式。像CriticalSections这样的东西。 TThreadList具有锁定功能,可锁定列表访问,直到解锁。
你必须在这里做更多的工作,因为就像MBo在这里回答的那样,与TListView不同,StringGrid只存储它显示的字符串,而不存储你可以从线程访问的对象。所以这使得线程很难知道字符串在StringGrid中的位置,除非你搜索它,但重复的是什么。所以答案在于将数据存储在我上面描述的其他地方,然后只使用StringGrid来显示该数据。