Autor Beitrag
FrEEzE2046
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109

Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
BeitragVerfasst: Mi 16.12.09 16:08 
Hallo,

ich habe ein (in Delphi) aufwändiges Problem. Und zwar:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
//Unit1:

uses Unit2;

TKlasseA = class(TObject)
     KlasseB : TKlasse B;
end;


//Unit2:

TKlasseB = class(TObject)
     Parent : PKlasseA;
end;



So, wie man sieht brauche ich in Klasse B einen Pointer auf seinen Parent. Es ist keine Option (für mich) beides in eine Unit zu packen. Da hat man natürlich die Möglichkeit, sowas per Forward-Deklaration zu lösen.

Wenn ich Unit1 in Unit2 im Interface einbinde, dann hab ich natürlich eine Überkreuzung drin. Ich muss doch irgendwie eine Extern-Deklaration machen können, um dem Compiler zu sagen, dass da etwas existiert, was später noch dem Linker mitgeteilt wird.

Besteht evtl die Möglichkeit den Code nur zu kompilieren und später zu linken?
Ich hoffe ihr könnt mir weiterhelfen.
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Mi 16.12.09 16:11 
Am einfachsten den Parent als TObject deklarieren und dann im Implementationteil mit is und as explizit Typcasten.
FrEEzE2046 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109

Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
BeitragVerfasst: Mi 16.12.09 16:25 
user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
Am einfachsten den Parent als TObject deklarieren und dann im Implementationteil mit is und as explizit Typcasten.


Ich brauch den Parent aber nur in KlasseA. Also:

KlasseA.KlasseB.Parent (wieder KlasseA). D.h. nach Außen muss klar sein, welcher Typ es ist und darf nicht TObject sein.
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Mi 16.12.09 16:36 
user profile iconFrEEzE2046 hat folgendes geschrieben Zum zitierten Posting springen:
nach Außen muss klar sein, welcher Typ es ist und darf nicht TObject sein.


Wofür? Den Typ kannst du doch dann mit is feststellen ?!?
Oder mach aus Parent ne property, wo im setter geprüft wird, ob das auch wirklich der Richtige Typ ist.
FrEEzE2046 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109

Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
BeitragVerfasst: Mi 16.12.09 16:38 
Also, ich will den Zeiger auf KlasseA IN KlasseB gar nicht verwenden. Ich möchte viel mehr von einer Instanz von KlasseB aus, auf Methoden von KlasseA zugreifen können. Das geht nicht, wenn es für mich ein TObject ist.
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Mi 16.12.09 16:40 
user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
mit is und as explizit Typcasten.
FrEEzE2046 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109

Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
BeitragVerfasst: Mi 16.12.09 16:41 
user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
mit is und as explizit Typcasten.


Kannst du mal ein Beispiel schreiben, ich versteh absolut nicht wie du dass meinst.
Bei mir besteht folgendes:

AArr : array of KlasseA;
BArr : ^array of KlasseB;

BArr zeigt auf alle KlasseB's in dem KlasseA Array. Ich will von BArr aber auch die Möglichkeit haben wieder zurück zu KlasseA zu kommen.


Außerdem scheitert es bei mir gerade dann, wie ich in KlasseA dem Konstruktor von KlasseB überhaupt die Adresse der aktuellen Instanz (von KlasseA) übergeben kann, da es in Delphi ja kein "this" gibt.
Da jedoch selbst Delphi die Speicheradresse der aktuellen Instanz braucht, fragt sich wie die Aufrufkonvention für Klassenmethoden in Delphi ist; dazu finde ich im Internet absolut gar nichts.
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Mi 16.12.09 16:44 
Deklarier halt einfach Parent als TObject. Wenn du es dann als TKlasseA (die Zeiger sind unnötig, Objecte sind in Delphi sowieso schon Zeiger) brauchst, nimmst du halt
ausblenden Delphi-Quelltext
1:
(xxx.Parent as TKlasseA).irgendetwas;					


Übrigens: In Delphi gibt es self statt this.
FrEEzE2046 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109

Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
BeitragVerfasst: Mi 16.12.09 16:46 
user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
Deklarier halt einfach Parent als TObject. Wenn du es dann als TKlasseA (die Zeiger sind unnötig, Objecte sind in Delphi sowieso schon Zeiger) brauchst, nimmst du halt
ausblenden Delphi-Quelltext
1:
(xxx.Parent as TKlasseA).irgendetwas;					


Ja, aber dass muss ich dann ja von außen machen und dass geht nicht. Es handelt sich um Klassen die ich anderen Entwicklern bereitstelle und nicht nur für den Eigengebrauch verwende. Da kann ich ja gleich nur Pointer übergeben, die dann gecastet werden müssen.
Kann ja ohne Hinweis niemand ahnen, dass man den Parent erst casten muss.