Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Was mache ich falsch: menge : array[1..7] of TMyClass;


catweasel - Di 11.11.03 19:31
Titel: Was mache ich falsch: menge : array[1..7] of TMyClass;
Hi,

ich habe mir eine eigene kleine Klasse erstellt. Etw so...:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
type
  TSpiel = class

  private
  heimname : string;
  gastname : string;
  heimtore : integer;
  gasttore : integer;
  constructor create;

    { Private declarations }
  public
    function wersieger(): string;
    procedure heimtrifft;
    procedure gasttrifft;
    { Public declarations }
end;


Die Methode wersieger(); wird ohne Parameter aufgerufen und gibt zurück, wer in Führung ist/Sieger ist (nach aktuellem Spielstand).


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
function TSpiel.wersieger: string;
begin
if gasttore > heimtore then result := 'gast';
if heimtore > gasttore then result := 'heim';
if heimtore = gasttore then result := 'Unentschieden';
end;

procedure TSpiel.gasttrifft;
begin
inc(gasttore);
end;

procedure TSpiel.heimtrifft;
begin
inc(heimtore);
end;


Soweit so gut.....

Nun kommt mein Problem....:

Hier der Quellcode:


Delphi-Quelltext
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:
unit haupt;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
 Forms,  Dialogs, StdCtrls, ExtCtrls, spiel;

type
  Thauptform = class(TForm)
   button1: TButton;
   procedure button1click(Sender : TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  hauptform: Thauptform;
  spiele : array[1..7of TSpiel;

implementation

{$R *.dfm}

procedure Thauptform.button1click(Sender : TObject);
begin
spiele[1].heimtrifft;   // Hier bekomm ich ne ACCESS VIOLATION
end;


Was mach ich falsch.. Warum bekomme ich schon wieder eine access Violation.....
Warum sind die gasttrifft, bzw. heimtrifft Metgoden nicht ansprechbar ?

Bitte bitte helfen :)

Catweasel

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


JoelH - Di 11.11.03 20:07
Titel: hmm,
wenn du eine Klasse erstellst musst du diese erstmal mit Create initialisieren

also

Delphi-Quelltext
1:
Spiel[1] := TSpiel.create;                    


catweasel - Di 11.11.03 20:36
Titel: stimmt da fehler auch der creator.....
Hi,

Du hast geschrieben:

Zitat:

Quelltext
1:
Spiel[1] := TSpiel.create;                    


Ahso, muss man jas für jedes arrayelement einzeln machen ?!.
Ich dachte durch das deklarieren des arrays würden alle elemente mitinitialisiert werden......
:oops:

Catweasel


Keldorn - Di 11.11.03 20:47

ja, du mußt Objekte immer erzeugen und freigeben natürlich auch.

Gugg dir in dem Zusammenhang auch mal TObjectlist an. die ist dafür gemacht, eigene erstellten Objekte zu verwalten und bietet einige Listentypische Operationen (verschieben, löschen ...) du kannst dort zumindestens einstellen, daß die Liste ihre Elemnte auch selbst auf wunsch wieder freigibt.

Mfg Frank


tommie-lie - Di 11.11.03 21:55
Titel: Re: stimmt da fehler auch der creator.....
catweasel hat folgendes geschrieben:
Zitat:

Quelltext
1:
Spiel[1] := TSpiel.create;                    


Ahso, muss man jas für jedes arrayelement einzeln machen ?!.

Nicht direkt:

Delphi-Quelltext
1:
2:
for i := 1 to 7 do
  spiele[i] := TSpiel.Create;

Reicht auch ;-)


catweasel - Mi 12.11.03 00:18
Titel: smile
hi,


Zitat:
Nicht direkt:
Sourcecode:
for i := 1 to 7 do
spiele[i] := TSpiel.Create;

Reicht auch


Allerdings :wink:


Zitat:
Gugg dir in dem Zusammenhang auch mal TObjectlist an. die ist dafür gemacht, eigene erstellten Objekte zu verwalten und bietet einige Listentypische Operationen (verschieben, löschen ...) du kannst dort zumindestens einstellen, daß die Liste ihre Elemnte auch selbst auf wunsch wieder freigibt.


Hmm das werd ich mir gleich mal näher anguggen....

Meine (vielleicht etwas naive :oops: ) Idee wäre gewesen ein "leeres Dummy" Object vom Typ TComponent zu erzeigen, diesem alle Objekte des typs TSpiel als unterordnen (Dummy als Owner bestimmen).. und den Dummy Owner wenn erwünscht fallenlassen wie eine heisse Kartoffel..

Ist das sinnvoll/möglich ? Was ist gutes OOP ?? :wink:

p.s: Wenn ich den create contructor einer Klasse mit override überschreiben will, sagt er immer "Can't override a static method"...
Was an sich klar ist, es sei denn der constructor der Basisklasse wäre als virtual vereinbart worden, oder???
(Ich beschäftige mich noch nich soo lange mit OOP) :oops:

Catweasel


Keldorn - Mi 12.11.03 10:28
Titel: Re: smile
catweasel hat folgendes geschrieben:

Meine (vielleicht etwas naive :oops: ) Idee wäre gewesen ein "leeres Dummy" Object vom Typ TComponent zu erzeigen, diesem alle Objekte des typs TSpiel als unterordnen (Dummy als Owner bestimmen).. und den Dummy Owner wenn erwünscht fallenlassen wie eine heisse Kartoffel..

Ist das sinnvoll/möglich ? Was ist gutes OOP ?? :wink:

möglich schon, aber die Objectlist ist ja dafür da.
Zitat:

p.s: Wenn ich den create contructor einer Klasse mit override überschreiben will, sagt er immer "Can't override a static method"...
Was an sich klar ist, es sei denn der constructor der Basisklasse wäre als virtual vereinbart worden, oder???

die Fehlermeldung im Fenster anklicken und F1 drücken.

Mfg Frank


ErnestoChe - Mi 12.11.03 10:29

Hi,

Catweasel hat folgendes geschrieben:
Was an sich klar ist, es sei denn der constructor der Basisklasse wäre als virtual vereinbart worden, oder???


Richtig. Nur Methoden die als virtual oder dynamic deklariert sind können in Nachfahr-Klassen überschrieben werden. In deinem Fall hast du keine Vorfahr-Klasse angegeben. Also wird automatisch von TObejct abgeleitet und dort ist Create statisch, d.h. weder virtual noch dynamic.

MFG

- Ernesto -


ShadowThief - Mi 12.11.03 13:37
Titel: Re: stimmt da fehler auch der creator.....
catweasel hat folgendes geschrieben:
Ahso, muss man jas für jedes arrayelement einzeln machen ?!.
Ich dachte durch das deklarieren des arrays würden alle elemente mitinitialisiert werden......
:oops:
Catweasel


das hat in dem fall mit initialisieren nix zu tun. die legst im grunde nur pointer an, die sind anfangs alle nil. dann musst du mit der Create-Methode erst ein objekt im speicher anlegen. diese Create-Methode liefert dann die adresse zurück, wo das objekt im speicher liegt. diese adresse weist du ja deinem pointer zu.

shadow.

Moderiert von user profile iconTino: Überflüssige Absätze entfernt.


catweasel - Fr 14.11.03 20:50
Titel: Gibts bei mir nicht :-(
Hi,

Ich hab hier kürzlich den Tipp bekommen :

Zitat:
Gugg dir in dem Zusammenhang auch mal TObjectlist an. die ist dafür gemacht, eigene erstellten Objekte zu verwalten und bietet einige Listentypische Operationen (verschieben, löschen ...) du kannst dort zumindestens einstellen, daß die Liste ihre Elemnte auch selbst auf wunsch wieder freigibt.


Nur gibts bei meinem Delphi den Typ TObjectlist nicht... "Undeclared Identifier" :evil:

Der Typ müsste eigentlich laut Delphi CLX-Hilfe in der Unit "Classes" eingebunden sein. Doch im Quelltext wird ein Typ TObjectlist nicht vereinbart.... Wo ist TObjectlist ?

Ich benutze Delphi 6 Enterprise.

Catweasel


ShadowThief - Fr 14.11.03 21:52

uses Contnrs;

CLX is nich für delphi, da musste die VCL-hilfe nehmen.

shadow.