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图

unit Unit1;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
System.Rtti, FMX.Grid, FMX.Layouts; type
TForm1 = class(TForm)
Grid1: TGrid;
StringColumn1: TStringColumn;
ImageColumn1: TImageColumn;
procedure Grid1GetValue(Sender: TObject; const Col, Row: Integer;
var Value: TValue);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FBmps: array[..] of TBitmap;
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
nRS: TResourceStream;
begin
{先把资源文件都加载出来}
for i := Low(FBmps) to High(FBmps) do
begin
FBmps[i] := TBitmap.Create;
nRS := TResourceStream.Create(HInstance, pchar('PngImage_' + Inttostr(i + )), RT_RCDATA);
FBmps[i].LoadFromStream(nRS);
nRS.Free;
end;
TGrid
end; procedure TForm1.FormDestroy(Sender: TObject);
var
i: Integer;
begin
for i := Low(FBmps) to High(FBmps) do
FreeAndNil(FBmps[i]);
end; procedure TForm1.Grid1GetValue(Sender: TObject; const Col, Row: Integer;
var Value: TValue);
begin
if Col = then
Value := Row
else if Col = then
begin
Value := FBmps[Row mod ];
end;
end; end.

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

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

procedure TImageControl.SetData(const Value: TValue);
begin
if Value.IsEmpty then
Bitmap.SetSize(0, 0)
else if (Value.IsObject) and (Value.AsObject is TPersistent) then
Bitmap.Assign(TPersistent(Value.AsObject))
else
Bitmap.LoadFromFile(Value.ToString)
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. org.apache.log4j与org.apache.commons.logging这两个包有什么区别

    apache common logging是一种log的框架接口,它本身并不实现log记录的功能,而是在运行时动态查找目前存在的日志库,调用相关的日志函数,从而隐藏具体的日志实现log4j是具体的日志 ...

  2. ViewPager左右滑动

    布局: <android.support.v4.view.ViewPager android:id="@+id/viewpager_main" android:layout_ ...

  3. CDH中flume是已经启动着了…

    文章来自:http://www.cnblogs.com/hark0623/p/4174646.html   转发请注明 在CDH中用了几天flume后才发现,原来CDH中的flume默认是启动的……… ...

  4. 游戏控制杆OUYA游戏开发快速入门教程

    游戏控制杆OUYA游戏开发快速入门教程 1.2.2  游戏控制杆 游戏控制杆各个角度的视图,如图1-4所示,它的硬件规格是本文选自OUYA游戏开发快速入门教程大学霸: 图1-4  游戏控制杆各个角度的 ...

  5. POJ2047 Concert Hall Scheduling(最小费用最大流)

    题目大概是有两个音乐厅,有n个乐队申请音乐厅,他们必须从第ii天到第ji天连续开音乐会且他们的开价是wi,每天每个音乐厅都只能供一个乐队进行音乐会.问接受哪些乐队的申请,获利最多能多少. 这题相当于在 ...

  6. C#中DataTable使用技巧

    在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTable简 ...

  7. 【wikioi】1295 N皇后问题

    题目链接 算法:DFS 刚开始卡了我一下,我竟然傻到用二维来放皇后= =.导致一直TLE.... 其实用1维就行了的,下标为行(列),值为列(行) 我是用下标为列做的. 上代码 #include &l ...

  8. POJ 1625 Censored!(大数+DP)

    题目链接 这题,真心木啥意思,就是数据里貌似字符有负数,注意gets读入.. #include <iostream> #include <cstring> #include & ...

  9. Linux命令总结_文件查找之grep

    1.grep命令 grep一般格式为:grep [选项]基本正则表达式[文件]这里基本正则表达式可为字符串,字符串或变量应该用双引号,模式匹配用单引号 选项: -c  只输出匹配行的计数 -i  不区 ...

  10. CSS3时钟式进度条

    CSS3时钟式进度条,加载完成时生成一个圆,数字慢慢变成100,适时的显示加载进度.友情提醒,如果预览时网页左下角提示错误,刷新一下就可以看到效果了:实际使用中不会出现这样的问题. <!DOCT ...