Autor Beitrag
Moony
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 97

Win XP
D7 Prof
BeitragVerfasst: Do 12.05.05 16:04 
Ich hab das Problem: Ich zitiere: [Fehler] mTSpurKugel.pas(12): Eine statische Methode kann nicht überschrieben werden. Also wie ich die Vererbung verstanden habe: Der erbende Klasse muss gesagt werden von wem sie erbt. Will ich einige Methoden ändern, so muss in der Oberklasse hinter die Betreffenen virtual und in der Unterklasse override. Jetzt bekomm ich aber den Fehler. (2x weil ich 2Methoden überschreiben will) Es handelt sich bei dem Programm um ein mehr oder weniger (eher weniger) realistisches Billardspiel.

Im Programm siehts wie folgt aus.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
unit mTKugel; (Oberklasse)
       private
            ... und so weiter
       public
           constructor init (pPosX, pPosY, pRadius, pRichtung, pGeschwindigkeit : double);  virtual;
           procedure loescheDich ( ); virtual;
           ... und so weiter


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
unit mTSpurKugel; (Unterklasse)
interface
  uses
   mSuM,mTTisch,mTKugel;
type
   TSpurKugel = CLASS (TKugel)
   public
     hatBuntstift : Buntstift;
     constructor init (pPosX, pPosY, pRadius, pRichtung : double); override;
     procedure loescheDich ( ); override;
   end;
..und so weiter



Wahrscheinlich bin ich einfach nur zu sehr auf den Fehler eingeschossen, dass ich den Wald vor Bäumen nicht sehe. Hoffe ihr könnt mir helfen

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt.
Moderiert von user profile iconChristian S.: Topic aus VCL (Visual Component Library) verschoben am Do 12.05.2005 um 16:25
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Do 12.05.05 16:20 
Auf den ersten Blick sieht das OK aus.
Zeig mal den Rest :)

_________________
Stellen Sie sich bitte Zirkusmusik vor.
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: Do 12.05.05 23:22 
Moin!

Die Parameterliste im Init bzw. Constructor hat sich geändert, daher die Frage ob du den Originalen verdecken willst oder einen zusätzlichen implementieren willst?

MfG
Muetze1

_________________
49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
iX0r
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34

Ubuntu
D6, Lazarus
BeitragVerfasst: Fr 13.05.05 08:55 
wenn es keine implmentierung in der oberklasse gibt (der methode constructor), dann muss noch ein abstract dahinter. in der art:
ausblenden Delphi-Quelltext
1:
 procedure constructor(...);virtual;abstract;					
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: Fr 13.05.05 10:17 
Moin!

user profile iconiX0r hat folgendes geschrieben:
wenn es keine implmentierung in der oberklasse gibt (der methode constructor), dann muss noch ein abstract dahinter. in der art:
ausblenden Delphi-Quelltext
1:
 procedure constructor(...);virtual;abstract;					


1. Ist es AFAIR nicht möglich das Schlüsselwort Constructor als Methodennamen zu nutzen.
2. Meinte ich direkt den Constructor und keine Methode.
3. Woher weisst du / willst du wissen, dass er in der Klasse nix implementiert in der Klasse?
4. Nur weil man keinen Inhalt in der Methode hat, muss man noch lange nicht zu abstrakt greifen - ein leerer Methodenrumpf reicht auch. Abstrakt wird für andere Dinge / Zwecke benutzt. Oder habe ich das jetzt falsch verstanden? Weil mir kommt es so vor, als das du die Verwendung von Abstract als Folge der nicht-Implementierung benennst. Dabei ist es doch genau anders herum: Durch die Benutzung von Abstract darf keine Implementierung in der Klasse erfolgen - schon allein durch die Definition des Abstract Schlüsselwortes.
5. Die Lösung hilft noch nicht gegen das o.g. Problem.

MfG
Muetze1

_________________
49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
Moony Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 97

Win XP
D7 Prof
BeitragVerfasst: Fr 13.05.05 14:00 
Aha. Und was ich jetzt genau machen soll heißt auf Deutsch?
Okidoki. Wenn ihr alles sehen wollt, dann bitteschön.


hier die ganze Oberklasse
ausblenden volle Höhe 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:
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:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
 unit mTKugel;
interface
  uses
    mSuM,
    mTTisch;
   type
       TKugel = CLASS

       private
           procedure setzeRichtung (pRichtung : double);
           function hPosition ( ): double;
           function vPosition ( ): double;
           function gibRichtung ( ): double;
       public
           constructor init (pPosX, pPosY, pRadius, pRichtung : double);  virtual;
           procedure zeichneDich ( ); virtual;
           procedure loescheDich ( ); virtual;
           procedure bewegeDich ( );
           procedure merke (pTisch : TTisch);
           destructor gibFrei ( );
       protected
           hatBuntstift : Buntstift;
           zPosX : double;
           zPosY : double;
           zRadius : double;
           zRichtung : double;
           kenntTisch : TTisch;
end;

implementation
  constructor TKugel.init (pPosX, pPosY, pRadius, pRichtung : double);
    begin
      hatBuntstift := Buntstift.init;
      zPosX := pPosX;
      zPosY := pPosY;
      zRadius := pRadius;
      zRichtung := pRichtung;
      hatBuntstift.bewegeBis (zPosX, zPosY);
      hatBuntstift.dreheBis (pRichtung);
    end;

  procedure TKugel.merke (pTisch : TTisch);
    begin
      kenntTisch := pTisch;
    end;

  procedure TKugel.zeichneDich ( );
    begin
      hatBuntstift.zeichneKreis (zRadius);
    end;

  procedure TKugel.loescheDich ( );
    begin
      hatBuntstift.radiere ( );
      self.zeichneDich ( );
      hatBuntstift.normal ( );
    end;

  procedure TKugel.bewegeDich ( );
    begin
      self.loescheDich ( );
      hatBuntstift.bewegeUm (0.05);
      if (self.hPosition+zRadius >= kenntTisch.anfangsXP+kenntTisch.tischBreite-4or (self.hPosition-zRadius <= kenntTisch.anfangsXP+4then
        begin
          self.setzeRichtung (180-self.gibRichtung);
      end;
      if (self.vPosition-zRadius <= kenntTisch.anfangsYP+4or (self.vPosition+zRadius >= kenntTisch.anfangsYP+kenntTisch.tischHoehe-4then
        begin
          self.setzeRichtung (360-self.gibRichtung);
      end;
      self.zeichneDich ( );
    end;

  procedure TKugel.setzeRichtung (pRichtung : double);
    begin
      zRichtung := pRichtung;
      hatBuntstift.dreheBis (pRichtung);
    end;

  function TKugel.gibRichtung ( ): double;
    begin
      gibRichtung := zRichtung;
    end;

  function TKugel.hPosition ( ): double;
    begin
      hPosition := hatBuntstift.hPosition ( );
    end;

  function TKugel.vPosition ( ): double;
    begin
      vPosition := hatBuntstift.vPosition ( );
    end;

  destructor TKugel.gibFrei ( );
    begin
      hatBuntstift.gibFrei ( );
    end;
end.



so und die hier die ganze Unterklasse.
ausblenden 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:
unit mTSpurKugel;
interface
  uses
    mSuM,
    mTTisch,
    mTKugel;
type
   TSpurKugel = CLASS (TKugel)
   public
     hatBuntstift : Buntstift;
     constructor init (pPosX, pPosY, pRadius, pRichtung : double); override;
     procedure loescheDich ( ); override;
   end;

implementation
constructor TSpurKugel.init (pPosX, pPosY, pRadius, pRichtung : double);
begin
  inherited init (pPosX, pPosY, pRadius, pRichtung);
  hatBuntstift.runter;
end;

procedure TSpurKugel.loescheDich;
begin
  hatBuntstift.wechsle;
  self.zeichneDich;
end;
end.


Zuletzt bearbeitet von Moony am Sa 14.05.05 08:45, insgesamt 4-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 13.05.05 14:06 
Erstmal ein Hinweis, bevor ich mir das ansehe:
Bevor du Quelltext in das Eingabefeld hier schreibst kannst du oben auf Delphi drücken, und danach nochmal, dann wird der Quelltext hier formatiert dargestellt.
Code ist nicht so gut, weil damit nicht Delphi-Code hervorgehoben wird.
Moony Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 97

Win XP
D7 Prof
BeitragVerfasst: Fr 13.05.05 14:11 
ahhh. Das sieht ja gleich schon ganz anders aus. Dankeschön
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 13.05.05 14:13 
1. Also ein Fehler ist schonmal, dass du in Zeile 18 von deiner Unterklasse inherited mit den Parametern deiner Unterklasse aufrufst. Da musst du aber die der Oberklasse nehmen und die Geschwindigkeit mit angeben!

//edit: :oops:, in deiner neuen Oberklasse ist das ja gar nicht mehr drin, also ist das Ok...

2. Woher die Fehlermeldung kommt, verstehe ich allerdings nicht, denn mit der Verwendung von virtual ist die Methode nicht mehr statisch...

Ich werde das mal zu Hause ausprobieren, was bei mir passiert!
Moony Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 97

Win XP
D7 Prof
BeitragVerfasst: Fr 13.05.05 14:16 
Entschuldigung, das mit der Geschwindigkeit hatte ich nachträglich rausgenommen. Weil eigentlich sollte es rein, aber solange das Programm mit dem verhexten Fehler nicht funktioniert hab ich es rausgenommen. Das waren also Restbeständen die ich übersehen hatte. Sorry

Ach noch was die Fehler tauchen in Zeile 11 und 12 von der Unterklasse auf. Falls das hilft. Hoffe ich
Moony Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 97

Win XP
D7 Prof
BeitragVerfasst: Fr 13.05.05 16:52 
Ist es vielleicht möglich, dass mein Delphi aufm Rechner keine Vererbung zulässt? Also das ich irgendwo was umstellen muss?? Vielleicht ne blöde Frage, aber ich wüsst sonst keine andere Erklärung mehr.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 13.05.05 17:05 
Eventuell hilft auch mein Tutorial: tutorials.luckie-online.de
Moony Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 97

Win XP
D7 Prof
BeitragVerfasst: Fr 13.05.05 18:05 
Jetzt weiß ich überhaupt nichts mehr. Ich hab mal aus reiner Verzweiflung virtual und override aus dem Programm gelöscht und jetzt funktioniert es..... Jedoch kommt wenn ich meine TSpurKugel durch den Tastendruck 's' aufrufen möchte ein Anwendungsfehler:
Zitat:
Exception EAccessViolation in Modul Billard.exe bei 00044D05.
Zugriffsverletzung bei Adresse 00444D05 in Modul 'Billard.exe'. Lesen von Adresse 00000000.


Und beim zweiten Starten kommt folgender Fehler:
Zitat:
Im Projekt Billard.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00444D05 in Modul 'Billard.exe'. Lesen von Adresse 00000000'. Prozeß wurde Angehalten. Mit Einzelne Anweisung oder Start fortsetzen.

dann wird ein grüner Pfeil auf die Zeile 19 von der Unterklasse angezeigt.
Hab ich ein mutiertes Programm oder will es mich einfach nur zur Weißglut bringen, wenn ja hat es das geschafft.

Moderiert von user profile iconTino: Quote-Tags hinzugefügt.


Zuletzt bearbeitet von Moony am Sa 14.05.05 17:35, insgesamt 1-mal bearbeitet
Moony Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 97

Win XP
D7 Prof
BeitragVerfasst: Fr 13.05.05 19:28 
Ok, ich habs Problem weg. Es lag an einem Simekolonfehler im Hauptprogramm hinter einem gibFrei. Denn da stand keins.... Echt panne son Fehler!!!
Jetzt hab ich aber immmernoch das Problem damit, dass meine TSpurKugel zwar richtig programmiert ist ich sie aber nicht aufrufen kann wegen diesem komischen Zugriffsfehler.
Hoffe ihr habt darauf ne Erklärung??
Moony Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 97

Win XP
D7 Prof
BeitragVerfasst: Fr 13.05.05 19:33 
Ok ich nehm alles zurück!! Der blöde Fehler mit der statischen Methode ist bei erneutem starten von Delphi wieder da. ÜBERRASCHUNG.
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: Sa 14.05.05 00:24 
Moin!

1. hatBuntstift sollte in der Basisklasse im Protected Teil stehen
2. hatBuntstift hast du in der abgeleiteten Klasse neu definiert - also ist das eine neue Instanz. Dazu besteht das Problem, dass du keine neue Instanz anlegst für diese Variable und somit Probleme beim Zugriff bekommst.

Alles weitere schaue ich mir nachher an...

MfG
Muetze1

_________________
49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
Moony Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 97

Win XP
D7 Prof
BeitragVerfasst: Sa 14.05.05 08:35 
Also gut. So wie ich dich vertanden habe. Muss ich in der Unterklasse im public-Teil den Buntstift rausnehmen und ihn nur in der Oberklasse unter protected stehen lassen.
Aha, gut gut. Das klappt auf einmal. Schön schön. Aber wenn ich nun die TSpurKugel mit dem Tastendruck 's' aufrufen will kommt immernoch dieser komische Zugriffsfehler. Und nu?

Moderiert von user profile iconTino: Quote-Tags hinzugefügt.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Sa 14.05.05 17:26 
Könnte der Fehler in Buntstift.wechsle sein?
Moony Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 97

Win XP
D7 Prof
BeitragVerfasst: Sa 14.05.05 17:28 
Wie meinsten das?? Den Buntstift müsste die SPurkugel doch kennen und der Befehl ist auch der richtige....
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Sa 14.05.05 17:31 
Du benutzt die Klasse Buntstift in TKugel.
Falls aber in der Klasse schon ein Fehler ist (z.B. in der Methode Wechsle), kannst du in Kugel lange nach dem Fehler suchen.