Zugriffsverletzung - Thread
spacer
Autor Nachricht
schumann.vas
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43

Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
BeitragVerfasst: Mi 14.12.11 19:24 
Hey,
ich habe ein kleines Spiel geschrieben, die Auswahl der Level macht mir im moment Probleme..
Ich erhalte immer eine Fehlermeldung das eine Zugriffsverletzung vorliegt und der Debugger spuckt aus,
dass iwas mit Treads nicht passt.

Erstmal der Quellcode:
Form1, Hauptseite:
ausblenden volle Höhe Delphi-Quelltext markieren
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:
unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, mmSystem, mSchwein, mSpielfeld,
Vcl.Buttons, Unit2;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;
Spielfeld: TSpielfeld;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
Form2.Schw;
Spielfeld:=TSpielfeld.Create;
Spielfeld.InitSpiel
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
try
Spielfeld.SetzeX(StrToInt(Form1.Edit1.Text));
Spielfeld.SetzeY(StrToInt(Form1.Edit2.Text));
Spielfeld.GibEditGefangen;
if Spielfeld.GibEditGefangen=true then
if Form2.RadioButton1.Checked=True then
begin
sndPlaySound('win.wav',SND_ASYNC);
showmessage('Du hast Edit gefangen! Gewonnen!')
end
else showmessage('Du hast Edit gefangen! Gewonnen!')
else if Form2.RadioButton1.Checked=True then
begin
sndPlaySound('fail.wav',SND_ASYNC);
showmessage ('Du hast Edit nicht gefangen! Sorry!')
end
else showmessage ('Du hast Edit nicht gefangen! Sorry!')
except on EConvertError do
showmessage('Du musst schon eine Zahl eingeben, damit es funktioniert!')
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Form2.Schw;
Spielfeld.Create;
Spielfeld.InitSpiel;
Edit1.Text:=('x-Koordinate');
Edit2.Text:=('y-Koordinate')
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
close
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Form2.Show
end;

end.


Form2, Einstellungsseite
ausblenden volle Höhe Delphi-Quelltext markieren
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:
unit Unit2;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.Imaging.pngimage,
Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.Imaging.GIFImg, mSchwein;

type
TForm2 = class(TForm)
PageControl1: TPageControl;
Audio: TTabSheet;
Schwierigkeit: TTabSheet;
Button1: TButton;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
Image1: TImage;
Image2: TImage;
RadioButton3: TRadioButton;
RadioButton4: TRadioButton;
RadioButton5: TRadioButton;
RadioButton6: TRadioButton;
Image3: TImage;
procedure Button1Click(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
procedure Schw;

private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form2: TForm2;
Schwein : TSchwein;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
Form2.Hide
end;

procedure TForm2.RadioButton1Click(Sender: TObject);
begin
RadioButton2.Checked:=false;
Image1.Visible:=true;
Image2.Visible:=false
end;

procedure TForm2.RadioButton2Click(Sender: TObject);
begin
RadioButton1.Checked:=false;
Image1.Visible:=false;
Image2.Visible:=true
end;

procedure TForm2.Schw;
begin
if RadioButton3.Checked=true then
Schwein.SetzeA(1);
if RadioButton4.Checked=true then
Schwein.SetzeA(2);
if RadioButton5.Checked=true then
Schwein.SetzeA(3);
if RadioButton6.Checked=true then
Schwein.SetzeA(4)
end;

end.


Unit Schwein:
ausblenden volle Höhe Delphi-Quelltext markieren
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:
UNIT mSchwein;

interface



type
TSchwein = class

private //Attribute
x : Byte;
y : Byte;
a : Byte;


public //Methoden
constructor Create; virtual;
function GibX : Byte; virtual;
function GibY : Byte; virtual;
function GibA : Byte; virtual;
procedure SetzeA (pA:Byte); virtual;

end;

implementation

//+---------------------------------------------------------------------
//| TSchwein: Methodendefinition
//+---------------------------------------------------------------------

//-------- Create (public) ---------------------------------------------
constructor TSchwein.Create;
begin
x:=(random(GibA))+1;
y:=(random(GibA))+1
end;

//-------- GibX (public) -----------------------------------------------
function TSchwein.GibX : Byte;
begin
result := x
end;

//-------- GibY (public) -----------------------------------------------
function TSchwein.GibY : Byte;
begin
result := y
end;

function TSchwein.GibA : Byte;
begin
result := a
end;

procedure TSchwein.SetzeA (pA:Byte);
begin
a:= pA
end;

end.


Unit Spielfeld:
ausblenden volle Höhe Delphi-Quelltext markieren
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:
UNIT mSpielfeld;

interface

uses mSchwein;

type
TSpielfeld = class

private //Attribute
EditGefangen : Boolean;
x : Byte;
y : Byte;
Sau : TSchwein;


public //Methoden
procedure InitSpiel; virtual;
procedure SetzeX (pX: Byte); virtual;
procedure SetzeY (pY: Byte); virtual;
function GibEditGefangen : Boolean; virtual;
end;

implementation

//+---------------------------------------------------------------------
//| TSpielfeld: Methodendefinition
//+---------------------------------------------------------------------

//-------- InitSpiel (public) ------------------------------------------
procedure TSpielfeld.InitSpiel;
begin
Sau:=TSchwein.Create;
EditGefangen:=false
end;

//-------- SetzeX (public) ---------------------------------------------
procedure TSpielfeld.SetzeX (pX: Byte);
begin
x := pX
end;

//-------- SetzeY (public) ---------------------------------------------
procedure TSpielfeld.SetzeY (pY: Byte);
begin
y := pY
end;

//-------- GibEditGefangen (public) ------------------------------------
function TSpielfeld.GibEditGefangen : Boolean;
begin
if ((x=Sau.GibX) and (y=Sau.GibY)) then
EditGefangen:=true
else
EditGefangen:=false;
result := EditGefangen
end;

end.


Der Fehler betrifft die Level-Auswahl , also Form2.Schw sowie TSchwein.SetzeA und damit indirekt auch das Schwein selbst...meine Vermutung...die Koordinaten werden dem Schwein zugewiesen obwohl das Schwein noch nicht existiert bzw. das Schwein ist einfach nicht bekannt...ich weiß nur nicht wie ichs ändere...LG :)


Moderiert von user profile iconTh69: Topic aus Open Source Projekte verschoben am Mi 14.12.2011 um 18:59
Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mi 14.12.2011 um 21:44
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
EE-Maler
Beiträge: 1754
Erhaltene Danke: 62

Windows XP
Delphi (2005 Bug Edition), Java (Eclipse), Haskell (ghci), C++ (Visual Studio 2010, Qt Creator)
BeitragVerfasst: Mi 14.12.11 19:41 
So wie ich das sehe ist es ein ganz klassischer Fall:

Du erzeugst dein Objekt nicht und kannst entsprechend nicht drauf zugreifen:
user profile iconschumann.vas hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var
Form2: TForm2;
Schwein : TSchwein;

[...]

procedure TForm2.Schw;
begin
if RadioButton3.Checked=true then
Schwein.SetzeA(1);
if RadioButton4.Checked=true then
Schwein.SetzeA(2);
if RadioButton5.Checked=true then
Schwein.SetzeA(3);
if RadioButton6.Checked=true then
Schwein.SetzeA(4)
end;


Tip: Breakpoints helfen :mrgreen:

PS: Die Einrückung in TForm2.Schw ist total irreführend ;)

_________________
a broken heart is like a broken window - it'll never heal
Jen, [this computer] is infected. If this was a human being, I'd shoot it in the face. (IT Crowd)

Für diesen Beitrag haben gedankt: schumann.vas
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
schumann.vas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43

Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
BeitragVerfasst: Mi 14.12.11 19:58 
Mein Objekt erzeug ich ja schon..nur nicht an der stelle..das schwein..es muss ja das selbe sein, wenn ich es hier neu erstelle...dann hab ich doch noch eins..und das andre kann ich doch damit auch net verändern oder?!...und die breakpoints..da hat er überall nen häckchen gemacht...*verwirrt* :D
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
EE-Maler
Beiträge: 1754
Erhaltene Danke: 62

Windows XP
Delphi (2005 Bug Edition), Java (Eclipse), Haskell (ghci), C++ (Visual Studio 2010, Qt Creator)
BeitragVerfasst: Mi 14.12.11 21:20 
"Schwein" erzeugst du nirgends, nur "Sau", was Teil vom Spielfeld ist.
user profile iconschumann.vas hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
//-------- InitSpiel (public) ------------------------------------------
procedure TSpielfeld.InitSpiel;
begin
Sau:=TSchwein.Create;


An das kommst du aber niemals wieder ran, da es private ist. Du kannst also von einer Klasse außerhalb von TSpielfeld nicht darauf zugreifen.

Wenn du es public machst, dann könntest du mit Spielfeld.Sau drauf zugreifen, und das dann auch in Unit2 verwenden. Wenn man davon absieht, dass Spielfeld in Unit1 definiert ist und Unit1 nicht in Unit2 eingebunden ist (unter "implementation", sonst gibt ne zirkuläre Referenz) ;)

_________________
a broken heart is like a broken window - it'll never heal
Jen, [this computer] is infected. If this was a human being, I'd shoot it in the face. (IT Crowd)

Für diesen Beitrag haben gedankt: schumann.vas
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
schumann.vas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43

Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
BeitragVerfasst: Do 15.12.11 07:37 
So..ich habe jetzt die Sau in der Unit mSchwein public gemacht...und in der Unit2 siehts wiefolgt aus:
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var
Form2: TForm2;
Spielfeld: TSpielfeld;
.
.
.
procedure TForm2.Schw;
begin
if RadioButton3.Checked=true then
Spielfeld.Sau.SetzeA(1);
if RadioButton4.Checked=true then
Spielfeld.Sau.SetzeA(2);
if RadioButton5.Checked=true then
Spielfeld.Sau.SetzeA(3);
if RadioButton6.Checked=true then
Spielfeld.Sau.SetzeA(4);
end;


Jetzt müsste das doch funzen?..tut es aber nicht! ._. *zu blöd bin*
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
EE-Maler
Beiträge: 1754
Erhaltene Danke: 62

Windows XP
Delphi (2005 Bug Edition), Java (Eclipse), Haskell (ghci), C++ (Visual Studio 2010, Qt Creator)
BeitragVerfasst: Do 15.12.11 08:22 
Nein, kann es nicht, da du erst Form2.Schw aufrufst und dann dein Objekt erzeugst
user profile iconschumann.vas hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
Form2.Schw;
Spielfeld:=TSpielfeld.Create;
Spielfeld.InitSpiel
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Form2.Schw;
Spielfeld.Create;
Spielfeld.InitSpiel;
Edit1.Text:=('x-Koordinate');
Edit2.Text:=('y-Koordinate')
end;


Es ist übrigens ganz schlecht, dass du jedesmal wenn du Form2.Schw aufrufst das Spielfeld neu erzeugst ;) Wenn dann müsstest du wenigstens vorher das Spielfeld freigeben(glaube aber nicht, dass du das willst).

_________________
a broken heart is like a broken window - it'll never heal
Jen, [this computer] is infected. If this was a human being, I'd shoot it in the face. (IT Crowd)

Für diesen Beitrag haben gedankt: schumann.vas
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
schumann.vas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43

Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
BeitragVerfasst: Do 15.12.11 15:26 
Okee...wiefolgt abgeändert:
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
Spielfeld:=TSpielfeld.Create;
Spielfeld.InitSpiel;
Form2.Schw;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Spielfeld.Create;
Spielfeld.InitSpiel;
Form2.Schw;
Edit1.Text:=('x-Koordinate');
Edit2.Text:=('y-Koordinate')
end;


Iwas stimmt aber immernoch nich :(
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
EE-Maler
Beiträge: 1754
Erhaltene Danke: 62

Windows XP
Delphi (2005 Bug Edition), Java (Eclipse), Haskell (ghci), C++ (Visual Studio 2010, Qt Creator)
BeitragVerfasst: Do 15.12.11 19:03 
user profile iconschumann.vas hat folgendes geschrieben Zum zitierten Posting springen:
Iwas stimmt aber immernoch nich :(

Welcher Fehler kommt denn?

user profile iconschumann.vas hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
procedure TForm1.Button2Click(Sender: TObject);
begin
Spielfeld.Create;
Spielfeld.InitSpiel;
Form2.Schw;


Also die Zeile ist komisch...ich kann garnicht sagen was da letztendlich eigentlich passiert, aber den Constructor solltest du auf keinen Fall so von Hand aufrufen (Zeile einfach weglassen).

Klar muss dir sein dass du jedesmal bei Button2.OnClick dein Spielfeld neu initialisierst (d.h. alles alte ist damit weg).

_________________
a broken heart is like a broken window - it'll never heal
Jen, [this computer] is infected. If this was a human being, I'd shoot it in the face. (IT Crowd)

Für diesen Beitrag haben gedankt: schumann.vas
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
schumann.vas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43

Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
BeitragVerfasst: Do 15.12.11 20:08 
Stimmt..das mit dem Spielfeld.Create ist mir jetzt auch schleierhaft..
Button2Click ist ein Button um ein neues Spiel zu beginnen..wenn entweder das eine Gewonnen ist oder so..
Der ist also durchaus so gewollt (hätt ich natürlich eher sagen können^^)..

Der Fehler der auftaucht ist immernoch der gleiche:
Zitat:
Zugriffsverletzung bei Adresse 00549326 in Modul "Edit.exe". Lesen von Adresse 000003B0.


Danke erstmal für die bisherigen Bemühungen! :)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
EE-Maler
Beiträge: 1754
Erhaltene Danke: 62

Windows XP
Delphi (2005 Bug Edition), Java (Eclipse), Haskell (ghci), C++ (Visual Studio 2010, Qt Creator)
BeitragVerfasst: Fr 16.12.11 00:59 
Poste bitte nochmal deine Unit2, da sollte sich ja einiges geändert haben. Dann gucke ich nochmal drüber ;)

_________________
a broken heart is like a broken window - it'll never heal
Jen, [this computer] is infected. If this was a human being, I'd shoot it in the face. (IT Crowd)

Für diesen Beitrag haben gedankt: schumann.vas
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
schumann.vas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43

Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
BeitragVerfasst: Fr 16.12.11 07:22 
Unit 2 alleine hat sich ja nicht soo viel geändert...ich poste fix noch mal alles^^

Unit1:
ausblenden volle Höhe Delphi-Quelltext markieren
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:
unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, mmSystem, mSchwein, mSpielfeld,
Vcl.Buttons, Unit2;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;
Spielfeld: TSpielfeld;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
Spielfeld:=TSpielfeld.Create;
Spielfeld.InitSpiel;
Form2.Schw;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
try
Spielfeld.SetzeX(StrToInt(Form1.Edit1.Text));
Spielfeld.SetzeY(StrToInt(Form1.Edit2.Text));
Spielfeld.GibEditGefangen;
if Spielfeld.GibEditGefangen=true then
if Form2.RadioButton1.Checked=True then
begin
sndPlaySound('win.wav',SND_ASYNC);
showmessage('Du hast Edit gefangen! Gewonnen!')
end
else showmessage('Du hast Edit gefangen! Gewonnen!')
else if Form2.RadioButton1.Checked=True then
begin
sndPlaySound('fail.wav',SND_ASYNC);
showmessage ('Du hast Edit nicht gefangen! Sorry!')
end
else showmessage ('Du hast Edit nicht gefangen! Sorry!')
except on EConvertError do
showmessage('Du musst schon eine Zahl eingeben, damit es funktioniert!')
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Spielfeld.InitSpiel;
Form2.Schw;
Edit1.Text:=('x-Koordinate');
Edit2.Text:=('y-Koordinate')
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
close
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Form2.Show
end;

end.


Unit2:
ausblenden volle Höhe Delphi-Quelltext markieren
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:
unit Unit2;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.Imaging.pngimage,
Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.Imaging.GIFImg, mSchwein, mSpielfeld;

type
TForm2 = class(TForm)
PageControl1: TPageControl;
Audio: TTabSheet;
Schwierigkeit: TTabSheet;
Button1: TButton;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
Image1: TImage;
Image2: TImage;
RadioButton3: TRadioButton;
RadioButton4: TRadioButton;
RadioButton5: TRadioButton;
RadioButton6: TRadioButton;
Image3: TImage;
procedure Button1Click(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
procedure Schw;

private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form2: TForm2;
Spielfeld: TSpielfeld;

implementation

{$R *.dfm}

procedure TForm2.Schw;
begin
if RadioButton3.Checked=true then
Spielfeld.Sau.SetzeA(1);
if RadioButton4.Checked=true then
Spielfeld.Sau.SetzeA(2);
if RadioButton5.Checked=true then
Spielfeld.Sau.SetzeA(3);
if RadioButton6.Checked=true then
Spielfeld.Sau.SetzeA(4);
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
Form2.Hide
end;

procedure TForm2.RadioButton1Click(Sender: TObject);
begin
RadioButton2.Checked:=false;
Image1.Visible:=true;
Image2.Visible:=false
end;

procedure TForm2.RadioButton2Click(Sender: TObject);
begin
RadioButton1.Checked:=false;
Image1.Visible:=false;
Image2.Visible:=true
end;

end.


mSchwein:
ausblenden volle Höhe Delphi-Quelltext markieren
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:
UNIT mSchwein;

interface



type
TSchwein = class

private //Attribute
x : Byte;
y : Byte;
a : Byte;


public //Methoden
constructor Create; virtual;
function GibX : Byte; virtual;
function GibY : Byte; virtual;
function GibA : Byte; virtual;
procedure SetzeA (pA:Byte); virtual;

end;

implementation

//+---------------------------------------------------------------------
//| TSchwein: Methodendefinition
//+---------------------------------------------------------------------

//-------- Create (public) ---------------------------------------------
constructor TSchwein.Create;
begin
x:=(random(GibA))+1;
y:=(random(GibA))+1
end;

//-------- GibX (public) -----------------------------------------------
function TSchwein.GibX : Byte;
begin
result := x
end;

//-------- GibY (public) -----------------------------------------------
function TSchwein.GibY : Byte;
begin
result := y
end;

function TSchwein.GibA : Byte;
begin
result := a
end;

procedure TSchwein.SetzeA (pA:Byte);
begin
a:= pA
end;

end.


mSpielfeld:
ausblenden volle Höhe Delphi-Quelltext markieren
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:
UNIT mSpielfeld;

interface

uses mSchwein;

type
TSpielfeld = class

private //Attribute
EditGefangen : Boolean;
x : Byte;
y : Byte;



public //Methoden
Sau : TSchwein;
procedure InitSpiel; virtual;
procedure SetzeX (pX: Byte); virtual;
procedure SetzeY (pY: Byte); virtual;
function GibEditGefangen : Boolean; virtual;

end;

implementation

//+---------------------------------------------------------------------
//| TSpielfeld: Methodendefinition
//+---------------------------------------------------------------------

//-------- InitSpiel (public) ------------------------------------------
procedure TSpielfeld.InitSpiel;
begin
Sau:=TSchwein.Create;
EditGefangen:=false
end;

//-------- SetzeX (public) ---------------------------------------------
procedure TSpielfeld.SetzeX (pX: Byte);
begin
x := pX
end;

//-------- SetzeY (public) ---------------------------------------------
procedure TSpielfeld.SetzeY (pY: Byte);
begin
y := pY
end;

//-------- GibEditGefangen (public) ------------------------------------
function TSpielfeld.GibEditGefangen : Boolean;
begin
if ((x=Sau.GibX) and (y=Sau.GibY)) then
EditGefangen:=true
else
EditGefangen:=false;
result := EditGefangen
end;

end.


Es ist halt immernoch der gleiche Fehler, der schon von Anfang an auftrat ._.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
EE-Maler
Beiträge: 1754
Erhaltene Danke: 62

Windows XP
Delphi (2005 Bug Edition), Java (Eclipse), Haskell (ghci), C++ (Visual Studio 2010, Qt Creator)
BeitragVerfasst: Fr 16.12.11 16:34 
Du weißt aber schon wie das mit Klassen und Objekten funktioniert?

user profile iconschumann.vas hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
unit Unit1;
[...]
var
Form1: TForm1;
Spielfeld: TSpielfeld;


user profile iconschumann.vas hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
unit Unit2;
[...]
var
Form2: TForm2;
Spielfeld: TSpielfeld;


Du hast ja jetzt 2 Spielfelder (die nichts miteinander zu tun haben). Das in Unit2 erzeugst du aber nie => Access Violation

Ich vermute mal, dass du das Spielfeld aus Unit1 verwenden möchtest. Dazu musst du nur Unit1 einbinden (mit uses Unit1 unter implementation, sonst gibts ne zirkuläre Referenz). Das sollte ausreichen.

_________________
a broken heart is like a broken window - it'll never heal
Jen, [this computer] is infected. If this was a human being, I'd shoot it in the face. (IT Crowd)

Für diesen Beitrag haben gedankt: schumann.vas
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
schumann.vas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43

Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
BeitragVerfasst: Fr 16.12.11 17:08 
Zu deiner Frage..ich bin Schüler und wir sind vor kurzem zum OOP übergegangen..vorher lief noch alles super..aktuell tu ich mich nen bisschen schwer, wie man merkt :lol:

Hab das geändert...Fehler kommt am Programmstart immernoch und zwars, wenn in Unit1 Form2.Schw ausgeführt wird..
Ich glaub ich habe auch den Fehler schon entdeckt (die Lösung ist dann aber noch weit weg^^)..ich Erstelle das Schwein, mit zufallswerten aus einem Bereich von XX..und der wird ja erst in Form2.Schw definiert oder? Dh. er bekommt die Werte nicht, die er braucht, richtig?..und würde ich es einfach tauschen..dann würde das Schwein noch nicht existieren und ich erhalt auch nur Fehler^^
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
EE-Maler
Beiträge: 1754
Erhaltene Danke: 62

Windows XP
Delphi (2005 Bug Edition), Java (Eclipse), Haskell (ghci), C++ (Visual Studio 2010, Qt Creator)
BeitragVerfasst: Fr 16.12.11 18:05 
Die Werte, die du im Constructor von TSchwein benutzt, sind alle 0. random(0) gibt keinen Fehler (auch wenn es nicht viel Sinn macht). Du kannst ja mal statt "GibA" einfach a reinschreiben (ist ja das selbe), aber ich glaube nicht dass das deswegen einen Fehler gibt.

Du kannst mir auch mal das ganze Projekt schicken (z.B. als PN), dann kann ichs selbst mal compilieren und mit Breakpoints gucken. ich glaub das wäre schneller als hier rumzuraten ;)

_________________
a broken heart is like a broken window - it'll never heal
Jen, [this computer] is infected. If this was a human being, I'd shoot it in the face. (IT Crowd)

Für diesen Beitrag haben gedankt: schumann.vas
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
EE-Maler
Beiträge: 1754
Erhaltene Danke: 62

Windows XP
Delphi (2005 Bug Edition), Java (Eclipse), Haskell (ghci), C++ (Visual Studio 2010, Qt Creator)
BeitragVerfasst: Fr 16.12.11 21:52 
Ah, ok, da wäre ich niemals drauf gekommen:

Du rufst im constructor von Form1 (OnCreate) Form2.Schw auf. Du willst dort auf RadioButton3 zugreifen, aber Form2 (und alles darauf) ist zu diesem Moment noch nicht erzeugt worden (Es wird zuerst Form1 und dann Form2 erzeugt). Unter D2005 kommst du zu dem Code mit F8 hin. Dort steht:

ausblenden Delphi-Quelltext markieren
1:
2:
  Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);


Vertauschst du diese beiden Befehle, läuft es. Alternativ kannst du Form2.Schw aus Form1.OnCreate entfernen oder gleich statt OnCreate OnShow benutzen.

_________________
a broken heart is like a broken window - it'll never heal
Jen, [this computer] is infected. If this was a human being, I'd shoot it in the face. (IT Crowd)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
schumann.vas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43

Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
BeitragVerfasst: Mo 19.12.11 20:58 
Vielen Dank...
funktioniert alles Wunderbar :)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15841
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Di 20.12.11 10:20 
user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconschumann.vas hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
procedure TForm1.Button2Click(Sender: TObject);
begin
Spielfeld.Create;
Spielfeld.InitSpiel;
Form2.Schw;


Also die Zeile ist komisch...ich kann garnicht sagen was da letztendlich eigentlich passiert
Als Ergänzung:
Es wird versucht den Konstruktor als Methode des Objekts in Spielfeld aufzurufen. Existiert das Objekt noch nicht, gibt es eine Zugriffsverletzung.

Beim korrekten Aufruf Spielfeld := TSpielfeld.Create; wird hingegen der Konstruktor der Klasse aufgerufen. Sozusagen als Klassenmethode. Daher muss hier kein Objekt existieren, sondern nur die Klasse. Und das tut sie ja. ;-)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home