近日,用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. java选择排序详解

    排序算法--选择排序 public class Selector implements ISortAble{ @Override public void sort(int[] a) { int n=a ...

  2. live事件的替代方法on的使用注意事项

    根据jQuery的官方描述,live方法在1.7中已经不建议使用,在1.9中删除了这个方法.并建议在以后的代码中使用on方法来替代. on方法可以接受三个参数:事件名.触发选择器.事件函数. 需要特别 ...

  3. Python金融行业必备工具

    有些国外的平台.社区.博客如果连接无法打开,那说明可能需要"科学"上网 量化交易平台 国内在线量化平台: BigQuant - 你的人工智能量化平台 - 可以无门槛地使用机器学习. ...

  4. 10个经典的Java面试题集合(转载)

    1.Java的HashMap是如何工作的? HashMap是一个针对数据结构的键值,每个键都会有相应的值,关键是识别这样的值. HashMap 基于 hashing 原理,我们通过 put ()和 g ...

  5. sql执行机制

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp38 sql执行机制 1.对于普通的sql语句只有where条件的执行机制 ...

  6. Project 9:两种简单数列排序

    1.冒泡法排序 /* 冒泡排序法的核心思想就是依次把最大的数换到最后面. 若有n个数 就需要通过n-1次循环来排序. 具体做法就是从第一个数开始 两个数比较大小大的换到后面,这样最大的就在最后了. 然 ...

  7. NHibernate教程(12)--延迟加载

    本节内容 引入 延迟加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过前面文章的分析,我们知道了如何使用NHibernate,比如CRUD操作.事务.一对多.多对多映射等问题,这 ...

  8. EmEditor编辑器正则表达式的优点

    (1)^[ \t]*\n这个正则表达式代表所有的空行,指含有零个或零个以上空格或制表符.以换行符结尾.不含其它字符的行.(2)(^|(?<=中国)).*?(?=中国|$)用正则表达式匹配特定字符 ...

  9. SNS团队Beta阶段第三次站立会议(2017.05.24)

    1.立会照片 2.每个人的工作 成员 今天已完成的工作 明天计划完成的工作 罗于婕 辅助完善生词本 辅助完成生词本功能 龚晓婷 辅助开发历史记录功能 辅助完善历史记录功能 林仕庄 开发历史记录功能 完 ...

  10. 团队作业10——beta阶段项目复审

    小组的名字和链接 优点 缺点(bug报告) 最终名次 拖鞋大队 基本功能都实现了,符合用户的需求:每次都能按时完成博客,满足题目要求,所以作业完成的也比较优秀.较alpha版本新增了查重自定义的功能, ...