可空的标量类型和LiveBindings

时间:2014-12-29 17:04:43

标签: delphi livebindings spring4d

我想使用实时绑定将自定义delphi对象的TObjectList绑定到网格。我希望Nullable支持对象属性,这样如果它们没有值,它们在网格中显示为空白,编辑类似于数据集如何使用可空的db列。

我是否认为Delphi语言不支持可空类型?

TMyObject = class
private
    FQuanitity: Nullable<Integer>;
    FDescription: Nullable<string>;
public
    property Quantity: Nullable<Integer> read FQuanitity write FQuanitity;
    property Description: Nullable<string> read FDescription write FDescription;
end;

FMyObectList: TObjectList<TMyObject>;

我会创建一个TPrototypeBindSource并使用OnCreateAdapeter

绑定FMyObjectList

有人能指出我如何做这样的事情的正确方向吗?感谢

编辑/答案:

Nullable类型的最佳选择是Spring4D,但是没有办法使用Live绑定直接绑定这些值。

1 个答案:

答案 0 :(得分:4)

以下是在LiveBindings引擎中注册Nullable<string>string的类型转换的方式,反之亦然:

procedure RegisterNullableConversions;
begin
  TValueRefConverterFactory.UnRegisterConversion(TypeInfo(Nullable<string>), TypeInfo(string));
  TValueRefConverterFactory.RegisterConversion(TypeInfo(Nullable<string>), TypeInfo(string),
    TConverterDescription.Create(
      procedure(const I: TValue; var O: TValue)
      begin
        if I.AsType<Nullable<string>>.HasValue then
          O := I.AsType<Nullable<string>>.Value
        else
          O := 'null';
      end,
      'NullableToString', 'NullableToString', EmptyStr, True, EmptyStr, nil)
  );
  TValueRefConverterFactory.UnRegisterConversion(TypeInfo(string), TypeInfo(Nullable<string>));
  TValueRefConverterFactory.RegisterConversion(TypeInfo(string), TypeInfo(Nullable<string>),
    TConverterDescription.Create(
      procedure(const I: TValue; var O: TValue)
      begin
        O := TValue.From<Nullable<string>>(I.AsString);
      end,
      'StringToNullable', 'StringToNullable', EmptyStr, True, EmptyStr, nil)
  );
end;