You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 10.4 LiveBinding双向绑定TStrings到TMemo回写转换报错

问题根因

这是Delphi RTL中TObjectBindSourceAdapter的已知设计缺陷:当处理类的TStrings类型属性时,适配器在反向绑定(控件到对象)场景下,会丢失属性的实际类型信息,把TStrings属性误识别为TObject类型,导致无法匹配到已注册的string到TStrings转换器。

可行解决方案
  • 方案1:自定义绑定转换器,显式注册string到TObject的转换规则(侵入性最低,无需修改原有业务逻辑)
    在程序初始化阶段注册自定义转换器,判断目标TObject是否为TStrings子类,匹配则执行赋值逻辑:

    uses System.Bindings.Outputs, System.Classes;
    
    procedure RegisterCustomStringToTStringsConverter;
    begin
      TValueRefConverterFactory.RegisterConversion(TypeInfo(string), TypeInfo(TObject),
        procedure(const InValue: TValue; var OutValue: TValue)
        var
          TargetStrings: TStrings;
        begin
          if OutValue.IsObject and (OutValue.AsObject is TStrings) then
          begin
            TargetStrings := TStrings(OutValue.AsObject);
            TargetStrings.Text := InValue.AsString;
          end;
        end
      );
    end;
    

    在工程的Initialization段或者主窗体的OnCreate事件中调用该方法即可生效。

  • 方案2:替换绑定字段类型,绕过TStrings转换逻辑
    给TFoo类新增string类型的linesText属性,直接关联Flines的Text属性:

    // 类定义新增属性
    published
      property linesText: string read GetLinesText write SetLinesText;
    
    // 实现部分
    function TFoo.GetLinesText: string;
    begin
      Result := Flines.Text;
    end;
    
    procedure TFoo.SetLinesText(const Value: string);
    begin
      Flines.Text := Value;
    end;
    

    后续直接将linesText属性和Memo的Text属性做双向绑定即可。

  • 方案3:自定义ObjectBindSourceAdapter,修正类型识别逻辑
    继承TObjectBindSourceAdapter<TFoo>,重写字段类型信息的获取逻辑,强制将lines字段的类型指定为TypeInfo(TStrings),适配原有绑定规则。

注意事项
  • 你之前修改的setter中使用Assign赋值是正确的,需要保留,避免TStrings实例被意外替换导致内存泄漏
  • 如果同时存在多个TStrings类型属性的绑定需求,优先选择方案1,无需逐个修改业务类

内容的提问来源于stack exchange,提问作者Yandros

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:39:05