【问题标题】:Undeclared Identifier with Pointer to Component带有指向组件的未声明标识符
【发布时间】:2013-03-21 20:10:44
【问题描述】:

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

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

【问题讨论】:

    标签: delphi pointers undeclared-identifier


    【解决方案1】:

    您的变量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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      相关资源
      最近更新 更多