近日,用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可能的确疏忽了些什么。

EOutOfResources字符异常的更多相关文章

  1. ubuntu中vi下删除键和上下左右键输入字符异常(ABCD)

    刚安装的Ubuntu系统,使用vi编辑文本的时候, 出现以下现象: 点删除键输入了 D 回车无效 上下左右为字母 光标乱跳 原因: 自带的vi功能问题 解决: 卸载原有vi,重新安装完整版本vim 执 ...

  2. 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 wi ...

  3. javadoc时候乱码-编码 GBK 的不可映射字符 - wqjsir的专栏 - 博客频道 - CSDN.NET

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  4. 向Oracle中传入数组,批量执行SQL语句

    1.首先用PL/SQL创建package create or replace package excuteBatchOperate as type sqlStr_Array ) index by bi ...

  5. WCF消息压缩

    对于WCF应用来说,传输前压缩请求消息和回复消息,不但可以降低网络流量,也可以提高网络传输的性能 一.消息压缩方案 二.用于数据压缩与解压缩组件 三.用于消息压缩与解压的组件 四.用于对请求/回复消息 ...

  6. [Python Study Notes]Socket模拟ssh执行cmd并记录遇到的问题

    服务器端: 流程: 1.创建servert实例 2.绑定地址和端口 3.开始监听 4.创建客户端连接实例 5.等待客户端的消息 6.......... # The_author = 'liu66' # ...

  7. PEP8中文翻译(转)

    原文:https://github.com/zgia/manual PEP 8 -- Style Guide for Python Code PEP Index > PEP 8 -- Style ...

  8. C# 操作文件类,文件夹存在判断,创建,文件内容读写。

    此篇文档是老早就放到草稿箱中了,断断续续编辑了几次.结合自己经常用到的对于文件的操作,结合msdn做此文. 1.File 类 --转自msdn 常用方法: 名称 说明 AppendAllLines(S ...

  9. Django中通过定时任务触发页面静态化的方式

    安装 pip install django-crontab 添加应用 INSTALLED_APPS = [ ... 'django_crontab', # 定时任务 ... ] 设置任务的定时时间 在 ...

随机推荐

  1. BestCoder Round #34_1002 以及 hdu 5191

    枚举最终的W堆积木在哪,确定了区间,那么就需要把高于H的拿走,低于H的补上,高处的积木放到矮的上面,这样最优. 注意多出来的积木可以放在已有积木的前面或者后面,独立成一堆积木,所以需要在n堆积木的前后 ...

  2. mysql事件机制——定时任务

    定时任务是老生常谈了,因为我们总是需要定时修改特定的数据. 实现它的方法肯定不止一种,但我在相当长一段时间里都是用程序编码去做的,今天突然想到“为什么一定要采用调用的方式?”,用数据库自身的能力去实现 ...

  3. ios 初体验<窗口的创建>

    1. 创建工程,这步很简单,百度下即可,在info.plist 里面 去掉 Main 的 ,便于新手练习ios,创建ios工程后,在AppDelegate.m,里面的方法application 加上几 ...

  4. nginx小问题

    配置nginx与ftp图片服务器:安装后,要在/usr/local/nginx/conf/nginx.conf里面的server中(带有localhost的那一块)修改为location \ {roo ...

  5. KVM虚拟化主机安装

    KVM虚拟化主机安装 最小化安装CentOS6.X或者CentOS7.X,RHEL6.X以上系列建议建议选择安装最小虚拟化主机 如果要安装桌面可以先选择最小化虚拟主机,再选择Gnome桌面包 安装过程 ...

  6. 201521123102 《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 在实验中,Sc ...

  7. 201521123074 《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  8. 201521123085《Java程序设计》第4周学习总结

    1.本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 2.书面作业 Q1.注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) Q2.面向对 ...

  9. MD格式示例

    一个例子: 例子开始 1. 本章学习总结 今天主要学习了三个知识点 封装 继承 多态 2. 书面作业 Q1. java HelloWorld命令中,HelloWorld这个参数是什么含义? 今天学了一 ...

  10. phpcms图文总结(转)

    转自:http://www.cnblogs.com/Braveliu/p/5074930.html 在实现PHPCMS网站过程中,根据业务需求,我们遇到很多问题,特此总结如下,以便大家参考学习. [1 ...