我正在使用 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')));
稍后,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 仅计算为正确字符串的第一个字符。
记录结构和提取代码正在生产中。我假设问题出在我将字符串指针写入记录的方式上。我究竟做错了什么?
谢谢
大卫