FireMoneky的TStringGrid用法和VCL里面的差不多, 但是另一个TGrid实在是奇葩, 几乎找不到给单元格赋值的方法(除了使用LiveBind)

看了其源码, 发现只要给某个Column.Cell.Value赋值就可以了, 但是不知道为什么 TColumn里的GetCells和SetCells这2个方法居然没有公开出来, 导致在TGrid里没有一个方法能够像StringGrid一样给某个单元格直接赋值

继续查看源码, 发现TGrid有2个事件: OnGetValue, OnSetValue

于是联想了一下VCL里ListView的OwnerData模式, 所以写了下面一堆代码, 勉强算是能正常使用TGrid了


以下为我的测试代码:

首先在Project->Resources and Images里添加一些资源文件, 我的测试程序里添加了11个png图

  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  7. FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
  8. System.Rtti, FMX.Grid, FMX.Layouts;
  9.  
  10. type
  11. TForm1 = class(TForm)
  12. Grid1: TGrid;
  13. StringColumn1: TStringColumn;
  14. ImageColumn1: TImageColumn;
  15. procedure Grid1GetValue(Sender: TObject; const Col, Row: Integer;
  16. var Value: TValue);
  17. procedure FormCreate(Sender: TObject);
  18. procedure FormDestroy(Sender: TObject);
  19. private
  20. { Private declarations }
  21. FBmps: array[..] of TBitmap;
  22. public
  23. { Public declarations }
  24. end;
  25.  
  26. var
  27. Form1: TForm1;
  28.  
  29. implementation
  30.  
  31. {$R *.fmx}
  32.  
  33. procedure TForm1.FormCreate(Sender: TObject);
  34. var
  35. i: Integer;
  36. nRS: TResourceStream;
  37. begin
  38. {先把资源文件都加载出来}
  39. for i := Low(FBmps) to High(FBmps) do
  40. begin
  41. FBmps[i] := TBitmap.Create;
  42. nRS := TResourceStream.Create(HInstance, pchar('PngImage_' + Inttostr(i + )), RT_RCDATA);
  43. FBmps[i].LoadFromStream(nRS);
  44. nRS.Free;
  45. end;
  46. TGrid
  47. end;
  48.  
  49. procedure TForm1.FormDestroy(Sender: TObject);
  50. var
  51. i: Integer;
  52. begin
  53. for i := Low(FBmps) to High(FBmps) do
  54. FreeAndNil(FBmps[i]);
  55. end;
  56.  
  57. procedure TForm1.Grid1GetValue(Sender: TObject; const Col, Row: Integer;
  58. var Value: TValue);
  59. begin
  60. if Col = then
  61. Value := Row
  62. else if Col = then
  63. begin
  64. Value := FBmps[Row mod ];
  65. end;
  66. end;
  67.  
  68. end.

虽然说这样可以用, 但是我写的测试代码实际运行效果特别的卡, 估计是因为100个image列导致的, 吧TImageColumn的赋值去掉以后就非常流畅了

究其原因, 看代码跟踪到TImageControl.SetData函数:

  1. procedure TImageControl.SetData(const Value: TValue);
  2. begin
  3. if Value.IsEmpty then
  4. Bitmap.SetSize(0, 0)
  5. else if (Value.IsObject) and (Value.AsObject is TPersistent) then
  6. Bitmap.Assign(TPersistent(Value.AsObject))
  7. else
  8. Bitmap.LoadFromFile(Value.ToString)
  9. end;

发现实际运行时, Grid的OnGetValue事件被触发, 给Value赋值, 然后调用TImageControl.SetData函数

最终会执行这句: Bitmap.Assign(TPersistent(Value.AsObject))

也就是说, 每次OnGetData一个图像列, 都要经历一次图像复制.....难怪卡的厉害

个人猜测还是因为当前使用的不是正统赋值方法, 但是看代码, 又没什么public方法可以使用....纠结啊

关于FireMonkey TGrid赋值的一点小研究的更多相关文章

  1. 关于C#中readonly的一点小研究

    可能园子里有不少文章已经说明了这个问题了,但是我在这里写这篇博客只是写写自己的一些体会,也权当是整理归纳,高手莫见笑. ===============正文分割线================== 现 ...

  2. 关于 const 的一点小研究

    在饱受 var 的折磨之后,ES6 终于推出了新的定义变量的方法:let 和 const 和 var 相比,let 和 const 有了自己的作用域,let 用于定义变量,而 const 用于定义常量 ...

  3. 关于win8开发的一点小总结

    我今天做画面的时候,发现了一点小问题. 我在xmal文件里面加了一个CheckBox控件,设置IsChecked属性为True,并添加了Checked事件.Checked事件里面有对另外一个TextB ...

  4. 关于PHP魔术方法__call的一点小发现

    好久没有上博客园写文章了,今晚终于有点空了,就来写一下昨天的一点小发现. 我自己所知,C++,Java的面向对象都有多态的特点,而PHP没有,但PHP可以通过继承链方法的重写来实现多态的属性.而魔术方 ...

  5. net core体系-web应用程序-4net core2.0大白话带你入门-8asp.net core 内置DI容器(DependencyInjection,控制翻转)的一点小理解

    asp.net core 内置DI容器的一点小理解   DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IO ...

  6. C与C++在形參的一点小差别

    先看一下以下的代码: int fun(a,b) int a; int b; { return 10; } void main(int argc, char ** argv) { fun(10); re ...

  7. BUI Webapp用于项目中的一点小心得

    接触BUI也有一段时间,也用在了移动端的项目开发中,总的来说,该框架用起来也挺灵活的,控件可以自由定制,前提是自己能认真地学习该框架的api,因为api里面说的东西比较详细,如果没有仔细看的,可能有些 ...

  8. JavaScript绝句的小研究

    前几日在网上看到一篇文章:JavaScript绝句,看了以后觉得里面的代码颇为有趣,不过文章里面只是简单的说了这样写的目的和结果,却没有令读者起到既知其然,又知其所以然的效果.这里简单写一篇小文章剖析 ...

  9. 信号处理——EMD、VMD的一点小思考

    作者:桂. 时间:2017-03-06  20:57:22 链接:http://www.cnblogs.com/xingshansi/p/6511916.html 前言 本文为Hilbert变换一篇的 ...

随机推荐

  1. 一个自动生成插入与更新SQL语句的小类

    无需关注字段类型,只要传入字段名与值的集合,自动生成Ms sql server SQL语句.详见Test()方法 using System; namespace Fan.iData.SqlUtilit ...

  2. libyuv 编译 for android

    libyuv is an open source project that includes is an instrumentation framework for building dynamic ...

  3. HTML head 头标签

    HTML head 头部分的标签.元素有很多,涉及到浏览器对网页的渲染,SEO 等等,而各个浏览器内核以及各个国内浏览器厂商都有些自己的标签元素,这就造成了很多差异性.移动互联网时代,head 头部结 ...

  4. COJ883 工艺品

    试题描述 LZJ和XJR是一对好朋友. 他们现在要做一个由方块构成的长条工艺品.但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工艺品最左边的方块放到最右边. 他们想,在仅这一个操作下,最漂 ...

  5. Jquery_JQuery之DataTables强大的表格解决方案

    1.DataTables的默认配置 $(document).ready(function() { $(‘#example’).dataTable(); } ); 示例:http://www.guoxk ...

  6. 遍历josn的三种方式

    第一种:使用for循环 js代码: function CyclingJson1() { var testJson = '[{ "name": "小强", &qu ...

  7. Swift -- 官方文档Swift-Guides的学习笔记

    在经历的一段时间的郁闷之后,我发现感情都是虚伪的,只有代码是真实的(呸) 因为看了swift语法之后依然不会用swift,然后我非常作死的跑去看官方文档,就是xcode里自带的help>docu ...

  8. CentOS网卡配置文件

    [root@xaiofan ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0TYPE=EthernetONBOOT=yesNM ...

  9. 一、saltstack简介和安装

    系统环境:CentOS6.5 准备yum源: epel源(包含了saltstack的包).阿里源(CentOS-Base.repo) Host解析文件: # cat /etc/hosts 192.16 ...

  10. WampServer搭建php环境时出现的哪些问题?

    WampServer搭建php环境时遇到的问题 安装时报错,缺少MSVCR100.dll文件 这是因为wampServer安装时用到的vc库没有更新,要安装更新之后再进行安装,因为之前安装的VC版本低 ...