扩展FMX下TGRID的TPopupColumn

        对于枚举类型,保存到数据库时,一般采用整型类型,保存枚举值的序号(这样比较灵活,可以自定义枚举类型的显示名称。如果保存为字符串类型,万一想改个名称,麻烦)。

        用GRID显示枚举字段时,VCL好多第三方的GRID控件,可以方便显示。但是在FMX下,第三方GRID控件比较少(TMS的FMXGRID不好用,TEEGRID的还可以,但是找不到。。。)。用自带的GRID/STRINGGRID控件,TLinkGridToDataSource自动绑定时,只能是显示为数据字段,没有TPopupColumn的选择。只好TBindGridLink手动绑定,使枚举字段绑定到TPopupColumn列,但是,这样GRID的显示是数字,虽然TPopupColumn的Items是字符串名称,这样太丑陋了,客户也不能接受。

        经过几天的折腾,在盒子上也请教了大神,但是也没有满意的结果。

        原来只纠结于GRID的绑定表达式和列的编辑器(Editor),怎么也不行。看源码的时候,突然想到其它类型的列(Boolean, TDateTime等),是怎么显示数据的。原来,TPopupColumn是采用默认的显示(TColumn的显示处理,只是TValue.ToString)。看来要扩展TPopupColumn,这个比较简单,只要处理ValueToString()这个方法,从数据库来的整型数字Data,转成Items[Data],就是枚举值序号就变成了对应的字符串名称。

        至于下拉框项选择后,怎么有转换成数字,这个是列的编辑器负责的,就是TPopupCell,这个是内部类,我们访问不了。但是这个系统带的编辑器,倒是带了转换功能,我们选择的下拉框项,自动取选择项的序号作为值(这个编辑器是根据初始值来判断是用字符串还是用字符串对应的序号来作为值保存)

        哎。。。

unit JkSoft.FMX.GridPopupColumn;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  System.Rtti,
  FMX.Types, FMX.Controls, FMX.Objects, FMX.Grid;

type
  TPopupColumnEx = class(TPopupColumn)
  private
    FUseAlias: Boolean;
    procedure SetUseAlias(const Value: Boolean);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    function ValueToString(const Value: TValue): string; override;
  published
    property UseAlias: Boolean read FUseAlias write SetUseAlias default True;
    property Items;
  end;

implementation

{ TPopupColumnEx }

constructor TPopupColumnEx.Create(AOwner: TComponent);
begin
  inherited;
  FUseAlias := True;
end;

destructor TPopupColumnEx.Destroy;
begin
  //
  inherited;
end;

procedure TPopupColumnEx.SetUseAlias(const Value: Boolean);
begin
  FUseAlias := Value;
end;

function TPopupColumnEx.ValueToString(const Value: TValue): string;
var
  LIndex: Integer;
begin
  Result := string.Empty;
  LIndex := -1;
  if FUseAlias and (Value.Kind in [tkInteger, tkInt64]) then
  begin
    LIndex := Value.AsInteger;
    if (Items.Count > 0) and (LIndex >= 0) and (LIndex < Items.Count) then
    begin
      Result := Items[LIndex];
    end;
  end;
  if ValueIsEmpty(Result) then
    Result := inherited ValueToString(Value);
end;

initialization

  TColumnClasses.Register([TPopupColumnEx]);

finalization

  TColumnClasses.Unregister([TPopupColumnEx]);

end.

如果要设计时可用,就打包为bpl。

效果如下:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先说下控件功能如下: 1,可以设置固定行 和固定列.固定行和列是任何时候不许编辑的,但是可以代码修改设置 2,可以设置背景色(包括固定好和表格内部背景色,非固定单元格背景只对新建单元格有效) 3,可以合并单元格(横向竖向均可合并,支持横竖同时合并单元格效果) 4,边框线宽度可以设置(外边框线,内边框线可以分开设置) 5,边框颜色可以设置(内外线色可以设置不同颜色) 6,可以设置编辑状态(此属性是新建单元格属性,只对新建单元格生效) 7,只读属性(针对所有非固定单元格) 8,随时可以设置行数和列数(减少的话,末尾待减少储存数据会丢失) 9,增加是否立即刷新参数,可以在大量输入录入时快速执行 下面是单元格单独属性设置介绍 1,可以储存字符串 2,可以储存整数 3,可以储存文本(默认单元格内显示[DEMO],可以编辑实际内容或读取实际内容) 4,可以储存字符串列表(可以设置读取选择字符串) 5,可以储存日期(格式2018-07-06) 6,可以储存时间(格式10:26:32,设置智能设置到时分,直接赋值可以包含更精确单位) 7,可以设置日期(格式包含以上格式,设置同上.直接赋值可以保存更精确单位) 8,可以储存颜色(显示以保存颜色显示) 9,单元格字体,所有字体设置均支持(包含颜色,字体,换行,对齐等属性) 10,背景可以单独设置 10,可以单独设置是否允许编辑 详细使用请看使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值