处理大量行时,TMemo 速度慢得令人痛苦

2023-11-23

我的 TMemo 中有 100000 行。我想做类似的事情:

 for i:= 0 to Memo.Lines.Count-1 do
  Memo.Lines[i]:= SomeTrim(Memo.Lines[i]);

但速度是每秒0.5行!!

添加 BeginUpdate/EndUpdate 后,我没有看到任何速度改进。

 Memo.Lines.BeginUpdate;
 for i:= 0 to Memo.Lines.Count-1 do
  Memo.Lines[i]:= SomeTrim(Memo.Lines[i]);
 Memo.Lines.EndUpdate;

我的问题是为什么 BeginUpdate/EndUpdate 没有帮助?


TStrings.BeginUpdate/EndUpdate只会禁止OnChanging and OnChanged事件。它对内容本身更改的内部处理没有影响。

TMemo.Lines是由TMemoStrings它将文本内容存储在 Window 控件本身中。因此BeginUpdate/EndUpdate在这里毫无用处。

使用本地可能会获得更好的结果TStringList实例,并使用Text从中复制数据的属性TMemo to TStringList然后回来。这Text属性是访问整个内容的最有效方式TMemo立刻。

  lst := TStringList.Create;
  try
    lst.Text := Memo1.Lines.Text;
    for I := 0 to lst.Count - 1 do begin
      lst[I] := SomeTrim(lst[I]);
    end;
    Memo1.Lines.Text := lst.Text;
  finally
    lst.Free;
  end;

Note:一些评论提到使用Assign而不是Text从备忘录复制内容或将内容复制到备忘录时的属性:Assign由于内部优化,在这种情况下速度明显变慢Text财产为TMemoLines。该属性的 Getter 和 Setter 通过单个 WM_GETTEXT/WM_SETTEXT 消息直接访问 Windows 控件,而Assign每行使用一个 EM_GETLINE 消息进行读取,每行使用一系列 EM_LINEINDEX、EM_SETSEL、EM_LINELENGTH 和 EM_REPLACESEL 进行写入。一个简单的时序测试表明,上面的代码在替换时大约需要 600 msText作业与Assign通话需要11秒以上!

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

处理大量行时,TMemo 速度慢得令人痛苦 的相关文章

  • 有人用CrossKylix进行真正的跨平台开发吗?

    新版本克罗斯凯利克斯 http crosskylix untergrund net 两周前更新过 即使 Kylix 已经停产很久了 但它似乎仍然被一些 Delphi 开发人员使用 有人在 Windows 和 Linux 的跨平台开发中成功使
  • TDictionary 上的 GetItem 由链接器消除

    我正在使用一个TDictionary of
  • 不断断点?如何去除它们?

    我下载了一个用Delphi 2009制作的项目 这也是我使用的 但是有一个断点我无法删除 如果我尝试删除它 它会在程序执行后再次执行 我在其他调试器中遇到了这样的事情 称为硬件断点 但这并不重要 如何删除断点 EDIT Article ht
  • Word 2010 自动化:“转到书签”

    我有一个用 Delphi 7 编写的程序 它打开一个基于模板的新 Word 文档 文档打开后 系统会自动跳转到书签 在模板中预定义 并在其中添加一些文本 以下代码在 Word 2003 中工作正常 但会导致invalid variant o
  • 在 Delphi 中使用 XML(将特定数据返回到变量)

    过去几天我一直在尝试使用 Delphi 2010 和 MSXML 我是一个极端的新手 需要一点指导 var MemoryStream TMemoryStream XMLPath String sName String XMLDoc vari
  • delphi中如何实现多重继承?

    我正在对一个旧库进行完全重写 我不确定如何处理这种情况 为了便于理解 大家都欢呼自行车类比 我有以下课程 TBike 自行车本身 TBikeWheel 自行车的一个轮子 TBikeWheelFront and TBikeWheelBack
  • 如何调试仅在应用程序关闭时发生的崩溃? (德尔福)

    因此 经过最近的一些更改 我们发现我们最古老的应用程序之一有时会在关闭时崩溃 这会以 运行时错误 216 消息的形式或来自 Windows 错误报告的消息的形式表明应用程序已停止工作 该应用程序已经发出OutputDebugString 每
  • Delphi 6 命令行编译:无 DCU

    当对 dpr 文件使用 dcc32 时 它会生成一个 dll 但不会生成 dcu 项目级别 cfg 使用 N 开关设置路径 但指定的目录中没有任何内容 当 E 开关正在工作时 它必须看到 cfg 我尝试在调用 dcc32 之前对 dpr 文
  • EOutOfMemory 使用 Delphi 创建大型 XML

    我正在使用 Delphi 从关系数据库中的数据创建 XML 文档 它在小数据集上测试得很好 但是当我尝试将数据集的大小扩展到生产级别时 它最终在节点创建期间因 EOutOfMemory 异常而崩溃 我正在使用放在表单上的 TXMLDocum
  • 从创建 UI 的同一线程更新 VCL。为什么?

    我知道我必须调用 Synchronize 来从未创建控件或向窗口发送消息的线程更新 vcl 我经常听到 线程不安全 这个词 但我找不到关于正在发生的事情的实际解释 我知道应用程序可能会因访问冲突而崩溃 但我又不知道为什么 请阐明这个主题 V
  • 将 [字节数组] 分配给没有 Unicode 转换的 Variant

    考虑以下代码片段 在 Delphi XE2 中 function PrepData StrVal string Base64Val AnsiString OleVariant begin Result VarArrayCreate 0 1
  • 在比较 Delphi 表单文件的版本时,如何使 Beyond Compare 忽略某些差异

    我使用Beyond Compare 版本3 1 10 来比较不同版本的Delphi Form Files 但我不想看到有关ExplicitTop ExplicitLeft ExplicitHeight 和ExplicitWidth 的差异
  • TStream.Position 与 TStream.Seek 比较

    要移动 TStream 类中的 当前字节 指针 我们可以使用属性 Position 例如 MyStream Position 0 或使用 Seek 方法 例如 MyStream Seek 0 soFromBeginning 问题是 哪一个更
  • delphi THashSHA2 在大文件上返回错误的 SHA256

    Data Cloud CloudAPI pas has class function TCloudSHA256Authentication GetStreamToHashSHA256Hex const Content TStream str
  • TThread.resume 在 Delphi-2010 中已弃用,应该在什么地方使用?

    在我的多线程应用程序中 I use TThread 挂起 and TThread resume 自从将我的应用程序移至 Delphi 2010 后 我收到以下警告消息 DCC 警告 xxx pas 277 W1000 符号 Resume 已
  • Delphi定时器比毫秒更精确

    我在 Delphi 中有一个程序 它以 25 赫兹 每秒 25 次 的速度从外部应用程序获取帧 然后通过创建 1 2 个额外帧将其转换为 60 赫兹 每秒 60 帧 我需要通过连续构建帧缓冲区并从单独的线程输出帧来输出这些额外的帧 问题是
  • 缓冲区为空,但 IdTCPClient.IOHandler.InputBufferIsEmpty 为 false

    我在使用 idTCPClient 从 telnet 服务器读取缓冲区的以下代码中遇到问题 procedure TForm2 ReadTimerTimer Sender TObject var S String begin if IdTCPC
  • 如何制作自定义组件属性?

    我需要帮助来制作一个控件属性 当您单击它时 它会弹出一个自定义对话框 例如设置 就像 TPicture 一样 有什么想法或建议吗 如果您的类用作其他组件的属性 并且您想使用对象检查器来调用对话框 那么您必须实现并注册一个自定义属性编辑器 例
  • 当应用程序最小化时隐藏表单

    我有一个主表单和一个状态表单 当我的应用程序中的工作正在进行时 我会显示它们 如果工作完成我就打电话Hide状态表上出现 状态表消失 当我最小化主窗体而等待窗体可见时 就会出现问题 然后两种形式都被隐藏 这就是我想要的 但是 如果工作完成时
  • Delphi XE3,丑陋的 StringGrid 边框

    与 Delphi 7 相比 为什么 XE3 中的 String Grid 边框如此不清晰 如何解决这个问题 Delphi 2010 之后所有的网格都是主题化的 要在网格上禁用新主题 您必须设置属性 在对象检查器中将 DrawingStyle

随机推荐

  • 如何使用 jQuery 从元素获取边框半径?

    我有一个 div 包含以下 HTML 和 CSS 为了使我的 Javascript 代码更加健壮 我尝试从所选元素中检索某些 CSS 属性 我知道如何使用 css getter 来获取元素 但是如何使用该方法获取边框半径 jQuery 的文
  • iOS 8 TestFlight 不安装应用程序

    正如标题所说 我正在尝试预发布一个 ios8 应用程序 该应用程序已从存档成功上传并显示在预发布下 我按下提交测试版并添加内部测试用户 在 testflight 中 该应用程序出现 但是当我按安装时 它显示 无法安装应用程序 testfli
  • 使用 jQuery 以编程方式触发 IE 的 Javascript 事件

    当 IE 中的用户触发事件时 它被设置为window event目的 查看触发事件的唯一方法是访问window event对象 据我所知 如果以编程方式触发事件 例如通过 jQuery 触发事件 这会导致 ASP NET 验证器出现问题 在
  • Eclipse:打开类和对象的语法突出显示

    是否有可能像在 Visual Studio 中一样在 Eclipse 中打开类和对象的突出显示 目前仅突出显示变量名称 左 Eclipse 右 Visual Studio 2012 Image http image uploader de
  • 转换输入时“ValueError:无法将字符串转换为浮点数”

    最近我一直在编写代码 并在这个错误上陷入困境几天 基本上 该程序计算您每天必须摄入多少卡路里 我必须从条目中获取输入 但我不知道如何将该输入 默认情况下是字符串 转换为浮点数才能开始使用数字 我正在使用 Python 3 和 Tkinter
  • 从十六进制颜色代码中查找颜色名称

    我想从十六进制颜色代码中找到颜色的名称 当我得到十六进制颜色代码时 我想找到最匹配的颜色名称 例如 对于代码 c06040 如何确定它是棕色 蓝色还是黄色 这样我就可以在无需人工干预的情况下找到图像中物体的颜色 颜色深浅的 十六进制代码之间
  • 如何在QML的.qrc资源文件中指定通配符?

    有 x 个 png目录中的文件 我不想手动添加所有这些 而是 想在 qrc文件并让它自己包含所有这些内容 达到这个目的的方法是什么 这是一个小 bash 脚本 它从文件夹的内容生成 qrc 文件 bin sh QRC resourcefil
  • 你可以在 Eclipse Android 项目中添加子文件夹到布局吗?

    当我在布局文件夹中创建子文件夹并将 xml 文件拖到其中时 生成的 R 文件似乎不显示该子文件夹 a 有没有办法改变 b 文件和文件结构是否仍然由 SVN 拾取和 c 那么 如果我这样做 我仍然可以使用布局引用对象吗 当我在中创建子文件夹时
  • 在 Next.js 中将 Markdown 文件作为字符串导入

    如何将 Markdown 文件作为字符串导入Next js在客户端和服务器端工作 您可以配置 Next js webpack 加载器来加载 markdown 文件并将其作为字符串返回 例如 docs home md Home This is
  • 设置弹出(Python)[重复]

    这个问题在这里已经有答案了 假设你有一套 foo 1 2 3 4 5 在我目前正在阅读的 Pro Python 一书中 它说使用foo pop 将从该选择中弹出任意数字 但是 当我尝试时 它pops 1 then 2 then 3 它是随意
  • SQL:获取一个表中的所有记录以及第二个表中的记录计数?

    假设有两个表 TABLE A messageID Message More 1 This is the first message Etc 2 This is the second message Etc 3 This is the thi
  • 如何存储可变参数模板参数?

    是否可以以某种方式存储参数包以供以后使用 template
  • 我可以使用 foo 等模式部分专门化模板吗?

    如果这是可能的 则可以索引到可变参数模板参数包而无需递归 然而 海湾合作委员会是拒绝接受我的部分专业化 here template
  • 所有 8 位按位移位会发生什么

    我在 c 中有一个小查询 我正在对数字 69 使用按位左移 即01000101以二进制形式 01000101 lt lt 8 我得到的答案是100010100000000 难道不应该是全8个零吗 00000000我们将所有 8 位左移 然后
  • Markdown 和 XSS

    好的 所以我一直在 SO 和其他地方阅读有关 markdown 的内容 用户输入和数据库之间的步骤通常给出为 将 markdown 转换为 html 清理 html 带白名单 插入数据库 但对我来说 执行以下操作更有意义 清理降价 删除所有
  • 如何在列表理解python中构建两个for循环

    我有两个列表如下 tags u man u you u are u awesome entries u man u thats u right u awesome 我想从中提取条目entries当他们在tags result for tag
  • 找不到文件“Microsoft.Windows.Common-Controls,版本=6.0.0.0,文化=*,PublicKeyToken=6595b64144ccf1df,

    我正在尝试整合这个图书馆进入我的应用程序 起初它崩溃了 Unable to find an entry point named TaskDialogIndirect in DLL ComCtl32 所以我取消了评论
  • 如何在 GitHub 中的存储库上设置 receive.denyNonFastForwards

    我在 GitHub 上托管了一个存储库 其中有多个分支 如何设置主存储库的配置来设置receive denyNonFastForwards标志 以便主存储库只能接受快进的推送 并且拒绝任何非快进的推送 即使它们是快进的 forced Git
  • C# 登录示例

    我无法隐藏登录表单的主表单 用户登录后关闭登录表单并显示主表单 我一直让自己很困惑 我已经删除了所有代码并重新开始 我可以很好地隐藏登录表单 我无法隐藏调用的主窗体 Application Run new MainForm 登录表单如下所示
  • 处理大量行时,TMemo 速度慢得令人痛苦

    我的 TMemo 中有 100000 行 我想做类似的事情 for i 0 to Memo Lines Count 1 do Memo Lines i SomeTrim Memo Lines i 但速度是每秒0 5行 添加 BeginUpd