栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

扩展FMX下TGRID的TPopupColumn

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

扩展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。

效果如下:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1013752.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号