| Autor |
Beitrag |
Dude566
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Mo 16.11.09 20:57
Also wir haben in der Schule jetzt mal mit OOP angefangen, ich komme nicht so ganz mit den Unterrichtsmethoden zurecht (Chaos).
Ich hab eine Container Klasse und eine Klasse TRing, doch ich bekomme eine Zugriffsverletzung wenn ich TRing in TContainer erstellen möchte.
TContainer
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:
| unit uTContainer;
interface
uses uTRing, Graphics;
type TContainer = class(TObject) private Item : array [1..5] of TRing; public constructor Create; destructor Free; procedure Init;
end;
implementation
constructor TContainer.Create; begin inherited Create; Init; end;
destructor TContainer.Free; var i : integer; begin for i := 0 to 4 do Item[i].Free; end;
procedure TContainer.Init; var i : integer; begin for i := 0 to 4 do Item[i] := TRing.Create; end;
end. |
TRing
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:
| unit uTRing;
interface
uses Graphics;
type TRing = class(TObject) private stift : integer; farbe : TColor; x1,y1,x2,y2 : integer; public constructor Create; destructor Free; procedure Init; procedure SetStaerke(dicke : integer); function GetStaerke : integer; procedure SetFarbe (stiftfarbe : TColor); function GetFarbe : TColor; procedure SetPosition(ObenLinksX,ObenLinksY,UntenRechtsX,UntenRechtsY : integer); procedure Zeichnen (myCanvas : TCanvas); end;
implementation
procedure TRing.SetStaerke(dicke : integer); begin stift := dicke; end;
function TRing.GetStaerke : integer; begin result := stift; end;
procedure TRing.SetFarbe (stiftfarbe : TColor); begin farbe := stiftfarbe; end;
function TRing.GetFarbe : TColor; begin result := stift; end;
procedure TRing.SetPosition(ObenLinksX,ObenLinksY,UntenRechtsX,UntenRechtsY : integer); begin x1 := ObenLinksX; y1 := ObenLinksY; x2 := UntenRechtsX; y2 := UntenRechtsY; end;
procedure TRing.Zeichnen (myCanvas : TCanvas); begin myCanvas.Pen.Color := GetFarbe; myCanvas.Pen.Width := GetStaerke; myCanvas.Ellipse(x1,y1,x2,y2); end;
constructor TRing.Create; begin inherited Create; Init; end;
destructor TRing.Free; begin end;
procedure TRing.Init; begin SetStaerke(3); SetFarbe(clLime); SetPosition(50,50,150,150); end;
end. |
Beim Highlight tritt der Fehler auf, ich stehe auf dem Schlauch und weis nicht weiter.
Gruß Dude566
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
Mitmischer 1703
      
Beiträge: 754
Erhaltene Danke: 19
Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
|
Verfasst: Mo 16.11.09 21:30
Item ist ein Array von 1..5, aber in der for-Schleife greifst du auf 0..4 zu - und wenn du auf 0 zugreifst, knallt's 
_________________ Die Lösung ist nicht siebzehn.
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Mo 16.11.09 22:14
Ja aber der Index geht doch bei 0 los.
Und selbst wenn ich es korrigiere wie du sagst tritt der fehler immer noch auf.
Auch eine Zugriffsverletzung.
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
Niko S.
      
Beiträge: 566
Erhaltene Danke: 10
Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
|
Verfasst: Di 17.11.09 07:09
Sicher dass du bei der for schleife jetzt 1 to 5 hast?
Außerdem musst du bei "Free" nicht auch zum schluss den vorherigen Code übernehmen "inhertied" ?
(Schlimm wenn einem die richtigen Worte fehlen)
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 17.11.09 12:00
1. Ein Destructor heißt Destroy
2. Free Überschreibt man nicht
3. Maximal Destroy überschreiben, dann aber nicht vergessen, inherited aufzurufen (WICHTIG!)
4. Deine Indizes hauen nicht hin (Deklaration 1..5, Nutzung in der Schleife 0..4)
5. Warum lagerst Du das Zeug in eine zusätzliche Methode Init aus?
6. Ggf. eine etwas regelmäßiger Code-Formatierung angewöhnen.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 17.11.09 13:02
Ich habe mal ein Tutorial dazu geschrieben, eventuell hilft es: www.michael-puff.de/...er/Delphi/Tutorials/
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Di 17.11.09 15:06
BenBE hat folgendes geschrieben : | 1. Ein Destructor heißt Destroy
2. Free Überschreibt man nicht
3. Maximal Destroy überschreiben, dann aber nicht vergessen, inherited aufzurufen (WICHTIG!)
|
Unsere Lehrerin hat uns das gesagt, aber die hat meistens eh keine Ahnung warum sie das so und so macht.
Zum Rest: Ich probiere dann mal den Fehler zu beheben, werde mir auch Luckies Tutorial mal reinziehen, und mich bei Fragen dann wieder hier melden.
Edit: Warum im Destructor das inherited aufrufen? Ich begfreife nicht so recht was das macht, unsere Lehrerin konnte es auch nicht erklären.
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Di 17.11.09 15:36
Du überschreibst ja den Destruktor von TObject, weil Du von TObject abgeleitet hast. Mit dem Aufruf von Inherited ruft Du dann den Destructor der Basisklasse (hier TObject) auf. So wird der Code, der im Destructor von TObject steht, auch ausgeführt. Ohne Inherited unterschlägst Du ihn. Das kann gefährliche Nebeneffekte haben.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Critter
      
Beiträge: 328
Erhaltene Danke: 3
Windows 7
Delphi 7 Pro.
|
Verfasst: Di 17.11.09 15:53
Hi,
hier hatte ich kürzlich mal ein kleines Beispiel zu inherited gepostet, vielleicht hilft das beim Verständnis.
critter
_________________ Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
Zuletzt bearbeitet von Critter am Di 17.11.09 17:02, insgesamt 1-mal bearbeitet
|
|
Mitmischer 1703
      
Beiträge: 754
Erhaltene Danke: 19
Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
|
Verfasst: Di 17.11.09 16:08
_________________ Die Lösung ist nicht siebzehn.
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Di 17.11.09 16:47
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
HelgeLange
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: Di 17.11.09 16:56
Du rufst auch ein inherited beim Create auf, obwohl du es nicht überschrieben hast und ich glaube, TObject bietet auch kein Create an.
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
Critter
      
Beiträge: 328
Erhaltene Danke: 3
Windows 7
Delphi 7 Pro.
|
Verfasst: Di 17.11.09 17:04
Hi,
Dude566 hat folgendes geschrieben : | Ich glaube du hast bei der Angabe des Links einen Fehler gemacht.  |
Ja das habe ich wohl  . Habe den Link oben Repariert, aber zur Sicherheit gibt es den jetzt gleich noch einmal  : www.delphi-forum.de/....php?p=580740#580740
critter
_________________ Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Di 17.11.09 21:02
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 17.11.09 21:26
1. Verschieb das inherited create; auch ins Create.. im Destroy hat das nix zu suchen.
2. Nicht Item[i].Destroy aufrufen, sondern .Free
ersteres sollte dir bei deinem Problem weiterhelfen.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Di 17.11.09 21:29
Xentar hat folgendes geschrieben : | 1. Verschieb das inherited create; auch ins Create.. im Destroy hat das nix zu suchen.
2. Nicht Item[i].Destroy aufrufen, sondern .Free
ersteres sollte dir bei deinem Problem weiterhelfen. |
Nein hat es leider nicht, und ich habe Free in Destroy auf anraten einer deiner Vorredner geändert.
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
HelgeLange
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: Di 17.11.09 21:48
Man ruft kein destroy auf, nimm free
ausserdem lösch das "inherited Create" complett raus, TObject hat kein create zum überschreiben und im Destroy hat das schon garnichts zu suchen.
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 17.11.09 21:54
Dude566 hat folgendes geschrieben : | | Nein hat es leider nicht |
Maa, dann schmeiß halt den Debugger an
Setz nen Haltepunkt, geh Schritt für Schritt durch, und guck, wo der sich aufhängt.. vielleicht hast auch noch nen Fehler in der Ring Klasse, oder so?
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 18.11.09 11:11
Xentar hat folgendes geschrieben : | | vielleicht hast auch noch nen Fehler in der Ring Klasse, oder so? |
Zumindest in der geposteten Version ist das auch so, wie sofort zu sehen ist: Dude566 hat folgendes geschrieben : | Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| destructor Free; ...
destructor TRing.Free; begin end; | |
Was passiert jetzt? Einerseits ist Free jetzt nicht mehr das originale Free, andererseits wird zusätzlich auch noch der geerbte Destruktor nicht mehr aufgerufen.
Kurz gesagt: alles kaputt was kaputtzumachen geht.
Also: destructor Destroy; und dort inherited; nicht vergessen, fertig...
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Mi 18.11.09 11:12
Xentar hat folgendes geschrieben : | Maa, dann schmeiß halt den Debugger an  |
Tut mir leid jetzt hier quasi-offtopic dazwischenzuhauen.
Debugging lernt man in der Schule nicht. Zumindest kenne ich keinen wo das gemacht worden wäre. Warum das so ist, keine Ahnung. Entspricht aber voll und ganz dem im deutschen Schulsystem verankerten "auswendiglernen statt verstehen". Selber debuggen würde ja eine Fähigkeit schulen, wo kommen wir denn da hin. Da lernt man lieber Code auswendig und schreibt den dann in irgendwelchen Tests hin.
Wäre es anders, würden diesem Forum locker 50% der Fragen "erspart" bleiben.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
|