FireMonkey跨平台的GIF解决方案

用FireMonkey的同学们一定知道FireMonkey对GIF动画的支持不是太好,只有静态的。

网上已有的解决方案就是先手动预处理GIF文件分割成多个单张,然后放到BitmapList中,缺点是要手动处理,而且帧速率也麻烦。因为项目中要实现了一个GIF的格式处理,代码整理了一下,嫁接到FireMonkey中,给广大兄弟们使用。

主要是就实现一个GIF格式的Reader,把GIF每一帧解析出来变成TBitmap,帧速率读出来,按照指定的帧速率播放。

之前用GDIPlus写了一份,但是有两个原因促使我自己重头写。

1)GDIPlus不能跨平台只支持Windows,

2)效率偏低。也用[……]

继续阅读

发表在 Delphi | 标签为 , , , , | 4条评论

VC版本的MakeObjectInstance把WNDPROC映射到类的成员函数

这段时间用VC封装Windows类库,没有MakeObjectInstance处理窗口消息确实不爽,又不想使用MFC的消息映射,这玩意的效率和美观只能呵呵。

至于MakeObjectInstance是什么,Delphi转过来的同学必然很了解这个方便的功能,就是动态构造一个函数把普通函数转到一个类的成员函数。

VC X86实现起来没问题,但是X64实现起来的麻烦在于不能内嵌汇编了,X64必须结合ASM文件编译的obj(这一点还是感激Delphi的编译器,X86和X64都可以内联汇编)。

我的实现方案是通过构造一段ShellCode来达到目的。

用法类似的如下

再例如

&n[……]

继续阅读

发表在 CPP | VC版本的MakeObjectInstance把WNDPROC映射到类的成员函数已关闭评论

Cocos2d-x程序Windows下VC中文乱码的解决

Cocos2d-x默认字符串常量编码都是UTF8的,而Windows中的VC默认都是跟系统相同,比如简体Windows是GB2312或者GBK.繁体就是BIG5编码.
而我们大多数中国人用VC编译出来的字符串常量也就是GBK编码的字符串.
在Cocos2d-x界面上绘制的时候它是不知道的,只会认为这个是UTF8字符串,结果就出现了乱码.
解决方式也很简单.找个头文件加入下面的代码

需要用到中文字符串的时候

补充,在这篇博客发表后两天发现有更直接的方法.

这样VC编译器就会把字符串常量按UTF8编码.[……]

继续阅读

发表在 cocos2d-x, CPP, 未分类 | Cocos2d-x程序Windows下VC中文乱码的解决已关闭评论

Delphi结构体的扩展,可以自动初始化,反初始化,自定义拷贝函数.

恭贺Delphi XE7诞生,Delphi XE7在编译器内部集成了我之前所实现的动态数组扩展.http://www.raysoftware.cn/?p=278
现在有一个更悠久的历史需求,在QC的Delphi板块上置顶了好多年.官方一直没有实现.
http://qc.embarcadero.com/wc/qcmain.aspx?d=21729
众所周知Delphi的record和CPP的struct是有区别的.CPP的struct可以看成是class的别名,可以有构造,析构,可以继承.

Delphi的record几年前开始支持方法,支持操作符重载,美中不足之处在于不能自己写默认构造函数.D[……]

继续阅读

发表在 Delphi, 未分类 | 标签为 , , , | 121条评论

HTML解析器更新

增加了兼容性.
对于非标准的HTML做法,Tag中的符号没有转义做了兼容.
HtmlParser
或者
http://code.google.com/p/delphi-html-parser/[……]

继续阅读

发表在 Delphi, 未分类 | 188条评论

共享一个之前封装的多进程共享内存的MemoryStream

具体用处呢,有很多,比如多进程浏览器共享Cookie啦,多个进程传送点数据啦.[……]

继续阅读

发表在 Delphi | 标签为 , , | 190条评论

Delphi读取Android设备联系人.DelphiXE6中编译通过

和某牛讨论Delphi读Android联系人.写了如下代码

我是个懒人,不想再深究了.
对了,别忘了Android有权限,加上读取联系人的权限[……]

继续阅读

发表在 Delphi, 未分类 | 标签为 , , , | 155条评论

Delphi Hook Library做了一点小更新

http://www.raysoftware.cn/?p=357

1.原来的HOOK库,当遇到函数先被别人HOOK了,会无视对方的钩子,造成函数出问题.
现在加入了处理,如果想要HOOK的函数先被别人HOOK了,那么就去HOOK对方的函数.
但是要记得UnHOOK的时候也最好在对方去掉HOOK之前做.

2.原来的Hook库代码是通过返回值返回原始函数地址的,导致HOOK函数内部使用的虚拟内存和线程状态设置函数不能被HOOK.现在修正了.具体请看新增的函数声明

最新代码请到谷歌代码上去拉取

http://code.google.com/p/delphi-hook-library/[……]

继续阅读

发表在 Delphi | 176条评论

Delphi循环移位操作

如果在X86计算机上很简单,直接内嵌汇编ror和rol指令就是循环移位.
但是如果在Android的平台上,asm关键字是无效的.
只能自己实现.

function ror(const Value: DWORD; ShiftValue: Byte): DWORD; overload;
begin
Result := (Value shl (8 * SizeOf(Value) – ShiftValue)) or
(Value Shr ShiftValue);
end;

function ror(const Value: WORD; ShiftValue: Byte): DWORD[……]

继续阅读

发表在 Delphi, 未分类 | 154条评论

Delphi XE5开发Android程序使用自定义字体文件.

最近在做一个电子书阅读器的Android小程序来验证Delphi XE5的移动开发功能.
万事大吉,只欠根据字体文件(.ttf文件)切换阅读字体,通常Android系统只带三种以下字体.一般用Java/Eclipse开发的话比较简单,typeface的createFromAsset,createFromFile之类的很容易使用.
但是由于FireMonkey是跨平台的类库,必然不能和平台帮得太紧,所以提供了抽象的封装.
但是也许Delphi XE5是Android平台的第一个版本,有些地方难免有疏漏,FireMonkey的封装没有提供更换字体的功能.

但是我要实现的电子书阅读器换字体几乎是必[……]

继续阅读

发表在 Delphi, 未分类 | 标签为 , , , , | 171条评论