Autor Beitrag
xsus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51

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
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
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
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
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
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
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 iconxsus hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
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
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)

Für diesen Beitrag haben gedankt: xsus
xsus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51

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
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mi 14.12.11 21:20 
"Schwein" erzeugst du nirgends, nur "Sau", was Teil vom Spielfeld ist.
user profile iconxsus hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
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
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)

Für diesen Beitrag haben gedankt: xsus
xsus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51

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
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*
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Do 15.12.11 08:22 
Nein, kann es nicht, da du erst Form2.Schw aufrufst und dann dein Objekt erzeugst
user profile iconxsus hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
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
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)

Für diesen Beitrag haben gedankt: xsus
xsus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51

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
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 :(
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Do 15.12.11 19:03 
user profile iconxsus hat folgendes geschrieben Zum zitierten Posting springen:
Iwas stimmt aber immernoch nich :(

Welcher Fehler kommt denn?

user profile iconxsus hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
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
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)

Für diesen Beitrag haben gedankt: xsus
xsus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51

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! :)
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
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
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)

Für diesen Beitrag haben gedankt: xsus
xsus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51

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
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
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
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
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 ._.
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

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

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


user profile iconxsus hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
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
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)

Für diesen Beitrag haben gedankt: xsus
xsus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51

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^^
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
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
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)

Für diesen Beitrag haben gedankt: xsus
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
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
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
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
xsus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51

Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
BeitragVerfasst: Mo 19.12.11 20:58 
Vielen Dank...
funktioniert alles Wunderbar :)
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: Di 20.12.11 10:20 
user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconxsus hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
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. ;-)