Delphi 如何从带多分隔符的字符串中提取指定属性对应的值
原始属性字符串示例:
;EncoderMin:250;EncoderMax:5755;MinPixel:-240;MaxPixel:980;
问题原因
你当前代码不生效的核心是:TStringList的Values属性默认使用=作为键值对分隔符,而你的数据中键和值用:分隔,所以无法直接匹配到对应属性值。
修正后的代码实现
function TFrameLayout3DSTD.GetAttributiSTD(ALoc: Integer;AField: String; AVarType: Word): Variant; var Q: TADOQuery; LLista : TStringList; begin Result := null; Q := DMConn.GetQuery( 'select AttributiSTD from Locazioni3D where idLocazione = %d', [ALoc]); try Q.Open; if Q.IsEmpty then Exit; // 空数据提前退出避免异常 LLista := TStringList.Create; try LLista.Delimiter := ';'; LLista.StrictDelimiter := True; LLista.NameValueSeparator := ':'; // 新增:指定键值分隔符为冒号 LLista.DelimitedText := Q.Fields[0].AsString; // 存在对应属性则返回数值,不存在返回Null if LLista.IndexOfName(AField) > -1 then Result := StrToFloatDef(LLista.Values[AField], Null); finally LLista.Free; end; finally Q.Free; end; end;
调整说明
- 新增
NameValueSeparator属性配置,适配你数据中冒号分隔键值的格式,Values属性就可以正常匹配属性名 - 增加空查询结果判断,避免无数据时的无效操作
- 增加了数值转换逻辑,返回的是数值类型而非字符串,如果你需要返回原始字符串直接赋值
Result := LLista.Values[AField]即可 - 字符串首尾的多余分号会被解析为空键值对,不影响正常属性的查询匹配
内容的提问来源于stack exchange,提问作者MattiTheMaestro
相关产品推荐
相关产品推荐

