我正在努力处理一段简单的代码,即使很简单,我找不到解决方案。在某个部分,我有一个名为“
”的事件OnReadMessageParameter(Self, aName, aTypeInfo, pointer(@aValue), [psIsTValue]);
重要的是aValue参数,其类型为TValue。当这被称为aValue.IsObject时为true。我已经为这个事件分配了我的例程来处理它的数据:
.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属性为false。它一定是非常简单的东西,我错过了。有什么想法吗?
答案 0 :(得分:6)
如果aValue是TValue,@ aValue是指向TValue结构的指针,而不是它包含的值。更好的设计是使OnReadMessageParameter事件将其DataRef参数键入TValue本身,而不是无类型指针。
但是,如果你无法控制它,你需要将DataRef转换为指向TValue的指针,然后将它推迟 -
type
PValue = ^TValue;
var
val: TValue;
begin
val := PValue(DataRef)^;
答案 1 :(得分:2)
如果您无法控制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实例的类型信息。