Toon posts:

[D6] Eigen class in eigen class

Pagina: 1
Acties:

Verwijderd

Topicstarter
Momenteel lukt het me maar niet om een eigen class in een eigen class te gebruiken.

In eerste instantie heb ik alles met pointers geprobeerd, maar na de help gelezen te hebben heb ik die weggelaten. (Omdat volgens de help iedere class al een pointer is, en deze voor het gemak voor de gebruiker worden omgezet zodat je er zelf niet over hoeft na te denken)

Ik heb maar even een simpel voorbeeldje gemaakt. En zelfs dat wil niet werken. Het gaat hier om de class TAuto en TKenteken. Nou wil ik de auto een kenteken geven, en dat doe ik op de volgende manier:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
type
  TKenteken = class
  private
      Fland: string;

      procedure SetLand(Value: string);
      function GetLand(): string;
  published
      property land: string read GetLand write SetLand;
  end;

type
  TAuto = class
  private
      Fmerk: string;
      Fkenteken: TKenteken;

      procedure SetMerk(Value: string);
      function GetMerk(): string;
      procedure SetKenteken(Value: string);
      function GetKenteken(): string;
  published
      property merk: string read GetMerk write SetMerk;
      property kenteken: string read GetKenteken write SetKenteken;
  end;



var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TAuto.SetMerk(Value: string);
begin
      Fmerk := Value;
end;

function TAuto.GetMerk(): string;
begin
      Result := Fmerk;
end;

procedure TAuto.SetKenteken(Value: string);
begin
      FKenteken.Land := Value;
end;

function TAuto.GetKenteken(): string;
begin
      Result := FKenteken.Land;
end;

procedure TKenteken.SetLand(Value: string);
begin
      Fland := Value;
end;

function TKenteken.GetLand(): string;
begin
      Result := Fland;
end;

Maar in de functies SetKenteken en GetKenteken gaat het mis. Access violation.... :?

Heeft iemand misschien een idee of bruikbare tip?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:14
Een eerste opmerking:
Die published access modifier gebruik je best niet. Deze is gereserveerd voor variablen/mehtods ed die door Delphi worden toegevoegd. Gebruik public inplaats.

Die Access violation krijg je waarschijnlijk omdat je een waarde wilt toekennen aan een object dat nog niet gealloceerd is. Als je SetKenteken enzo gebruikt, op welk object doe je dit dan? Ben je zeker dat je dan een object van het type tkenteken gealloceerd hebt?
code:
1
2
3
4
5
6
var
  myKenTeken : TKenteken;
begin
  myKenTeken := TKenteken.Create(Self);
  myKenTeken.SetKenteken('test');
end;

https://fgheysels.github.io/


Verwijderd

Topicstarter
code:
1
2
3
4
5
6
var
  myKenTeken : TKenteken;
begin
  myKenTeken := TKenteken.Create(Self);
  myKenTeken.SetKenteken('test');
end;
Maar dat houdt dan dus in dat ik ieder kenteken apart moeten createn. Terwijl ik eigenlijk wil dat als ik een auto 'maak' dat ik dan meteen een kenteken heb.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Misschien domme vraag, maar waarom een class, en niet gewoon zo:
code:
1
2
3
4
type
TKenteken = record
  Land: String;
end;

Dan doe je gewoon
var
Kenteken: TKenteken;

en dan kun je Kenteken.Land := 'Nederland' doen ofzo

vervolgens om uit te lezen:
ShowMessage(Kenteken.Land);


Of is dit totaal NIET wat je zoekt?

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


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:14
Op dinsdag 05 februari 2002 21:07 schreef master_n00b het volgende:

[..]

Maar dat houdt dan dus in dat ik ieder kenteken apart moeten createn. Terwijl ik eigenlijk wil dat als ik een auto 'maak' dat ik dan meteen een kenteken heb.
Zet dan in uw constructor van uw auto die regel:
code:
1
kenteken := TKenteken.Create(Self);

Dan wordt, iedere keer je een Auto-object maakt er ook een Kenteken object gemaakt voor die auto.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:14
Nog even een opmerking:

Je inherited best die classes van de TObject class.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:14
Op dinsdag 05 februari 2002 21:11 schreef jelmervos het volgende:
Misschien domme vraag, maar waarom een class, en niet gewoon zo:
code:
1
2
3
4
type
TKenteken = record
  Land: String;
end;

Dan doe je gewoon
var
Kenteken: TKenteken;

en dan kun je Kenteken.Land := 'Nederland' doen ofzo

vervolgens om uit te lezen:
ShowMessage(Kenteken.Land);


Of is dit totaal NIET wat je zoekt?
Waarom dan een struct gebruiken als die struct toch maar 1 member-variable bevat?

https://fgheysels.github.io/


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Op dinsdag 05 februari 2002 21:14 schreef whoami het volgende:

[..]

Waarom dan een struct gebruiken als die struct toch maar 1 member-variable bevat?
Uuhmm, da's misschien waar, maar is een voorbeeld.

Ik neem aan dat hij er later ook weer in wil hebben.

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


Verwijderd

Topicstarter
In dit geval van het voorbeeld gaat het om 1 variabele die makkelijk in een struct kan.

In de praktijk heb k veel meer variabelen en memberfuncties en is het netter om een eigen class aan te maken. Vroeger stond alles in 1 class gestopt en wilde het nu ff netjes in aparte classes maken. En toen liep ik vast...

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:14
En nu staat de oplossing er en kun je weer verder :)

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik ga weer ff aan de slag,

Thanx

Verwijderd

Op dinsdag 05 februari 2002 20:57 schreef whoami het volgende:
Een eerste opmerking:
Die published access modifier gebruik je best niet. Deze is gereserveerd voor variablen/mehtods ed die door Delphi worden toegevoegd. Gebruik public inplaats.
Aangezien topicstarter derived van TObject heb je gelijk; echter zodra deze van zijn objecten een component gaat maken zit hij toch echt goed want ik kan me zo maar voorstellen dat je vanuit de object inspector de properties wilt kunnen aanpassen dus published. Is dus niet erg maar een goede gewoonte.
Die Access violation krijg je waarschijnlijk omdat je een waarde wilt toekennen aan een object dat nog niet gealloceerd is. Als je SetKenteken enzo gebruikt, op welk object doe je dit dan? Ben je zeker dat je dan een object van het type tkenteken gealloceerd hebt?
code:
1
2
3
4
5
6
var
  myKenTeken : TKenteken;
begin
  myKenTeken := TKenteken.Create(Self);
  myKenTeken.SetKenteken('test');
end;
Dit mag, en moet imho, anders:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
TKenteken = class(TPersistent)
private
  ...
protected
  ...
public
  ...
published
  ...
end;

TAuto = class
private
  FKenteken: TKenteken;
  procedure SetKenteken(const Value: TKenteken);
public
  constructor Create;
  destructor Destroy; override;
published
  property Kenteken: TKenteken read FKenteken write SetKenteken;
end;

implementation

constructor TAuto.Create;
begin
  inherited Create;
  FKenteken:=TKenteken.Create; // Let op AOwner wordt pas vanaf TComponent geïntroduceerd!!
end;

destructor TAuto.Destroy;
begin
  FKenteken.Free;
  inherited Destroy;
end;

procedure SetKenteken(const Value: TKenteken);
begin
  if Assigned(Value) then
    FKenteken.Assign(Value); // Zie hier het verschil!
end;
Pagina: 1