转载: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的旁门左道[六]的更多相关文章

  1. Firemonkey的旁门左道[四]

    做开发,就是发现问题,解决问题,又发现问题...周而复始的循环 下面又应该是Firemonkey下的bug. 官方文档中描述: Using the FireMonkey TMenuBar's OSMe ...

  2. Firemonkey的旁门左道[五]

    这次讲讲绘制的几种模式吧,不过还是比较浅显,刚接触不久,还实在没这个实力道出个所以来. FMX下,我们可以切换GDI,D2D,GPU这三种模式, 只要通过全局变量就可以轻松搞定. 如何设置 Globa ...

  3. 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文

    阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...

  4. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

  5. 【原】AFNetworking源码阅读(六)

    [原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...

  6. CRL快速开发框架系列教程六(分布式缓存解决方案)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  7. [修正] Firemonkey TFrame 存档后,下次载入某些事件连结会消失(但源码还在)

    问题:Firemonkey TFrame 存档后,下次载入某些事件连结会消失(但源码还在) 解决:(暂时方法) type TTestFrame = class(TFrame) public const ...

  8. 【微信小程序开发•系列文章六】生命周期和路由

    这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...

  9. 我的MYSQL学习心得(六) 函数

    我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

随机推荐

  1. 那天有个小孩跟我说LINQ(八)学会Func

    文章已经迁移到:http://www.ayjs.net/2013/08/68/ 文章已经迁移到:http://www.ayjs.net/2013/08/68/ 文章已经迁移到:http://www.a ...

  2. linux oracle磁盘满了

    最近,查看我们一台linux服务器,发现硬盘空间都已经使用了95%,很是疑惑啊,怎么回事那?难道是数据库文件太大了? Filesystem            Size  Used Avail Us ...

  3. [转]数据库物化视图刷新SQL命令和查询被delete掉的数据

    原文地址:http://blog.csdn.net/wangyong191212/article/details/8024161 刷新物化视图的SQL命令: 在sql语句的命令窗口并输入如下命令: e ...

  4. C# AttributeUsage的使用浅析

    C# AttributeUsage的使用是如何的呢?首先让我们来了解一下什么是AttributeUsage类它是另外一个预定义特性类,AttributeUsage类的作用就是帮助我们控制定制特性的使用 ...

  5. ACM算法总结及刷题参考

    参考:http://bbs.byr.cn/#!article/ACM_ICPC/11777 OJ上的一些水题(可用来练手和增加自信)(poj3299,poj2159,poj2739,poj1083,p ...

  6. codeforces 720A:Closing ceremony

    Description The closing ceremony of Squanch Code Cup is held in the big hall with n × m seats, arran ...

  7. Rootkit Hunter Sourcecode Learning

    目录 . Rootkit Hunter Introduce() . Source Code Frame() . do_system_check_initialisation() . do_system ...

  8. easyUI框架之学习记录汇总

    在添加完之后,可以使用 $.parser.parse();这个方法进行处理:(1) 对整个页面重新渲染: $.parser.parse(); (2) 渲染某个特定的objectvar targetOb ...

  9. sleep()

    经常看到线程中用sleep(),到底是什么用处,下面讲的比较通俗: 我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题: ...

  10. php验证是否是中文

    header("content-type:text/html;charset=utf-8");$str = "编";if (preg_match("/ ...