2013-03-31 55 views
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

回答

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; 

如果你有一個共同的基類爲所有這些對象,那麼你可以聲明你的變量是此類型。然後你可以使用虛擬函數和多態性,我認爲這會導致更簡單更清晰的代碼。

+0

非常有幫助和清楚,謝謝! – user2141962