Обработка строк с одинаковыми значениями? - PullRequest
0 голосов
/ 11 октября 2019

Я использую 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.

Структуры записей и код извлечения находятся в производстве. Я предполагаю, что проблема в том, как я записываю строковые указатели в запись. Что я делаю не так?

Спасибо

Дэвид

...