我正在使用Delphi 10.3扩展一些工作代码。我的字符串有问题。
我正在填写记录。只有前两个字段name和org_name给我带来了问题。当name和org_name的值互不相同时,就没有问题。但是,当name和org_name具有相同的值时,可以正确读取name,但是org_name仅产生其字符串的第一个字符。
TMYSQL_FIELD51 = record
name: PAnsiChar; // Name of column
org_name: PAnsiChar; // Original column name, if an alias
...
end;
从JSON对象检索值并将其写入记录:
fFieldInfo: TMYSQL_FIELD51;
lInput: TJSONValue;
FieldOffsets: TMYSQL_FIELDOFFSETS; //a record containing offsets into TMYSQL_FIELD51
PPAnsiChar(NativeInt(@fFieldInfo) + FieldOffsets.name)^ := PAnsiChar(AnsiString(lInput.GetValue<String>('label')));
PPAnsiChar(NativeInt(@fFieldInfo) + FieldOffsets.org_name)^ := PAnsiChar(AnsiString(lInput.GetValue<String>('name')));
注意:以更常见的方式填写字段不会改变结果:
fFieldInfo.name := PAnsiChar(AnsiString(lInput.GetValue<String>('label')));
fFieldInfo.org_name := PAnsiChar(AnsiString(lInput.GetValue<String>('name')));
以后,像这样提取名称和org_name:
PMYSQL_FIELD51 = ^TMYSQL_FIELD51;
MYSQL_FIELD: PMYSQL_FIELD51;
FieldOffsets: TMYSQL_FIELDOFFSETS; //a record containing offsets into TMYSQL_FIELD51
Result.ColumnLabel := ValueToString(PPAnsichar(NativeUInt(MYSQL_FIELD)+FieldOffsets.name)^, StrLen(PPAnsichar(NativeUInt(MYSQL_FIELD)+FieldOffsets.name)^));
Result.ColumnName := ValueToString(PPAnsichar(NativeUInt(MYSQL_FIELD)+NativeUInt(FieldOffsets.org_name))^, StrLen(PPAnsichar(NativeUInt(MYSQL_FIELD)+NativeUInt(FieldOffsets.org_name))^));
当name和org_name具有相同的值时,对ValueToString的调用中的第一个参数将正确评估name,但仅评估org_name正确字符串的第一个字符。
记录结构和提取代码已投入生产。我假设问题出在我写指向记录的字符串指针的方式上。我在做什么错了?
谢谢
大卫