Я использую Delphi 10.3 для расширения рабочего кода. У меня проблема со строками.
Я заполняю запись. Только первые 2 поля, 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')));
Позже имя и имя_организации извлекаются следующим образом:
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 правильно оценивает имя, но оценивает только первый символ правильной строки для org_name.
Структуры записей и код извлечения находятся в производстве. Я предполагаю, что проблема в том, как я записываю строковые указатели в запись. Что я делаю не так?
Спасибо
Дэвид