Delphi - TValue指针和背面

时间:2017-06-27 13:05:52

标签: delphi delphi-10.1-berlin

我正在努力处理一段简单的代码,即使很简单,我找不到解决方案。在某个部分,我有一个名为“

”的事件
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。它一定是非常简单的东西,我错过了。有什么想法吗?

2 个答案:

答案 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实例的类型信息。