我已经设置了一个指针,我想指向一个组件,但它指向的组件在每次调用过程时都不会是相同的,它只是被声明为“指针”。这是指针指向组件的代码。
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
答案 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;
如果您有所有这些对象的公共基类,那么您可以将变量声明为该类型。然后你可以使用虚函数和多态,我认为这会导致更简单和更清晰的代码。