![]() |
Stack overflow, aber warum?
Erstmal hoffe ich, dass ich hier in der Rubrk richtig bin.
Ich habe 3 Jahre nicht mehr programmiert und woltle mal wieder etwas ganz kleines programmieren. Alles läuft gut, doch dann wollte ich lediglich close ausführen und mir wirft es einen e-stack overflow vor die Tür. Habe schon probiert den stack zu vergößern, hat ncht geholfen. Dürfte auch nix rekursives im Text haben. vielleicht könt ihr mir ja helfen. Bei dem Programm sol les sich lediglich um einen Chargenerator handeln für ein PnP. Natürlich ist einiges unschön programmiert und auch da bin ich für tips dankbar, aber hauptsächlch geht es darum den exception auszumerzen, der geworfen wird, wenn ich die Hauptform mit close; schließe. Unit1
Delphi-Quellcode:
Unit2
var
Form1: TForm1; implementation uses Unit2; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin form1.visible := false; form2.visible := true; end; procedure TForm1.ProgrammBeenden1Click(Sender: TObject); begin close; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin close; end; procedure TForm1.neuenCharakererstellen1Click(Sender: TObject); begin form1.visible := false; form2.visible := true; end; procedure TForm1.Button2Click(Sender: TObject); begin close; end; end.
Delphi-Quellcode:
Unit3
var
Form2: TForm2; nuyen, lebensstil, gpgeld : integer; implementation uses Unit3, Unit4, Unit1; {$R *.dfm} procedure TForm2.Button1Click(Sender: TObject); begin form3.visible := true; nuyen := nuyen + Lebensstil; end; procedure TForm2.FormCreate(Sender: TObject); begin nuyen := 0 end; procedure TForm2.Button2Click(Sender: TObject); begin form4.visible := true; Nuyen := Nuyen - gpgeld * 5000; end; procedure TForm2.Button3Click(Sender: TObject); begin close; end;
Delphi-Quellcode:
Unit4
var
Form3: TForm3; Metatyp, Name, alter, stil, geschlecht, klasse: string; Genpunkte, kosten, temp : integer; implementation uses Unit2, Unit1, Unit5; {$R *.dfm} procedure TForm3.FormCreate(Sender: TObject); begin ComboBox1.Items.Add('Mensch'); ComboBox1.Items.Add('Zwerg'); ComboBox1.Items.Add('Elf'); ComboBox1.Items.Add('Ork'); ComboBox1.Items.Add('Troll'); ComboBox2.Items.Add('männlich'); ComboBox2.Items.Add('weiblich'); ComboBox3.Items.Add('Luxus'); ComboBox3.Items.Add('Oberschicht'); ComboBox3.Items.Add('Mittelschicht'); ComboBox3.Items.Add('Unterschicht'); ComboBox3.Items.Add('Squatter'); ComboBox3.Items.Add('Auf der Strasse'); ComboBox4.Items.Add('Keine'); ComboBox4.Items.Add('Adept'); ComboBox4.Items.Add('Magieradept'); ComboBox4.Items.Add('Magier'); ComboBox4.Items.Add('Technomancer'); kosten := 0; temp := 0; Genpunkte := 0; end; procedure TForm3.ComboBox1Change(Sender: TObject); begin case combobox1.ItemIndex of 0: begin Metatyp := 'Mensch'; kosten := 0; end; 1: begin Metatyp := 'Zwerg'; kosten := 50; end; 2: begin Metatyp := 'Elf'; kosten := 50; end; 3: begin Metatyp := 'Ork'; kosten := 75; end; 4: begin Metatyp := 'Troll'; kosten := 155; end; end; end; procedure TForm3.Button2Click(Sender: TObject); begin Name := edit1.Text; Alter := edit2.text; Genpunkte := strtoint(edit3.text); form2.panel2.caption := Metatyp; form2.panel12.caption := klasse; form2.panel1.caption := Name; form2.panel3.caption := alter; form2.panel11.caption := inttostr(Genpunkte - kosten - temp) + ' von ' + inttostr(Genpunkte); form2.label12.caption := inttostr(kosten) + 'GP'; form2.label15.caption := inttostr(temp) + 'GP'; nuyen := nuyen - Lebensstil; form2.panel13.caption := inttostr(nuyen); form2.Panel5.caption := stil; form3.visible := false; form2.panel4.caption := geschlecht; end; procedure TForm3.ComboBox2Change(Sender: TObject); begin case combobox2.ItemIndex of 0: begin Geschlecht := 'männlich'; end; 1: begin Geschlecht := 'weiblich'; end; end; end; procedure TForm3.ComboBox3Change(Sender: TObject); begin case combobox3.ItemIndex of 0: begin stil := 'Luxus'; Lebensstil := 100000; end; 1: begin stil := 'Oberschicht'; Lebensstil := 10000; end; 2: begin stil := 'Mittelschicht'; Lebensstil := 5000; end; 3: begin stil := 'Unterschicht'; Lebensstil := 2000; end; 4: begin stil := 'Squatter'; Lebensstil := 500; end; 5: begin stil := 'Auf der Straße'; Lebensstil := 0; end; end; end; procedure TForm3.ComboBox4Change(Sender: TObject); begin case combobox4.ItemIndex of 0: begin klasse := 'Keine'; temp := 0; end; 1: begin klasse := 'Adept'; temp := 20; end; 2: begin klasse := 'Magieradept'; temp := 30; end; 3: begin klasse := 'Magier'; temp := 40; end; 4: begin klasse := 'Technomancer'; temp := 20; end; end; end; procedure TForm3.Button1Click(Sender: TObject); begin form5.memo1.clear; case combobox1.ItemIndex of 0: begin form5.memo1.Lines.add('Metatyp: Mensch (Homo sapiens sapiens)'); form5.memo1.Lines.add(''); form5.memo1.Lines.add('GP Kosten: 0'); form5.memo1.Lines.add(''); form5.memo1.lines.add('Beschreibung: Menschen bilden noch immer eine leichte Mehrheit der durchschnittlichen Weltbevölkerung. Die meisten sind 1,75m groß und wiegen knapp 80kg. Sechzig Jahre' + 'nach dem Erwachen werden die Menschen von Laien und wissenschaftlichen Organisationen noch immer als "Die Norm" betrachtet und sind üblicherweise die' + 'Messlatte, mit der die anderen Metatypen verglichen werden'); form5.memo1.Lines.add(''); form5.memo1.Lines.add('Fähigkeiten: Edge +1'); end; 1: begin form5.memo1.Lines.add('Metatyp: Zwerg (Homo sapiens pumilionis)'); form5.memo1.Lines.add(''); form5.memo1.Lines.add('GP Kosten: 50'); form5.memo1.Lines.add(''); form5.memo1.lines.add('Beschreibung: Durchschnittsgröße: 1,20m Durchschnittsgewicht: 54kg durchschnittliche Lebenserwartung über 100 Jahre'); form5.memo1.Lines.add(''); form5.memo1.Lines.add('Fähigkeiten: Infrarotsicht, +2 Würfel für Konstitutionsproben gegen Pathogene und Toxine, Konstitution +1, Reaktionsmaximum -1, Stärk +2, Willenskraft +1'); end; 2: begin form5.memo1.Lines.add('Metatyp: Elf (Homo sapiens nobilis)'); form5.memo1.Lines.add(''); form5.memo1.Lines.add('GP Kosten: 50'); form5.memo1.Lines.add(''); form5.memo1.lines.add('Beschreibung: Durchschnittsgröße: 1,90m Durchschnittsgewicht: 80kg durchschnittliche Lebenserwartung: mehrere hundert Jahre'); form5.memo1.Lines.add(''); form5.memo1.Lines.add('Fähigkeiten: Restlichtverstärkung, +1 Geschicklichkeit, +2 Charisma'); end; 3: begin form5.memo1.Lines.add('Metatyp: Ork (Homo sapiens robustus)'); form5.memo1.Lines.add(''); form5.memo1.Lines.add('GP Kosten: 75'); form5.memo1.Lines.add(''); form5.memo1.lines.add('Beschreibung: Durchschnittsgröße: 1,90m Durchschnittsgewicht: 128kg durchschnittliche Lebenserwartung: 35-45 Jahre'); form5.memo1.Lines.add(''); form5.memo1.Lines.add('Fähigkeiten: Restlichtverstärkung, Konstitution +3, Stärke +2, Charismagrenze -1, Logikgrenze -1'); end; 4: begin form5.memo1.Lines.add('Metatyp: Troll (Homo sapiens ingentis)'); form5.memo1.Lines.add(''); form5.memo1.Lines.add('GP Kosten: 155'); form5.memo1.Lines.add(''); form5.memo1.lines.add('Beschreibung: Durchschnittsgröße: 2,50m Durchschnittsgewicht: 300kg durchschnittliche Lebenserwartung: 55 Jahre'); form5.memo1.Lines.add(''); form5.memo1.Lines.add('Fähigkeiten: Infrarotsicht, Nahkampfreichweite +1, Natürliche Panzerung +1 (kulmulativ mit getragener Panzerung), Konstitution +4, Geschicklichkeitsgrenze -1, Stärke +4, Charismagrenze -2, Intuitionsgrenze -1, Logikgrenze -1'); end; end; form5.visible := true; end; procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction); begin close; end;
Delphi-Quellcode:
Unit5
var
Form4: TForm4; implementation uses Unit2; {$R *.dfm} procedure TForm4.Button1Click(Sender: TObject); begin gpgeld := strtoint(edit1.text); nuyen := nuyen + GPgeld * 5000; form2.panel13.caption := inttostr(nuyen); form4.Visible := false; end;
Delphi-Quellcode:
var
Form5: TForm5; implementation {$R *.dfm} procedure TForm5.Button1Click(Sender: TObject); begin form5.Visible := false; end; Hoffe ihr habt mein Problem verstanden und könnt mir helfen greets blue |
Re: Stack overflow, aber warum?
Hab mir nicht alles angeguckt aber du solltest das Close aus dem Form.OnClose rausholen... Denn Close ruft wieder OnClose auf usw. Daran wirds liegen denk ich...
|
Re: Stack overflow, aber warum?
Danke, das wars auch, wasn doofer fehler.
Waru mauch immer habe ich gedacht, dass das da noch rein muss ;-) Kann eigentlch weg der thread nun. *vor die stirn hau* Mensch bin ich eingerostet |
Re: Stack overflow, aber warum?
Moin bluePhoenix,
erst einmal herzlich willkommen hier in der Delphi-PRAXiS. Zitat:
Stell Dir mal vor jede beantwortete Frage würde gelöscht werden... Aber noch mal kurz was Allgemeines zum Stack-Overflow: Wenn man nicht gerade wissentlich Rekursionen mit grosser Rekursionstiefe und/oder grossen lokalen Datenbereichen im Programm hat, deutet das eigentlich immer auf eine fehlerhafte Abbruchbedinung in einer Rekursion hin. BTW: Formxxx.Visible := true; entspricht Formxxx.Show; Formxxx.Visible := false; entspricht Formxxx.Close; evtl. Solltest Du Dir dann auch mal TForm.ShowModal und TButton.ModalResult anschauen. |
Re: Stack overflow, aber warum?
Zitat:
Formxxx.Visible := false; entspricht Formxxx.Hide; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz