2012-10-22 11 views
5

Mam pytanie podobne do this, ale w delphi.Jak zadeklarować dwie połączone ze sobą klasy?

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

type 
    TAsyncPopulator = class 
    private 
    _updater: TThreadPopulator; 
    end; 

Rozwiązanie z wymienionych kwestii nie ma zastosowania do Delphi

+10

Stosowny dokumentacja jest tutaj: http://docwiki.embarcadero.com/RADStudio/XE2/en/Classes_and_Objects# Forward_Declarations_and_Mutually_Dependent_Classes –

Odpowiedz

12

Zobacz Forward Declarations and Mutually Dependent Classes dokumentacji.

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; 

Użyj źródła, Luke! Twoja instalacja Delphi ma pełne źródła VCL i RTL, abyś mógł je przeczytać i uczyć się. I bardzo często korzysta z tego szablonu. Za każdym razem, gdy zadajesz sobie pytanie "jak mogę to zrobić", pomyśl tylko "jak zrobił to Borland" i całkiem możliwe, że już masz gotowy przykład w źródłach dostarczanych przez Delphi.

+0

Daje błąd [DCC Error] Populator.pas (12): E2086 Typ 'TAsyncPopulator' nie jest jeszcze całkowicie zdefiniowany. Używam Delphi XE2 –

+0

Czy używasz tego kodu bez resztek? Jest to wzorzec, którego można używać w prawie każdej jednostce VCL, takiej jak Controls, Forms itp. –

+2

Ten kod kompiluje się w aktualizacji 4 dla XE2 Update 1. Kod jest jakoś inny - sprawdź go uważnie. Najprawdopodobniej zamkniesz jedną sekcję TYPE i za wcześnie zainicjujesz inną sekcję sekcji TYPU. Deklaracje forward i końcowe nie mogą być podzielone na osobne sekcje. Myślę, że po prostu zmiksowałeś swój stary kod z jednym z moich. –

3

edycji przed każdym definicji klasy. Forward klasy działa w Delphi 2010. Nie znam wersji delphi dla czarownic, ale to jedyne rozwiązanie, które mogę wymyślić.

type 
TAsyncPopulator = Class; 

nadzieję, że pomogło

+0

Próbowałem. Ale daje błąd [DCC Error] Populator.pas (10): E2086 Typ "TASyncPopulator" nie jest jeszcze całkowicie zdefiniowany. Używam Delphi XE2 –

+0

@NiyokoYuliawan powinno działać na twojej wersji delphi, więc sprawdź składnię, którą robisz coś złego. – opc0de

+0

@Niyoko - ponieważ zbyt wcześnie zakończyłeś sekcję TYPE. Deklaracje forward działają w zakresie pojedynczej sekcji. Przeczytaj instrukcję Delphi dotyczącą deklaracji typu. PS. Ponadto - powyżej znajduje się link "retag". Na ogół dobrze jest umieścić tag dla swojej dokładnej wersji delphi dodatkowo do ogólnego znacznika 'delphi' –

0

Poza zastosowaniem do przodu deklarację, można również utworzyć podklasę, aby rozwiązać ten:

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

    var 
    owner: TAsyncPopulator; 
end; 
Powiązane problemy