У меня есть метод (Delphi 2009):
procedure TAnsiStringType.SetData(const Value: TBuffer; IsNull: boolean = False);
begin
if not IsNull then
FValue:= PAnsiString(Value)^;
inherited;
end;
Это абстрактный метод базового класса, где «Value: Pointer» ожидает указатель соответствующих данных, как:
String = PString
AnsiString = PAnsiString
Integer = PInteger
Boolean = PBoolean
Поэтому я пытаюсь передать значение следующим образом:
var
S: AnsiString;
begin
S:= 'New AnsiString Buffer';
SetBuffer(PAnsiString(S));
end;
Но приведение из AnsiString к PAnsiString НЕ работает, я понимаю, почему, но я хочу знать, каков результат преобразования. Поэтому я написал простой тест:
var
Buffer: AnsiString;
P1: Pointer;
P2: Pointer;
P3: Pointer;
P4: Pointer;
begin
P1:= PAnsiString(Buffer);
P2:= Addr(Buffer);
P3:= @Buffer;
P4:= Pointer(Buffer);
P5:= PChar(Buffer[1]);
WriteLn('P1: ' + IntToStr(Integer(P1)));
WriteLn('P2: ' + IntToStr(Integer(P2)));
WriteLn('P3: ' + IntToStr(Integer(P3)));
WriteLn('P4: ' + IntToStr(Integer(P4)));
WriteLn('P5: ' + IntToStr(Integer(P5)));
end;
Результат:
P1: 5006500
P2: 1242488
P3: 1242488
P4: 5006500
P5: 67
Где:
- P2 and P3, is the address of Buffer: AnsiString
- P5 is the Char Ord value of Buffer[1] char, in this case "67 = C"
- How about P1 and P4?
Что означает P1 и P4?