近日,用Delphi编程时,遇到一个莫名其妙的异常:EOutOfResources,这是一个可以重复再现的异常。开始以为是程序中创建的对象太多,导致占用了过多的资源,引起了这个异常。于是在代码中将许多不必要创建的对象统统删减,对代码进行了彻底的大瘦身,谁知竟然毫无效果!
此时才注意到提示中有一句:“EOutOfResources with message 'RichEdit line insertion error'”。这就奇怪了,RichEdit控件中明明才添加了很少的几行文字,怎么会引起EOutOfResources这样的异常呢?
在著名的大富翁论坛上搜索了一下,发现有关于此问题的两个讨论,其中一位仁兄认为初始化时加上这句就行了:
SendMessage(RichEdit1.Handle,WM_USER+53,0,$7FFFFFFF);
这句的意图是为RichEdit1分配指定大小($7FFFFFFF)的空间,看起来不错,但实际试验了一下,不行。很显然,虽然抛出的是EOutOfResources异常,但实际上并非真的资源不足。
也有人认为是DELPHI VCL的BUG。在
procedure TRichEditStrings.Insert(Index: Integer; const S: string);
这个例程中有一句:
if RichEdit.SelStart <> (Selection.cpMax + Length(Str)) then
raise EOutOfResources.Create(sRichEditInsertError); // 这里报错了!!
这位仁兄认为是WINDOWS RTF计算长度的方法与DELPHI不一致造成了这个bug。
很偶然地,我发现RichEdit的这个异常实际上与使用了不恰当的字符集有关。例如:
RichEdit1.SelAttributes.Name := 'Symbol';
RichEdit1.SelAttributes.Charset := SYMBOL_CHARSET;
RichEdit1.Lines.Add(‘这里输入中文字符就出错’);
以上一段代码先指定RichEdit1的字符集为SYMBOL_CHARSET(即“符号”字符集),但随后添加的文本却是由中文字符组成的。Delphi按照SYMBOL_CHARSET字符集计算长度,结果当然与中文字符的长度不同,因为中文字符是双字节字符。此时,RichEdit1就会抛出一个EOutOfResources异常。
再例如,想在RichEdit中加入希腊字母a,写如下语句:
RichEdit1.Lines.Add(‘α’);
其中的α是用输入法的软键盘输入的。这样也会引起EOutOfResources异常。正确的写法应该是:
RichEdit1.SelAttributes.Name := 'Symbol';
RichEdit1.SelAttributes.Charset := SYMBOL_CHARSET;
RichEdit1.Lines.Add(‘a’);
字母a在SYMBOL_CHARSET中就是希腊字母a。
至此,真相大白。原来是不同字符集下计算长度的规则不同引起了这个异常。差点错怪了Borland!不过,其实Borland也不能算太冤,分明是字符集设置不当,却偏要不明不白地抛出个EOutOfResources异常来,帮助文档中也没有提到这个问题,看来Borland可能的确疏忽了些什么。相关推荐
星空组网 vs 蒲公英 vs Tailscale:2024年国内免费异地组网工具横评(含实测数据)
本文对2024年国内主流免费异地组网工具星空组网、蒲公英和Tailscale进行了深度横向评测。基于实测数据,重点分析了三者在P2P成功率、中继延迟、传输速度及稳定性方面的表现,为中小企业、远程办公及个人开发者提供了清晰的选择指南。星空组网在国内网络环境下展现出优秀的平衡性。
EOutOfResources EConvertError is not a valid integer value Unable to insert a line
is not a valid integer value???project Teclaser_Single.exe raised exception class EOutOfResources with message"Unable to insert a line". process stopped. use step or Run to continue.project Teclaser_S...
芯片低功耗设计的两种常用EDA流程
如题。
关于对TBitmap的Canvas操作发生Out of system Resource异常
今天做代码,发现在线程里面操作老是提示“Out of system Resource”错误,代码如下: if ARect.Right - ARect.Left = 0 then FBitmap.Canvas.StretchDraw(FBitmap.Canvas.ClipRect, ABitmap) else FBitmap.Canvas.CopyRe
【GeoDa实用技巧100例】024:geoda计算全局(局部)莫兰指数Moran‘s I,LISA聚类地图,显著性地图
【GeoDa实用技巧100例】024:geoda计算全局(局部)莫兰指数Moran's I,单变量莫兰指数,双变量莫兰指数计算,LISA聚类地图,显著性地图,Geoda双变量莫兰指数是一种强大的地理空间数据分析工具。
【个人学习总结】CRC校验原理及实现
CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。 ..................
Delphi 异常处理
Delphi错误:Stack overflow的解决方法 在编译Delphi程序时,执行一个内存记忆体的时候,提示:Project.exe raised exception class EStackOverflow with message : Stack overflow.这是堆栈溢出错误。原因就是字符串所存储的内容超过DELPHI系统堆栈默认的大小 16*100000 。我们可以改...
ISP 芯片作为独立设备节点的驱动实现要点:多平台结构差异与工程部署策略解析
随着 ISP(Image Signal Processor)从 SoC 集成形态向独立芯片模块演进,在多摄系统、高动态场景、AI 图像前处理等需求下,ISP 作为单独设备节点进行驱动设计已成为主流趋势。尤其在多 SoC 平台(如高通、联发科、展锐、Rockchip)中,不同厂商对 ISP 的抽象方式与驱动接口处理存在显著差异。本文以实际工程为基础,从 Linux 内核下的设备注册流程、media\_entity 配置、VideoDevice 分配、数据 DMA 管理、与 sensor 的流同步控制等关键点展
Delphi 11 canvas does not allow to draw Vcl.Graphics.OutOfResources
把Devart DataSet Manager包勾选去掉。如果同时安装了CnPack和UniDAC,
17、激光切割质量影响因素及优化研究
本文研究了激光切割过程中焦点位置、入射角、激光功率、切割速度和气体压力等因素对切割质量的影响,采用响应面方法(RSM)和Box-Behnken设计,基于三种不同喷嘴对SS 304不锈钢进行实验。通过建立切缝宽度比和条纹深度的回归模型,并结合方差分析验证模型有效性,深入分析各参数对切割质量的影响机制。研究发现喷嘴结构差异显著影响参数作用趋势,尤其在切割速度和气体压力响应上表现明显。最终通过多目标优化确定最小激光功率、适中切割速度和最大气体压力为最优组合,显著提升切割质量,为实际生产提供了理论依据和技术支持。未
用 SemanticObject 把字段变成可点击链接:Fiori Elements Navigation Using a Link 的工程化实践
SAP Fiori elements 通过 Common.SemanticObject 注解可将字段转为可点击链接,实现应用间跳转。当源字段名与目标属性名不一致时,需使用 Common.SemanticObjectMapping 进行映射。该功能依赖 Fiori Launchpad 的目标映射配置,确保正确解析 semantic object + action 并传递参数。常见误区包括未配置目标映射或字段映射错误,需逐一检查语义标注、intent 解析和参数传递链路。
关于跨进程使用回调函数的研究:以跨进程获取Richedit中RTF流为例。
建议先参考我上次写的博文跨进程获取Richedit中Text: 获得QQ聊天输入框中的内容 拿到这个问题,我习惯性地会从VCL内核开始分析。找到TRichEdit声明的单元,分析TRichEdit保存为RTF流的代码。(分析VCL内核代码方便了解Windows标准API的封装和使用) 打开声明TRichEdit的ComCtrls.pas单元。搜索"TRichEditStrings
云原生之容器编排实践-在K8S集群中使用Registry2搭建私有镜像仓库
基于前面搭建的3节点 Kubernetes 集群,今天我们使用 Registry2 搭建私有镜像仓库,这在镜像安全性以及离线环境下运维等方面具有重要意义。作为测试环境,本次使用 Registry2 搭建了私有镜像仓库,实际生产环境建议使用 Harbor;创建了一个 local-storage 的 StorageClass ,并使用本地磁盘的方式创建使用 PV ,实际建议使用 NFS 。
Delphi中的异常处理
转载:http://www.cnblogs.com/doit8791/archive/2012/05/08/2489471.html 以前写Delphi程序一直不注意异常处理,对其异常处理的机制总是一知半解,昨天程序中的一个bug ,让我对异常有了更深入的认识,必须要对可能产生异常的地方进行异常处理,否则可能给程序造成灾难。 就像昨天,因为写的 filecopy 函数没有做异常捕获处理,导致复制文件出错时整个程序崩溃,用户只能通过杀进程的方式重启程序再进行其他操作。后来对程序进行了异常处理,遇到意外时只
Data-Structures-and-Algorithm-Analysis-in-Java.pdf
作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...
华为的C语言编程规范.pdf
华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。
谁想挑战极难问题
有这样一小段的delphi代码: unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.St
数学建模模型总结
这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!
解决RichEdit line insertion error的方法
本文来自:http://blog.youkuaiyun.com/hellogv/ 在RICHEDIT 中使用StringReplace这个字符串替换函数时,很容易就出现"RichEdit line insertion error". 解决的方法: TStrings *tmp=new TStringList;//中间变量,用于暂时保存字符串列表的内容 String Spilth=MemoB-&...
cxRichEdit RichEdit line insertion error 个例解决方法
<br />cxRichEdit 在插入lines的值的时候,报如下错误.<br />RichEdit line insertion error.<br /> <br />我用只是用lines显示一个相关的状态信息的,一行一行的插不了,我用组合成一个字符串,直接赋值给<br />RichEdit .lines.text<br />就是报错了.<br /> <br />组合的方式是:信息1+#13+信息2+#13...............
解决“RichEdit line insertion error”错误
非Unicode版本的Delphi,比如Delphi2007及以下,向TRichEdit内加入诸如“·”、“α”等字符时,会出现“RichEdit line insertion error”错误。 网上有人说使用Try语句跳过,有人提出源码级更深层次的解决办法:http://topic.youkuaiyun.com/t/20050120/15/3741061.html。 我先采用的Try的方法,后
Delphi中edit焦点切换到Richedit 控件上报错:Richedit line insertion error(解决办法)
Delphi----心得04
98-11-1 1:48嘿嘿,今天找到了Windows95的“浏览文件夹”对话框的调用方法。竟然简单得很:用SHBrowseForFolder。同时还找到了另外几个有用的API,SHGetDesktopFolder,SHChangeNotify,SHAddToRecentDocs,SHFileOperation,SHGetFileInfo,SHGetInstanceExplorer等等。98-
1439



被折叠的 条评论
为什么被折叠?



