Toon posts:

[DELPHI] classes die elkaar gebruiken

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo mensen, ik heb het volgende probleem:

Ik heb 2 classes: PNDatabase en PNTable.

Nu heeft PNDatabase een array met objecten van het type PNTable.

Maar nu moet ik een functie schrijven in PNTable die de PNDatabase benadert waar hij in de array zit.
Ik heb geen flauw idee hoe ik dat moet doen!

Ik had 1 oplossing: PNTable een eigenschap ParentDB te geven die verwijst naar de PNDatabase waar hij bij hoort. Maar dit kan niet(compiler error), omdat PNTable boven PNDatabase is dedeclareerd, dus kan PNDatabase nooit in PNTable gebruikt worden.

HELP!

  • MaxxRide
  • Registratie: April 2000
  • Laatst online: 09-01 10:13

MaxxRide

Surf's up

Volgens mij moet je dan spelen met de plek waar je je unit "uses". Deze mogen niet beide in de bovenste uses staan, dan krijg je een circular reference en wil de zaak niet compileren. Je zult dus een van de twee in de tweede uses (onder je class defenition) moeten plaatsen dan lukt het je.

Zul je alleen nog moeten nadenken hoe je het probleem oplost met je functie definities.

*Dit is iig het concept, Delphi is voor mij alweer een tijdje terug*

If you are not wiping out you are nog pushing enough...


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Gooi de classes bij elkaar in 1 unit en maak een forward class declaration:
code:
1
2
3
4
5
6
7
8
9
10
type
  TClass2 = class;

  TClass1 = class
    property Class2: TClass2;
  end;

  TClass2 = class
    property Class1: TClass1;
  end;

[ Voor 53% gewijzigd door jelmervos op 28-07-2005 17:01 ]

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Topicstarter
MaxxRide schreef op donderdag 28 juli 2005 @ 16:57:
Volgens mij moet je dan spelen met de plek waar je je unit "uses". Deze mogen niet beide in de bovenste uses staan, dan krijg je een circular reference en wil de zaak niet compileren. Je zult dus een van de twee in de tweede uses (onder je class defenition) moeten plaatsen dan lukt het je.

Zul je alleen nog moeten nadenken hoe je het probleem oplost met je functie definities.

*Dit is iig het concept, Delphi is voor mij alweer een tijdje terug*
Ze staan allebei in dezelfde unit.

type
TPNTable = class(TObject)
//Hier staat zooi
// Parentdb: TPNDatabase; DIT KAN DUS NIET. helaas
end;

type
TPNDatabase = class(TObject)
Tables: array of TPNTable;
//nog meer zooi
end;

Verwijderd

Topicstarter
Kaassoevlee schreef op donderdag 28 juli 2005 @ 17:01:
Gooi de classes bij elkaar in 1 unit en maak een forward class declaration.
formard class declaration ken ik niet. Zal het eens opzoeken wat het is.
(agh god ik zie wat je bedoelt. eff proberen)

[ Voor 9% gewijzigd door Verwijderd op 28-07-2005 17:02 ]


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Verwijderd schreef op donderdag 28 juli 2005 @ 17:02:
[...]


formard class declaration ken ik niet. Zal het eens opzoeken wat het is.
Denk dat je dat niet gaat vinden zo. :P

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Ander voordeel ( alhoewel het niet echt netjes is ) is dat wanneer je twee classes in 1 unit zet, ze toegang hebben tot ALLE properties en methods, zelfs als ze private zijn !

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Verwijderd schreef op donderdag 28 juli 2005 @ 17:05:
Ander voordeel ( alhoewel het niet echt netjes is ) is dat wanneer je twee classes in 1 unit zet, ze toegang hebben tot ALLE properties en methods, zelfs als ze private zijn !
Klopt, het zijn zogenoemde "friends". Dit gedrag kun je uitschakelen door te kiezen voor strict private (Delphi 2005).

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Topicstarter
type TPNDatabase = class(TObject);

type
TPNTable = class(TObject)
//Hier staat zooi
// Parentdb: TPNDatabase; DIT KAN DUS NIET. helaas
end;

type
TPNDatabase = class(TObject)
Tables: array of TPNTable;
//nog meer zooi
end;

Geeft een error: Identifier redeclared: TPNDatabase :S

Ook als ik slechts eenmaal TYPE neerzet zoals in je voorbeeld

[ Voor 10% gewijzigd door Verwijderd op 28-07-2005 17:09 ]


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Zie mijn voorbeeld, alles onder 1 type sectie, geen base class bij de forward declaration.

[ Voor 33% gewijzigd door jelmervos op 28-07-2005 17:10 ]

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:26

Tomatoman

Fulltime prutser

Niet vergeten dat een class gedeclareerd moet worden in dezelfde type sectie als waarin de forward declaration staat. Goed: zie voorbeeld van Kaassoevlee. Fout:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
type
  TClass2 = class;

  TClass1 = class
    property Class2: TClass2;
  end;

type             // Fout, want hier begint een nieuwe type declaration.
                 // Nu verwijst de forward declaration van TClass2 naar 'niets'
  TClass2 = class
    property Class1: TClass1;
  end;

Een goede grap mag vrienden kosten.


Verwijderd

Topicstarter
Hij zegt weer: Identifier redeclared: TPNDatabase

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Verwijderd schreef op donderdag 28 juli 2005 @ 17:12:
Hij zegt weer: Identifier redeclared: TPNDatabase
Geef je code nog eens zoals je hem nu hebt.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Topicstarter
type TPNDatabase = class;

TPNTable = class(TObject)
//Hier staat zooi
Parentdb: TPNDatabase;
end;


TPNDatabase = class(TObject)
Tables: array of TPNTable;
//nog meer zooi
end;


Zo werkt het wel. En ik heb dus nu bij de eerste niet aangegeven dat het erft van TObject.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Dat had ik paar posts terug al gezegd:
geen base class bij de forward declaration.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Topicstarter
Kaassoevlee schreef op donderdag 28 juli 2005 @ 17:15:
Dat had ik paar posts terug al gezegd:

[...]
ah had ik over het hoofd gezien :Y)

Thanks iig!

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Graag gedaan!

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Topicstarter
Wat een vriendelijke mensen toch hier :P
Pagina: 1