0

我已经设置了一个指针,我想指向一个组件,但是每次调用过程时它指向的组件都不相同,它只是简单地声明为“指针”。这是指针指向组件的代码。

Procedure DestroyConnection(Component,ID,Connections:Integer);
Var
ComponentPtr: Pointer;

begin

if Component = 1 then
  ComponentPtr := Cell;

if Component = 2 then
   ComponentPtr := Bulb;

这是重用指针的代码。

Procedure DestroyLink(Ptr:Pointer; ID:Integer);
var
Component: ^TObject;
begin
Component := Ptr;
Component.Connected := False;

我在该行收到一个未声明的标识符错误:

 Component.Connected := False;

我如何能够访问 DestroyLink 过程中指针指向的组件?对不起,如果我没有多大意义:S

4

1 回答 1

2

您的变量Component是指向TObject. 而且由于TObject没有名为 的成员Connected,这就是编译器对象的原因。

更重要的是,你有太多的间接级别。类型的变量TObject,或者实际上任何 Delphi 类已经是一个引用。它已经是一个指针。这就是为什么您的分配ComponentPtr不使用@运算符的原因。它不需要获取地址,因为引用已经是地址。

您需要更改DestroyLink以匹配。您需要的变量不是指向引用的指针,而是对象的实际类型的变量。例如,假设定义Connected属性的类型是,TMyComponent那么您的代码应该是:

var
  Component: TMyComponent;
....
Component := TMyComponent(Ptr);
Component.Connected := False;

或者更简单的是将变量的类型从 更改PointerTObject。然后传递TObject而不是Pointer. 然后您的代码可以读取:

Procedure DestroyConnection(Component,ID,Connections:Integer);
Var
  Obj: TObject;
begin
  case Component of
  1:
    Obj := Cell;
  2:
    Obj := Bulb;
  ....

进而:

procedure DoSomethingWithObject(Obj: TObject);
begin
  if Obj is TCell then
    TCell(Obj).Connected := False;
  if Obj is TBulb then
    TBulb(Obj).SomeOtherProperty := SomeValue;
end;

如果您对所有这些对象都有一个公共基类,那么您可以将变量声明为该类型。然后你可以使用虚函数和多态性,我认为这会导致更简单和更清晰的代码。

于 2013-03-31T16:51:44.660 回答