Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Zugriffsverletzung - Thread
xsus - Mi 14.12.11 18:24
Titel: Zugriffsverletzung - Thread
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:
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 public 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
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 public 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:
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 x : Byte; y : Byte; a : Byte;
public constructor Create; virtual; function GibX : Byte; virtual; function GibY : Byte; virtual; function GibA : Byte; virtual; procedure SetzeA (pA:Byte); virtual;
end;
implementation
constructor TSchwein.Create; begin x:=(random(GibA))+1; y:=(random(GibA))+1 end;
function TSchwein.GibX : Byte; begin result := x end;
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:
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 EditGefangen : Boolean; x : Byte; y : Byte; Sau : TSchwein;
public procedure InitSpiel; virtual; procedure SetzeX (pX: Byte); virtual; procedure SetzeY (pY: Byte); virtual; function GibEditGefangen : Boolean; virtual; end;
implementation
procedure TSpielfeld.InitSpiel; begin Sau:=TSchwein.Create; EditGefangen:=false end;
procedure TSpielfeld.SetzeX (pX: Byte); begin x := pX end;
procedure TSpielfeld.SetzeY (pY: Byte); begin y := pY end;
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
Th69: Topic aus Open Source Projekte verschoben am Mi 14.12.2011 um 18:59Moderiert von
Narses: Topic aus Sonstiges (Delphi) verschoben am Mi 14.12.2011 um 21:44
Xion - Mi 14.12.11 18:41
So wie ich das sehe ist es ein ganz klassischer Fall:
Du erzeugst dein Objekt nicht und kannst entsprechend nicht drauf zugreifen:
xsus hat folgendes geschrieben : |
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 ;)
xsus - Mi 14.12.11 18: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 - Mi 14.12.11 20:20
"Schwein" erzeugst du nirgends, nur "Sau", was Teil vom Spielfeld ist.
xsus hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4:
| 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) ;)
xsus - Do 15.12.11 06:37
So..ich habe jetzt die Sau in der Unit mSchwein public gemacht...und in der Unit2 siehts wiefolgt aus:
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 - Do 15.12.11 07:22
Nein, kann es nicht, da du erst Form2.Schw aufrufst und dann dein Objekt erzeugst
xsus hat folgendes geschrieben : |
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).
xsus - Do 15.12.11 14:26
Okee...wiefolgt abgeändert:
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 - Do 15.12.11 18:03
xsus hat folgendes geschrieben : |
| Iwas stimmt aber immernoch nich :( |
Welcher Fehler kommt denn?
xsus hat folgendes geschrieben : |
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).
xsus - Do 15.12.11 19: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 - Do 15.12.11 23:59
Poste bitte nochmal deine Unit2, da sollte sich ja einiges geändert haben. Dann gucke ich nochmal drüber ;)
xsus - Fr 16.12.11 06:22
Unit 2 alleine hat sich ja nicht soo viel geändert...ich poste fix noch mal alles^^
Unit1:
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 public 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:
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 public 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:
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 x : Byte; y : Byte; a : Byte;
public constructor Create; virtual; function GibX : Byte; virtual; function GibY : Byte; virtual; function GibA : Byte; virtual; procedure SetzeA (pA:Byte); virtual;
end;
implementation
constructor TSchwein.Create; begin x:=(random(GibA))+1; y:=(random(GibA))+1 end;
function TSchwein.GibX : Byte; begin result := x end;
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:
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 EditGefangen : Boolean; x : Byte; y : Byte;
public Sau : TSchwein; procedure InitSpiel; virtual; procedure SetzeX (pX: Byte); virtual; procedure SetzeY (pY: Byte); virtual; function GibEditGefangen : Boolean; virtual;
end;
implementation
procedure TSpielfeld.InitSpiel; begin Sau:=TSchwein.Create; EditGefangen:=false end;
procedure TSpielfeld.SetzeX (pX: Byte); begin x := pX end;
procedure TSpielfeld.SetzeY (pY: Byte); begin y := pY end;
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 - Fr 16.12.11 15:34
Du weißt aber schon wie das mit Klassen und Objekten funktioniert?
xsus hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5:
| unit Unit1; [...] var Form1: TForm1; Spielfeld: TSpielfeld; | |
xsus hat folgendes geschrieben : |
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.
xsus - Fr 16.12.11 16: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 - Fr 16.12.11 17: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 ;)
Xion - Fr 16.12.11 20: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:
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.
xsus - Mo 19.12.11 19:58
Vielen Dank...
funktioniert alles Wunderbar :)
jaenicke - Di 20.12.11 09:20
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. ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!