2012-10-22 11 views
5

Ho una domanda simile a this, ma in delphi.Come dichiarare due classi interconnesse?

type 
    TThreadPopulator = class(TThread) 
    private 
    _owner:TASyncPopulator; //Undeclared identifier 
    end; 

type 
    TAsyncPopulator = class 
    private 
    _updater: TThreadPopulator; 
    end; 

soluzione di questione di cui non è applicabile a Delfi

+10

La documentazione pertinente è qui: http://docwiki.embarcadero.com/RADStudio/XE2/en/Classes_and_Objects# Forward_Declarations_and_Mutually_Dependent_Classes –

risposta

12

Vedere Forward Declarations and Mutually Dependent Classes documentazione.

type (* start type section - one unified section "to rule them all" *) 
    TAsyncPopulator = class; (* forward declaration *) 

    TThreadPopulator = class(TThread) 
    private 
    _owner:TASyncPopulator; 
    end; 

    TAsyncPopulator = class (* final declaration - WITHIN that very section where forward declaration was made *) 
    private 
    _updater: TThreadPopulator; 
    end; 

Utilizzare la fonte, Luke! L'installazione di Delphi include sorgenti VCL e RTL complete per la lettura, la visualizzazione e l'apprendimento. E usa molto questo modello. Ogni volta che ti chiedi "come potrei farlo", pensa solo "come ha fatto Borland a farlo" e abbastanza probabile che tu possa già avere un esempio già pronto nelle fonti fornite da Delphi.

+0

Segnala errore [Errore DCC] Populator.pas (12): Il tipo 'TAsyncPopulator' E2086 non è ancora completamente definito. Sto usando delphi XE2 –

+0

tu usi letteralmente questo codice senza avanzi dal tuo? Questo è lo schema che è possibile utilizzare in quasi tutte le unità VCL come Controlli, Moduli, ecc. –

+2

Questo codice viene compilato in XE2 Update 4 Hotfix 1. Il codice è in qualche modo diverso - verificarlo attentamente. Molto probabilmente chiuderai una sezione TYPE e avvierai un'altra sezione di TYPE troppo presto. Le dichiarazioni in avanti e quelle finali non possono andare in sezioni separate. Penso che tu abbia appena mescolato il tuo vecchio codice con uno dei miei. –

3

Utilizzare questo prima di ogni definizione di classe. Il corso di perfezionamento in corso a Delphi 2010. Non conosco la versione strega di Delphi, ma è l'unica soluzione che riesco a pensare.

type 
TAsyncPopulator = Class; 

Speranza ho aiutato

+0

Ho provato. Ma dà errore [DCC Error] Populator.pas (10): E2086 Type 'TASyncPopulator' non è stato ancora completamente definito. Sto usando Delphi XE2 –

+0

@NiyokoYuliawan dovrebbe funzionare sulla tua versione delphi quindi controlla la sintassi stai facendo qualcos'altro sbagliato. – opc0de

+0

@Niyoko - perché hai terminato la sezione TYPE troppo presto. Le dichiarazioni di inoltro funzionano nello span sezione singola. Leggere il manuale Delphi relativo alla dichiarazione del tipo. PS. Inoltre, c'è il link "retag" sopra. In generale, è corretto pensare di inserire il tag per la tua esatta versione delphi in aggiunta al tag generico 'delphi' –

0

Oltre a utilizzare una dichiarazione anticipata, è possibile anche creare una sottoclasse per risolvere questo:

TThreadPopulator = class(TThread) 
    type 
    TAsyncPopulator = class 
     _updater: TThreadPopulator; 
    end; 

    var 
    owner: TAsyncPopulator; 
end;