2011-09-15 169 views
2

類型轉換我嘗試做的程序列表中這樣說:
問題與德爾福XE

type 

TProc = procedure of object; 

TMyClass=class 
private 
fList:Tlist; 
function getItem(index:integer):TProc; 
{....} 
public 
{....} 
end; 
implementation 
{....} 
function TMyClass.getItem(index: Integer): TProc; 
begin 
Result:= TProc(flist[index]);// <--- error is here! 
end; 
{....} 
end. 

,並得到錯誤:

E2089 Invalid typecast

我怎樣才能解決這個問題? 正如我所看到的,我只能通過一個屬性Proc:TProc;製作假類並列出它。但我覺得這是一種糟糕的方式,不是嗎?

PS:項目必須與delphi-7兼容。

+1

如果您希望代碼在D7中工作,您爲什麼使用XE?那會導致你的悲傷。 –

回答

5

該類型轉換是無效的,因爲您不能適應方法指針指向一個指針,方法指針實際上是兩個指針,第一個是方法的地址,第二個方法是對該方法所屬對象的引用。請參閱文檔中的Procedural Types。這在Delphi的任何版本中都不起作用。

+0

+1事實上,這不適用於任何版本的Delphi。 –

4

Sertac解釋了爲什麼您的代碼無法正常工作。爲了在Delphi 7中實現這樣的列表,你可以做這樣的事情。

type 
    PProc = ^TProc; 
    TProc = procedure of object; 

    TProcList = class(TList) 
    private 
    FList: TList; 
    function GetCount: Integer; 
    function GetItem(Index: Integer): TProc; 
    procedure SetItem(Index: Integer; const Item: TProc); 
    public 
    constructor Create; 
    destructor Destroy; override; 
    property Count: Integer read GetCount; 
    property Items[Index: Integer]: TProc read GetItem write SetItem; default; 
    function Add(const Item: TProc): Integer; 
    procedure Delete(Index: Integer); 
    procedure Clear; 
    end; 

type 
    TProcListContainer = class(TList) 
    protected 
    procedure Notify(Ptr: Pointer; Action: TListNotification); override; 
    end; 

procedure TProcListContainer.Notify(Ptr: Pointer; Action: TListNotification); 
begin 
    inherited; 
    case Action of 
    lnDeleted: 
    Dispose(Ptr); 
    end; 
end; 

constructor TProcList.Create; 
begin 
    inherited; 
    FList := TProcListContainer.Create; 
end; 

destructor TProcList.Destroy; 
begin 
    FList.Free; 
    inherited; 
end; 

function TProcList.GetCount: Integer; 
begin 
    Result := FList.Count; 
end; 

function TProcList.GetItem(Index: Integer): TProc; 
begin 
    Result := PProc(FList[Index])^; 
end; 

procedure TProcList.SetItem(Index: Integer; const Item: TProc); 
var 
    P: PProc; 
begin 
    New(P); 
    P^ := Item; 
    FList[Index] := P; 
end; 

function TProcList.Add(const Item: TProc): Integer; 
var 
    P: PProc; 
begin 
    New(P); 
    P^ := Item; 
    Result := FList.Add(P); 
end; 

procedure TProcList.Delete(Index: Integer); 
begin 
    FList.Delete(Index); 
end; 

procedure TProcList.Clear; 
begin 
    FList.Clear; 
end; 

免責聲明:完全未經測試的代碼,使用您自己的風險。

+0

謝謝你,你的變體非常有趣。但似乎我會使用假類,因爲它更適合整體概念 –