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

TMemData中String类型字段被截断至20字符,新手求助原因

TdxMemData字符串字段被截断为20字符的原因及解决方法

原因分析

动态创建ftString类型字段时,若未显式指定长度,Delphi及DevExpress的TdxMemData会默认使用20字符的长度限制——这是VCL中TStringField的默认属性值,因此任何超过20字符的内容都会被自动截断。

解决方案

1. 计算最大长度后显式创建字段

先遍历数据源计算目标字段的最长字符串长度,再创建字段时指定该长度:

procedure PopulateMemData(const Arr: TArray<TGasItem>; var mData: TdxMemData; var Grid: TcxGrid);
var
  I: Integer;
  MaxLenNameLong: Integer;
  CurrentLen: Integer;
begin
  MaxLenNameLong := 0;
  // 遍历数组获取最长字符串长度
  for I := Low(Arr) to High(Arr) do
  begin
    CurrentLen := Length(Arr[I].GetNameLong);
    if CurrentLen > MaxLenNameLong then
      MaxLenNameLong := CurrentLen;
  end;

  // 创建字段时指定长度(需适配CreateField过程支持长度参数)
  CreateField(mData, 'ID', ftInteger);
  CreateField(mData, 'NameShort', ftString);
  CreateField(mData, 'NameLong', ftString, MaxLenNameLong);

  // 若CreateField未适配,可直接创建字段对象
  // with TStringField.Create(mData) do
  // begin
  //   FieldName := 'NameLong';
  //   Size := MaxLenNameLong;
  //   DataSet := mData;
  // end;

  // 填充数据逻辑
  mData.Open;
  for I := Low(Arr) to High(Arr) do
  begin
    mData.Append;
    mData.FieldByName('ID').AsInteger := Arr[I].ID;
    mData.FieldByName('NameShort').AsString := Arr[I].GetNameShort;
    mData.FieldByName('NameLong').AsString := Arr[I].GetNameLong;
    mData.Post;
  end;
end;

2. 改用无长度限制的字段类型

如果需要存储超长文本,可将字段类型改为ftWideString(支持Unicode,无默认长度限制)或ftMemo(适用于多行文本):

CreateField(mData, 'NameLong', ftWideString);
// 或
CreateField(mData, 'NameLong', ftMemo);

验证效果

修改后重新运行代码,原ShowMessage触发逻辑将不再执行,NameLong字段存储的字符串长度会与原数据完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:57:29