| Autor |
Beitrag |
catweasel
      
Beiträge: 487
Erhaltene Danke: 1
Win 7 64bit
Delphi 7 Second Sedition V7.2
|
Verfasst: Di 11.11.03 19:31
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;
public function wersieger(): string; procedure heimtrifft; procedure gasttrifft; 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 public end;
var hauptform: Thauptform; spiele : array[1..7] of TSpiel;
implementation
{$R *.dfm}
procedure Thauptform.button1click(Sender : TObject); begin spiele[1].heimtrifft; 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 Tino: Code- durch Delphi-Tags ersetzt.
_________________ Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
|
|
JoelH
      
Beiträge: 806
Erhaltene Danke: 17
Win10
Delphi Alexandria 11.2 Patch 1
|
Verfasst: 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; |
_________________ mfg. Joel
|
|
catweasel 
      
Beiträge: 487
Erhaltene Danke: 1
Win 7 64bit
Delphi 7 Second Sedition V7.2
|
Verfasst: 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......
Catweasel
_________________ Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Di 11.11.03 21:55
Titel: Re: stimmt da fehler auch der creator.....
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
catweasel 
      
Beiträge: 487
Erhaltene Danke: 1
Win 7 64bit
Delphi 7 Second Sedition V7.2
|
Verfasst: 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
| 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  ) 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 ??
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)
Catweasel
_________________ Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Mi 12.11.03 10:28
Titel: Re: smile
| catweasel hat folgendes geschrieben: |
Meine (vielleicht etwas naive ) 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 ??
|
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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
ErnestoChe
      
Beiträge: 528
Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
|
Verfasst: 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
      
Beiträge: 278
|
Verfasst: 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......
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 Tino: Überflüssige Absätze entfernt.
_________________ "soylent grün ist menschenfleisch!"
|
|
catweasel 
      
Beiträge: 487
Erhaltene Danke: 1
Win 7 64bit
Delphi 7 Second Sedition V7.2
|
Verfasst: 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"
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
_________________ Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
|
|
ShadowThief
      
Beiträge: 278
|
Verfasst: Fr 14.11.03 21:52
uses Contnrs;
CLX is nich für delphi, da musste die VCL-hilfe nehmen.
shadow.
_________________ "soylent grün ist menschenfleisch!"
|
|