快速搜索Tmemo行的方法

发布于 2024-10-31 17:00:39 字数 495 浏览 0 评论 0 原文

我的表单上有一个 TMemo,允许用户输入项目列表。人们可以在这里输入许多项目。当他们单击“保存”时,会检查 TMemo 的内容,然后将其添加到数据库中。

我在 TStringList 中有第二个列表,我循环检查它的任何项目是否包含在 TMemo 中。

简而言之,它看起来像这样

....
//slItems = TStringList
//mItems = TMemo
for i := slItems.Count -1 downto 0 do
begin
  if mItems.Lines.IndexOf(slItems[i]) = -1 then
    slItems[i].Delete;
end;
----

所以 stringlist 循环,检查它是否存在于备忘录中,如果不存在从列表中删除。

然而,当有 200 多个项目时,速度开始减慢很多,而当项目超过 1000 时,情况会变得非常糟糕。

搜索 TMemo 最快的方法是什么?

I have a TMemo on a form which allows users to enter a list of items. People can enter many items here. When they click Save the contents of the TMemo is checked and then added to the database.

I have a second list in a TStringList which I loop over and check to see if any of it's items are contained in the TMemo.

In a nut shell it looks like this

....
//slItems = TStringList
//mItems = TMemo
for i := slItems.Count -1 downto 0 do
begin
  if mItems.Lines.IndexOf(slItems[i]) = -1 then
    slItems[i].Delete;
end;
----

So stringlist looped, check to see if it exists in memo, if not delete from list.

However, with 200+ items this is starting to slow down a lot, and with 1000 it gets real bad.

Whats the fastest way to search a TMemo?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

流心雨 2024-11-07 17:00:39

将所有 TMemo 读入本地 TStringList 并从中进行工作。每次访问 TMemo.Lines 时,您都依赖 Windows 消息传递来与 Windows 提供的多行文本框进行对话。除了高效之外什么都没有!

....
//slItems = TStringList
//mItems = TMemo
//L = TStringList
L.Text := mItems.Text; // edited per David's suggestion.
L.Sorted := True; // per Uwe Raabe's suggestion.
for i := slItems.Count -1 downto 0 do
begin
  if L.IndexOf(slItems[i]) = -1 then
    slItems[i].Delete;
end;
----

Read all of TMemo into a local TStringList and work from that. Every time you're accessing TMemo.Lines you're relying on Windows messaging to talk to the windows-provided multi line text box. Anything but efficient!

....
//slItems = TStringList
//mItems = TMemo
//L = TStringList
L.Text := mItems.Text; // edited per David's suggestion.
L.Sorted := True; // per Uwe Raabe's suggestion.
for i := slItems.Count -1 downto 0 do
begin
  if L.IndexOf(slItems[i]) = -1 then
    slItems[i].Delete;
end;
----
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文