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
相关产品推荐
相关产品推荐

