带有指针组件的未声明标识符

时间:2013-03-31 16:43:23

标签: delphi pointers undeclared-identifier

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

甚至更简单的是将变量的类型从Pointer更改为TObject。然后传递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;

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