Delphi - 指向指针和返回的 TValue
Delphi - TValue to pointer and back
我正在为一段简单的代码苦苦挣扎,即使很简单,我也找不到解决方案。一方面,我有一个这样的活动
OnReadMessageParameter(Self, aName, aTypeInfo, pointer(@aValue), [psIsTValue]);
重要的是 TValue 类型的值参数。调用时 aValue.IsObject 为真。我已将我的例程分配给此事件以处理来自它的数据:
.DoOnReadMessageParameter(Sender: TROMessage; const aName: string;
aTypeInfo: PTypeInfo; const DataRef: pointer; Attributes: TParamAttributes);
现在,我的问题是,我尝试了多种方法将 DataRef 转换回 TValue 项:
var val: tvalue;
tvalue.Make(@DataRef^,TypeInfo(TValue),val);
or another attempt
val := TValue(@DataRef^);
但是 IsObject 属性 是错误的。它一定是非常简单的东西,我错过了。有什么想法吗?
其中aValue 是一个TValue,@aValue 是指向TValue 结构的指针,而不是它包装的值。更好的设计是让 OnReadMessageParameter 事件将其 DataRef 参数类型化为 TValue 本身,而不是非类型化指针。
但是,如果您无法控制它,则需要将 DataRef 转换为指向 TValue 的指针,然后引用它 -
type
PValue = ^TValue;
var
val: TValue;
begin
val := PValue(DataRef)^;
如果您无法控制 DoOnReadMessageParameter
但您知道 DataRef
将始终是指向 TValue
的指针,那么:
type
PValue = ^TValue;
procedure [someclass].DoOnReadMessageParameter(Sender: TROMessage; const aName: string;
aTypeInfo: PTypeInfo; const DataRef : pointer; Attributes: TParamAttributes);
var
HaveObject : boolean;
begin
HaveObject := PValue(DataRef).IsObject;
//...
end;
假设您控制了 DoOnReadMessageParameter
而不是事件 OnReadMessageParameter
:
type
PValue = ^TValue;
procedure [someclass].DoOnReadMessageParameter(Sender: TROMessage; const aName: string;
aTypeInfo: PTypeInfo; const DataRef : PValue; Attributes: TParamAttributes);
var
HaveObject : boolean;
begin
HaveObject := DataRef.IsObject;
//...
end;
如果您同时控制了两者:
OnReadMessageParameter(Self, aName, aTypeInfo, aValue, [psIsTValue]);
procedure [someclass].DoOnReadMessageParameter(Sender: TROMessage; const aName: string;
aTypeInfo: PTypeInfo; const DataRef : TValue; Attributes: TParamAttributes);
最后,如果 DataRef
可能指向任何东西,那你就倒霉了,因为你没有用于创建 TValue 实例的类型信息。
我正在为一段简单的代码苦苦挣扎,即使很简单,我也找不到解决方案。一方面,我有一个这样的活动
OnReadMessageParameter(Self, aName, aTypeInfo, pointer(@aValue), [psIsTValue]);
重要的是 TValue 类型的值参数。调用时 aValue.IsObject 为真。我已将我的例程分配给此事件以处理来自它的数据:
.DoOnReadMessageParameter(Sender: TROMessage; const aName: string;
aTypeInfo: PTypeInfo; const DataRef: pointer; Attributes: TParamAttributes);
现在,我的问题是,我尝试了多种方法将 DataRef 转换回 TValue 项:
var val: tvalue;
tvalue.Make(@DataRef^,TypeInfo(TValue),val);
or another attempt
val := TValue(@DataRef^);
但是 IsObject 属性 是错误的。它一定是非常简单的东西,我错过了。有什么想法吗?
其中aValue 是一个TValue,@aValue 是指向TValue 结构的指针,而不是它包装的值。更好的设计是让 OnReadMessageParameter 事件将其 DataRef 参数类型化为 TValue 本身,而不是非类型化指针。
但是,如果您无法控制它,则需要将 DataRef 转换为指向 TValue 的指针,然后引用它 -
type
PValue = ^TValue;
var
val: TValue;
begin
val := PValue(DataRef)^;
如果您无法控制 DoOnReadMessageParameter
但您知道 DataRef
将始终是指向 TValue
的指针,那么:
type
PValue = ^TValue;
procedure [someclass].DoOnReadMessageParameter(Sender: TROMessage; const aName: string;
aTypeInfo: PTypeInfo; const DataRef : pointer; Attributes: TParamAttributes);
var
HaveObject : boolean;
begin
HaveObject := PValue(DataRef).IsObject;
//...
end;
假设您控制了 DoOnReadMessageParameter
而不是事件 OnReadMessageParameter
:
type
PValue = ^TValue;
procedure [someclass].DoOnReadMessageParameter(Sender: TROMessage; const aName: string;
aTypeInfo: PTypeInfo; const DataRef : PValue; Attributes: TParamAttributes);
var
HaveObject : boolean;
begin
HaveObject := DataRef.IsObject;
//...
end;
如果您同时控制了两者:
OnReadMessageParameter(Self, aName, aTypeInfo, aValue, [psIsTValue]);
procedure [someclass].DoOnReadMessageParameter(Sender: TROMessage; const aName: string;
aTypeInfo: PTypeInfo; const DataRef : TValue; Attributes: TParamAttributes);
最后,如果 DataRef
可能指向任何东西,那你就倒霉了,因为你没有用于创建 TValue 实例的类型信息。