Autor Beitrag
muffinfan
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 10.01.08 17:54 
Hallo ihr, ich muss in Delphi ein programm schreiben, komm aber nich weiter und hoffe dass ihr mir helfen könnt ;)
Also folgendes:

Ich habe 3 Spinedits; bei Veränderung eines Spinedits sollen sich die anderen entsprechend ändern !
Das erste ist "celsius", das zweite "Réaumur" und das dritte "Fahrenheit"
Sprich, wenn ich im ersten "celsius" ändere, sollen sich "Réaumur" und "fahrenhiet" auch ändern,
wenn ich das zweite "Réaumur" ändere soll sich "celsius" und "fahrenheit" ändern
und wenn ich das dritte, "Fahrenheit" ändere, sollen sich "Celsius" und "Réaumur" auch ändern.

Nun habe ich folgendes Problem:

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:
unit UTemperatur1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Spin;

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    GroupBox3: TGroupBox;
    SpinEdit1: TSpinEdit;
    SpinEdit2: TSpinEdit;
    SpinEdit3: TSpinEdit;
    procedure SpinEdit1Change(Sender: TObject);
    procedure SpinEdit2Change(Sender: TObject);
    procedure SpinEdit3Change(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  celsius:real;
  reaumur:real;
  fahrenheit:real;


implementation

{$R *.DFM}


procedure TForm1.SpinEdit1Change(Sender: TObject)

begin
celsius:=StrToFloat(spinedit1.text);
reaumur:=celsius*0.8;
fahrenheit:=celsius*1.8+32;
spinedit2.text:=FloatToStrF(reaumur,fffixed,5,0);
spinedit3.text:=FloatToStrF(fahrenheit,fffixed,5,0);
end;



procedure TForm1.SpinEdit2Change(Sender: TObject);

begin
reaumur:=StrToFloat(spinedit2.text);
celsius:=reaumur/0.8;
fahrenheit:=celsius*1.8+32;
spinedit1.text:=FloatToStrF(celsius,fffixed,5,0);
spinedit3.text:=FloatToStrF(fahrenheit,fffixed,5,0);
end;


procedure TForm1.SpinEdit3Change(Sender: TObject);

begin
fahrenheit:=StrToFloat(spinedit3.text);
celsius:=(fahrenheit/1.8 )-32;
reaumur:=celsius*0.8;
spinedit1.text:=FloatToStrF(celsius,fffixed,5,0);
spinedit3.text:=FloatToStrF(reaumur,fffixed,5,0);
end;

end.


Wenn ich nur das 1. und das 2. Spinedit programiere dann läuft das program auch, aber wenn ich das 3. programiere, es dann laufen lasse und auf ein pfeilchen vom Spinedit klick um es zu ändern kommt volgende Fehlermeldung:

"Project PTemperature1.exe raised exception class EStackOverflow with message 'Stack overflow'. Use Step or Run to continue."

und die Zeile 46 ist blau markiert!!!!


So ich hoffe ich hab mein problem gut geschildert.
Kann mir jemand helfen? Das wär echt super :)

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt


Zuletzt bearbeitet von muffinfan am Do 10.01.08 18:47, insgesamt 5-mal bearbeitet
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Do 10.01.08 18:02 
Hallo und :welcome: im Delphi-Forum, user profile iconmuffinfan!

Wenn du uns den Code der anderen OnChange-Events postest, dann können wir dir vielleicht besser helfen.

Noch was zum Verfassen von Themen: Bitte schreibe einen aussagekräftigeren Titel. Klicke dazu einfach auf user defined image, und ändere den Titel. Dann kannst du auch gleich [delphi]-Tags einsetzen, um den Quelltext besser hervorzuheben.

Grüße,

Yogu
DrRzf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260

Win XP Prof
D7 Enterprise
BeitragVerfasst: Do 10.01.08 23:16 
Das Problem ist eigentlich recht simpel.

Du änderst im ersten die nummer 2 und 3.
im zweiten das erste und dritte
im dritten die ersten zwei.

was passiert hier.
du änderst das erste, dann werden automatisch 2 und 3 geändert, die wiederumm 1 und 3 und 1 und 2 aufrufen, die rufen dann wiederumm sich gegenseitig auf.
irgendwann haste soviel proceduraufrufe auf dem stack dass dieser übrläuft.

abhilfe

globale variable

ausblenden Delphi-Quelltext
1:
besetzt : boolean;					


diese in form create auf false setzen.

und das an der anfang der jeweiligen proceduren schreiben.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.SpinEdit1Change(Sender: TObject)  
begin 
if besetzt then Exit;
besetzt := true; 
celsius:=StrToFloat(spinedit1.text);  
reaumur:=celsius*0.8;  
fahrenheit:=celsius*1.8+32;  
spinedit2.text:=FloatToStrF(reaumur,fffixed,5,0);  
spinedit3.text:=FloatToStrF(fahrenheit,fffixed,5,0);  
besetzt := false;
end;

_________________
rein statistisch gesehen darf man keiner statistik trauen die man nicht selbst gefälscht hat.
muffinfan Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: So 13.01.08 15:42 
Vielen Dank ich habs jetzt geändert und es funktioniert :)

Kann mir vielleicht noch jemand erklären was genau es mit dem "Stack" auf sich hat? Ich kenn mich da nicht so aus und muss noch ein Protokoll schreiben, also warum ich das so und so gemacht..
vielen dank schon mal
DrRzf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260

Win XP Prof
D7 Enterprise
BeitragVerfasst: Di 15.01.08 01:23 
Der Stack ist ein Speicher. In diesem Speicher werden diverse daten übergeben und rücksprungadressen des Prozessors gespeichert.
Wird zb eine Subroutine aufgerufen, wird dort die adresse von wo die routine aufgerufen wurde abgelegt, dann werden dort register gesichert die in der routine geändert werden. nach ende der routine werden die alten registerzustände wieder hergestellt und der programmcounter wieder auf den alten wert gesetzt, damits beim aufruf wieder weiter geht.
da dieser speicher aber nur eine begrenzte grösse hat, läuft er irgendwann über, wenn sich routinen zb in einer tour ständig aufrufen.

Suche in Wikipedia STAPELSPEICHER

_________________
rein statistisch gesehen darf man keiner statistik trauen die man nicht selbst gefälscht hat.