我发现(很难)如果一个文件有一个有效的UTF-8 BOM但包含任何无效的UTF8编码,并且被任何Delphi(2009+)编码启用的方法读取LoadFromFile,那么结果就是完全空文件,没有错误指示.在我的几个应用程序中,我宁愿丢失一些不良编码,即使在这种情况下我也没有得到任何错误报告.
调试显示MultiByteToWideChar调用两次,首先获取输出缓冲区大小,然后进行转换.但是TEncoding.UTF8包含FMBToWCharFlags这些调用的私有值,并使用MB_ERR_INVALID_CHARS值初始化.因此,获取charcount的调用返回0并且加载的文件完全为空.在没有标志的情况下调用此API将"默默地删除非法代码点".
我的问题是如何最好地编织Encoding区域中的类的嵌套来解决这个私有值的事实(并且需要,因为它是所有线程的类var).我想我可以使用Marco Cantu的Delphi 2009书中的指南添加自定义UTF8编码.并且如果MultiByteToWideChar在没有标志的情况下再次调用它之后返回编码错误,它可以选择性地引发异常.但这并没有解决如何使用我的自定义编码而不是Tencoding.UTF8.
如果我可以在初始化时将其设置为应用程序的默认设置,也许通过实际修改类var for Tencoding.UFT8,这可能就足够了.
当然,我需要一个解决方案,而不是等待提交质量控制报告,要求更强大的设计,接受它,并看到它改变.
任何想法都会非常受欢迎.并且有人可以确认这仍然是XE4的一个问题,我还没有安装?
在Delphi XE程序中搜索高度间歇性的内存损坏时,我找到了一个类构造函数,它初始化类中的几个字段,然后调用inherited.我相信初始化是在构造函数首次编写后添加的,并且意外地在错误的位置.我现在已经纠正它,先调用继承.内存损坏的例外几乎总是发生在这个类的方法中.
问题:这个错误是否可能导致间歇性内存损坏?在跟踪代码时,似乎没有,但我真的希望这个解决方案可以解决间歇性问题.在解决问题后一段时间内没有发生这种情况并不能证明它已经消失了.
一些代码:
Tmyclass = class
ctype : integer;
ts : tstringlist;
th : thandle;
public
Constructor Create;
Destructor Destroy; override;
...
end;
Constructor Tmyclass.Create;
begin
ctype := 3;
doinit;
inherited;
end;
Run Code Online (Sandbox Code Playgroud) 在Delphi 2010 VCL应用程序的默认右键单击弹出菜单底部插入Unicode,从右到左和IME项的人或者是什么?我想在不太可能需要的用户环境中删除它们,而无需为每个编辑和备忘录定义自定义弹出菜单.大多数时候只有复制,剪切,粘贴和选择都是合适的.
我稍微修改了Delphi Seattle提供的一种VCL样式,并使用不同的.vcf名称保存它.我无法找到一种方法将我的样式添加到IDE中"外观"下的菜单中,以便我可以轻松地为项目选择它.可用样式被分组为Embarcadero样式这一事实意味着将支持创建另一个组.
将其放在与其他文件夹相同的文件夹中不会使其显示在列表中.