扩展FMX下TGRID的TPopupColumn

扩展FMX下TGRID的TPopupColumnFMX下的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。

效果如下:

扩展FMX下TGRID的TPopupColumn

今天的文章扩展FMX下TGRID的TPopupColumn分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/28962.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注