Autor Beitrag
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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
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:
unit uTContainer;

interface

uses uTRing, Graphics;

type TContainer = class(TObject)
     private
       Item : array [1..5of TRing;   // Instanzen(Objekte) von Klasse TRing
     public
       constructor Create;
       destructor Free;
       procedure Init;

     end;

implementation

// Constructor
constructor TContainer.Create;
begin
     inherited Create;
     Init;
end;

// Destructor
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
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:
unit uTRing;

interface

uses Graphics;

type TRing = class(TObject)
     private
       stift : integer;         // Variable für Stiftdicke
       farbe : TColor;          // Variable für Stiftfarbe
       x1,y1,x2,y2 : integer;   // Variablen für Ringposition
     public
       constructor Create;
       destructor Free;
       procedure Init;
       procedure SetStaerke(dicke : integer);  // Stiftdicke setzen
       function  GetStaerke : integer;         // Stiftdicke ausgeben
       procedure SetFarbe (stiftfarbe : TColor);   // Stiftfarbe setzen
       function  GetFarbe : TColor;                // Stiftfarbe ausgeben
       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. :nixweiss:

Gruß Dude566

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Mitmischer 1703
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Mo 16.11.09 22:14 
Ja aber der Index geht doch bei 0 los. :nixweiss:

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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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



BeitragVerfasst: Di 17.11.09 13:02 
Ich habe mal ein Tutorial dazu geschrieben, eventuell hilft es: www.michael-puff.de/...er/Delphi/Tutorials/
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Di 17.11.09 15:06 
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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. :roll:

Zum Rest: Ich probiere dann mal den Fehler zu beheben, werde mir auch user profile iconLuckies 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 328
Erhaltene Danke: 3

Windows 7
Delphi 7 Pro.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: Di 17.11.09 16:08 
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
Ja aber der Index geht doch bei 0 los. :nixweiss:


Nein ;)

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type TContainer = class(TObject)
     private
       Item : array [1..5of TRing;   // Instanzen(Objekte) von Klasse TRing
     public
       constructor Create;
       destructor Free;
       procedure Init;

     end;


Was genau hast du denn verändert :) ?

_________________
Die Lösung ist nicht siebzehn.
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Di 17.11.09 16:47 
user profile iconCritter hat folgendes geschrieben Zum zitierten Posting springen:
Hi,

[url]hier[/url] hatte ich kürzlich mal ein kleines Beispiel zu inherited gepostet, vielleicht hilft das beim Verständnis.

critter


Ich glaube du hast bei der Angabe des Links einen Fehler gemacht. ;)

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 328
Erhaltene Danke: 3

Windows 7
Delphi 7 Pro.
BeitragVerfasst: Di 17.11.09 17:04 
Hi,
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Di 17.11.09 21:02 
user profile iconMitmischer 1703 hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
Ja aber der Index geht doch bei 0 los. :nixweiss:


Nein ;)

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type TContainer = class(TObject)
     private
       Item : array [1..5of TRing;   // Instanzen(Objekte) von Klasse TRing
     public
       constructor Create;
       destructor Free;
       procedure Init;

     end;


Was genau hast du denn verändert :) ?


Also ich habe in TContainer jetzt folgendes:
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:
unit uTContainer;

interface

uses uTRing, Graphics;

type TContainer = class(TObject)
     private
       Item : array [1..5of TRing;   // Instanzen(Objekte) von Klasse TRing
     public
       constructor Create;
       destructor Destroy;
end;

implementation

// Constructor
constructor TContainer.Create;
var
   i : integer;
begin
     for i := 1 to 5 do
         Item[i] := TRing.Create;
end;

// Destructor
destructor TContainer.Destroy;
var
   i : integer;
begin
     inherited Create;
     for i := 1 to 5 do
         Item[i].Destroy;
end;

end.


Und bekomme immer noch die Zugriffsverletzung, ich dachte ich hätte es jetzt so wie ihr sagt angepasst. :nixweiss:

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Di 17.11.09 21:29 
user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Di 17.11.09 21:54 
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 18.11.09 11:11 
user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
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:
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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. :mrgreen:

Also: destructor Destroy; und dort inherited; nicht vergessen, fertig...
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mi 18.11.09 11:12 
user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
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."