处理具有相同值的字符串?

时间:2019-10-11 20:02:35

标签: delphi pointers delphi-10.3-rio ansistring

我正在使用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正确字符串的第一个字符。

记录结构和提取代码已投入生产。我假设问题出在我写指向记录的字符串指针的方式上。我在做什么错了?

谢谢

大卫

0 个答案:

没有答案