Firemonkey的旁门左道[六]
转载:http://blog.csdn.net/qustdong/article/details/9992033
今天还是讲讲和图形有关的事情,这次的难度再增加些,不是直接改源代码了,
而是通过RTTI的方式去让定制我们需要的功能。
从Bitmap的源代码中,我们可以看到FPixelFormat的属性是私有的,也就是我们无法动态的去改变。
明明有十几种PixelFormat形式,又不能去设置,难道又是bug?
通过RTTI,我们可以很实习它的修改。
我们先自己定义一个继承自TBitmap的类,取名为TMyBitmap;
然后设置属性PixelFormat ,get set方法如下:
procedure TMyBitmap.SetPixelFormat(const PixelFormat: TPixelFormat);
var C: TRTTIContext;
T: TRTTIType;
F: TRTTIField;
V: TValue;
begin
C := TRTTIContext.Create;
T := C.GetType(ClassInfo);
if T <> nil then
begin
F := T.GetField('FPixelFormat');
if F <> nil then
F.SetValue(Self, TValue.From<TPixelFormat>(PixelFormat));
end;
C.Free;
end;
function TMyBitmap.GetPixelFormat: TPixelFormat;
var C: TRTTIContext;
T: TRTTIType;
F: TRTTIField;
V: TValue;
begin
Result := pfA8B8G8R8;
C := TRTTIContext.Create;
T := C.GetType(ClassInfo);
if T <> nil then
begin
F := T.GetField('FPixelFormat');
if F <> nil then
begin
V := F.GetValue(Self);
Result := V.AsType<TPixelFormat>;
end;
end;
C.Free;
end;
通过TMyBitmap我们就可以自由控制这个原先不可见的私有属性了。
可见Canvas.BeginScene的时候对PixelFormat进行了一次重置。
Firemonkey的旁门左道[六]的更多相关文章
- Firemonkey的旁门左道[四]
做开发,就是发现问题,解决问题,又发现问题...周而复始的循环 下面又应该是Firemonkey下的bug. 官方文档中描述: Using the FireMonkey TMenuBar's OSMe ...
- Firemonkey的旁门左道[五]
这次讲讲绘制的几种模式吧,不过还是比较浅显,刚接触不久,还实在没这个实力道出个所以来. FMX下,我们可以切换GDI,D2D,GPU这三种模式, 只要通过全局变量就可以轻松搞定. 如何设置 Globa ...
- 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文
阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...
- MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息
MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...
- 【原】AFNetworking源码阅读(六)
[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...
- CRL快速开发框架系列教程六(分布式缓存解决方案)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- [修正] Firemonkey TFrame 存档后,下次载入某些事件连结会消失(但源码还在)
问题:Firemonkey TFrame 存档后,下次载入某些事件连结会消失(但源码还在) 解决:(暂时方法) type TTestFrame = class(TFrame) public const ...
- 【微信小程序开发•系列文章六】生命周期和路由
这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...
- 我的MYSQL学习心得(六) 函数
我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...
随机推荐
- 那天有个小孩跟我说LINQ(八)学会Func
文章已经迁移到:http://www.ayjs.net/2013/08/68/ 文章已经迁移到:http://www.ayjs.net/2013/08/68/ 文章已经迁移到:http://www.a ...
- linux oracle磁盘满了
最近,查看我们一台linux服务器,发现硬盘空间都已经使用了95%,很是疑惑啊,怎么回事那?难道是数据库文件太大了? Filesystem Size Used Avail Us ...
- [转]数据库物化视图刷新SQL命令和查询被delete掉的数据
原文地址:http://blog.csdn.net/wangyong191212/article/details/8024161 刷新物化视图的SQL命令: 在sql语句的命令窗口并输入如下命令: e ...
- C# AttributeUsage的使用浅析
C# AttributeUsage的使用是如何的呢?首先让我们来了解一下什么是AttributeUsage类它是另外一个预定义特性类,AttributeUsage类的作用就是帮助我们控制定制特性的使用 ...
- ACM算法总结及刷题参考
参考:http://bbs.byr.cn/#!article/ACM_ICPC/11777 OJ上的一些水题(可用来练手和增加自信)(poj3299,poj2159,poj2739,poj1083,p ...
- codeforces 720A:Closing ceremony
Description The closing ceremony of Squanch Code Cup is held in the big hall with n × m seats, arran ...
- Rootkit Hunter Sourcecode Learning
目录 . Rootkit Hunter Introduce() . Source Code Frame() . do_system_check_initialisation() . do_system ...
- easyUI框架之学习记录汇总
在添加完之后,可以使用 $.parser.parse();这个方法进行处理:(1) 对整个页面重新渲染: $.parser.parse(); (2) 渲染某个特定的objectvar targetOb ...
- sleep()
经常看到线程中用sleep(),到底是什么用处,下面讲的比较通俗: 我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题: ...
- php验证是否是中文
header("content-type:text/html;charset=utf-8");$str = "编";if (preg_match("/ ...