Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Fehler Exception der Klasse EReadError


FrozenHeart - Di 25.05.10 20:12
Titel: Fehler Exception der Klasse EReadError
Hallo habe folgendes Problem wenn ich haben einen hypothesentestzeichner programmiert der von einem Funktionsplotter abgeleitet wird
beim starten des Programms erscheint die Fehler Meldung Exception EReadError Meldung: 'Ungültiger Eigenschaftswert' Prozeß wurde angehalten...

Hier meine zwei Units

Unit des Plotter:

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:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
unit UnitPlotter;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Math;

type
  TFormPlotter = class(TForm)
    LabelFunk: TLabel;
    LabelM: TLabel;
    LabelZ: TLabel;
    LabelC: TLabel;
    LabelHyp: TLabel;
    LabelN: TLabel;
    LabelP: TLabel;
    LabelA: TLabel;
    EditM: TEdit;
    EditZ: TEdit;
    EditC: TEdit;
    EditN: TEdit;
    EditP: TEdit;
    EditA: TEdit;
    ImgPlot: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    ButtonZeichnen: TButton;
    ButtonZeichnen2: TButton;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    procedure ButtonZeichnenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

function f(x: real): real;
procedure drawFunktion();

var
  FormPlotter: TFormPlotter;

implementation

{$R *.dfm}

function f(x: real): real;
var
m: real; z: real; c: real; d: real;

begin
  m := StrToFloat(FormPlotter.EditM.Text);
  z := StrToFloat(FormPlotter.EditZ.Text);
  c := StrToFloat(FormPlotter.EditC.Text);
  d := power(x,z);
  f := (m/10)*d+c;
end;

procedure drawFunktion();
var i: integer; y: integer;
begin
//Koordinatensystem zeichnen
formPlotter.imgPlot.Canvas.Brush.Color := clWhite; { Farbe setzen }
formPlotter.imgPlot.Canvas.rectangle(-1,-1,formPlotter.imgPlot.Width+1, formPlotter.imgPlot.Height+1); { Image leeren }
formPlotter.imgPlot.canvas.Pen.Color := clBlack; { Farbe des Stifts setzen }

formPlotter.imgPlot.canvas.MoveTo(0, formPlotter.imgPlot.Height div 2); { Stift nach Links in der Mitte setzen }
formPlotter.imgPlot.canvas.LineTo(formPlotter.imgPlot.Width, formPlotter.imgPlot.Height div 2); { Horizontale Linie des Koordinatensystems zeichnen }

formPlotter.imgPlot.canvas.MoveTo(formPlotter.imgPlot.Width div 20); { Stift nach Oben in der Mitte setzen }
formPlotter.imgPlot.canvas.LineTo(formPlotter.imgPlot.Width div 2, formPlotter.imgPlot.Height); { Vertikale Linie des Koordinatensystems zeichnen }

//Funktion zeichnen
formPlotter.imgPlot.Canvas.MoveTo(-1,-1);
for i := 0 to formPlotter.imgPlot.Width do
begin
y := round(f(i-formPlotter.imgPlot.Width div  2))+formPlotter.imgPlot.height div 2;  { Funktionswert ermitteln }
y := formPlotter.imgPlot.Height - y;          { Umdrehen }
formPlotter.imgPlot.Canvas.LineTo(i, y);      { Zeichnen }
end;

end;



procedure TFormPlotter.ButtonZeichnenClick(Sender: TObject);
begin
drawFunktion();
end;

end.


Unit des HypothesentestZeichner:

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:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
UNIT UnitHyp;

interface

//--------------------  ggf Uses-Liste anpassen !  --------------------
uses
UnitPlotter, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Math;

type
  Hyp = class(TFormPlotter);
  TFormPlotter = class(TForm)
    LabelFunk: TLabel;
    LabelM: TLabel;
    LabelZ: TLabel;
    LabelC: TLabel;
    LabelHyp: TLabel;
    LabelN: TLabel;
    LabelP: TLabel;
    LabelA: TLabel;
    EditM: TEdit;
    EditZ: TEdit;
    EditC: TEdit;
    EditN: TEdit;
    EditP: TEdit;
    EditA: TEdit;
    ImgPlot: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    ButtonZeichnen: TButton;
    ButtonZeichnen2: TButton;
    Label9: TLabel;
    Label10: TLabel;
    procedure ButtonZeichnen2Click();
end;

function f(k:integer):integer;

var
  yp:  Hyp;

implementation

function f(k:integer):integer;
var n, p, a, f, d, c, cneu, calt, e, h, g : real; i :integer;
begin
calt:=1;
for i := 0 to k-1 do
 begin
   c:=(n-i)/(i+1);
   cneu:=calt+c;
   calt:=cneu;
 end;

n := StrToFloat(FormPlotter.EditM.Text);
p := StrToFloat(FormPlotter.EditC.Text);
a := StrToFloat(FormPlotter.EditA.Text);
d := power(p,k);
h := 1-p;
g := n-k;
e := power(h,g);
f :=calt*d*e;

end;

procedure drawFunktion();
var x: integer; y: integer;
begin
//Koordinatensystem zeichnen
formPlotter.imgPlot.Canvas.Brush.Color := clWhite; { Farbe setzen }
formPlotter.imgPlot.Canvas.rectangle(-1,-1,formPlotter.imgPlot.Width+1, formPlotter.imgPlot.Height+1); { Image leeren }
formPlotter.imgPlot.canvas.Pen.Color := clBlack; { Farbe des Stifts setzen }

formPlotter.imgPlot.canvas.MoveTo(0, formPlotter.imgPlot.Height div 2); { Stift nach Links in der Mitte setzen }
formPlotter.imgPlot.canvas.LineTo(formPlotter.imgPlot.Width, formPlotter.imgPlot.Height div 2); { Horizontale Linie des Koordinatensystems zeichnen }

formPlotter.imgPlot.canvas.MoveTo(formPlotter.imgPlot.Width div 20); { Stift nach Oben in der Mitte setzen }
formPlotter.imgPlot.canvas.LineTo(formPlotter.imgPlot.Width div 2, formPlotter.imgPlot.Height); { Vertikale Linie des Koordinatensystems zeichnen }

//Funktion zeichnen
formPlotter.imgPlot.Canvas.MoveTo(-1,-1);
for x := 0 to formPlotter.imgPlot.Width do
begin
y := round(f(x-formPlotter.imgPlot.Width div  2))+formPlotter.imgPlot.height div 2;  { Funktionswert ermitteln }
y := formPlotter.imgPlot.Height - y;          { Umdrehen }
formPlotter.imgPlot.Canvas.LineTo(x, y);      { Zeichnen }
end;

end;

procedure TFormPlotter.ButtonZeichnen2Click();
begin
drawFunktion();
end;

end.

Hinweis: Das ist ein Programm und soll nur eine Form nutzen

Ich Hoffe ihr könnt mir weiter helfen


Moderiert von user profile iconNarses: Topic aus Freeware Projekte verschoben am Di 25.05.2010 um 20:36
Moderiert von user profile iconNarses: Titel geändert.
Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


SmileySN - Di 25.05.10 20:28

Du hast in beiden Units den funktionsaufruf DrawFunktion definiert.
Setze die UnitPlotter aus dem oberen Uses mal unter das Implementation

Delphi-Quelltext
1:
2:
Implementation
  uses UnitPlotter;


Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


FrozenHeart - Mi 26.05.10 07:57

Danke für den Hinweise aber wenn ich die UnitPlotter aus den uses oben rausnehme und unter die implementation setze dann erkennt er nicht mehr den teil

type
Hyp = class(TFormPlotter);


SmileySN - Mi 26.05.10 08:14

user profile iconFrozenHeart hat folgendes geschrieben Zum zitierten Posting springen:
Danke für den Hinweise aber wenn ich die UnitPlotter aus den uses oben rausnehme und unter die implementation setze dann erkennt er nicht mehr den teil

type
Hyp = class(TFormPlotter);


Dann setze die Definition der Klasse Hyp doch in die Unit Plotter


FrozenHeart - Mi 26.05.10 09:18

Danke für deine Hilfe habe das Programm jetzt aber umgeschrieben und benutze nun zwei Forms die zweite wird beim buttonClick geöffnet und dort soll der hypothesentest gezeichnet werden nun habe ich das Problem, dass entweder der graph nicht richtig gezeichnet wird oder der Fehler Meldung 'Ungültige Gleitkommaoperation' auftritt

Hier wieder der Quellcode

UnitPlotter:


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:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
unit UnitPlotter;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Math;

type
  TFormPlotter = class(TForm)
    LabelFunk: TLabel;
    LabelM: TLabel;
    LabelZ: TLabel;
    LabelC: TLabel;
    LabelHyp: TLabel;
    LabelN: TLabel;
    LabelP: TLabel;
    LabelA: TLabel;
    EditM: TEdit;
    EditZ: TEdit;
    EditC: TEdit;
    EditN: TEdit;
    EditP: TEdit;
    EditA: TEdit;
    ImgPlot: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    ButtonZeichnen: TButton;
    ButtonZeichnen2: TButton;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    procedure ButtonZeichnenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

function f(x: real): real;
procedure drawFunktion();

var
  FormPlotter: TFormPlotter;

implementation

{$R *.dfm}

function f(x: real): real;
var
m: real; z: real; c: real; d: real;

begin
  m := StrToFloat(FormPlotter.EditM.Text);
  z := StrToFloat(FormPlotter.EditZ.Text);
  c := StrToFloat(FormPlotter.EditC.Text);
  d := power(x,z);
  f := (m/10)*d+c;
end;

procedure drawFunktion();
var i: integer; y: integer;
begin
//Koordinatensystem zeichnen
formPlotter.imgPlot.Canvas.Brush.Color := clWhite; { Farbe setzen }
formPlotter.imgPlot.Canvas.rectangle(-1,-1,formPlotter.imgPlot.Width+1, formPlotter.imgPlot.Height+1); { Image leeren }
formPlotter.imgPlot.canvas.Pen.Color := clBlack; { Farbe des Stifts setzen }

formPlotter.imgPlot.canvas.MoveTo(0, formPlotter.imgPlot.Height div 2); { Stift nach Links in der Mitte setzen }
formPlotter.imgPlot.canvas.LineTo(formPlotter.imgPlot.Width, formPlotter.imgPlot.Height div 2); { Horizontale Linie des Koordinatensystems zeichnen }

formPlotter.imgPlot.canvas.MoveTo(formPlotter.imgPlot.Width div 20); { Stift nach Oben in der Mitte setzen }
formPlotter.imgPlot.canvas.LineTo(formPlotter.imgPlot.Width div 2, formPlotter.imgPlot.Height); { Vertikale Linie des Koordinatensystems zeichnen }

//Funktion zeichnen
formPlotter.imgPlot.Canvas.MoveTo(-1,-1);
for i := 0 to formPlotter.imgPlot.Width do
begin
y := round(f(i-formPlotter.imgPlot.Width div  2))+formPlotter.imgPlot.height div 2;  { Funktionswert ermitteln }
y := formPlotter.imgPlot.Height - y;          { Umdrehen }
formPlotter.imgPlot.Canvas.LineTo(i, y);      { Zeichnen }
end;

end;



procedure TFormPlotter.ButtonZeichnenClick(Sender: TObject);
begin
drawFunktion();
end;

end.


UnitHypo


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:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
UNIT UnitHyp;

interface

//--------------------  ggf Uses-Liste anpassen !  --------------------
uses
UnitPlotter, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Math;

type
  Hyp = class(TFormPlotter);
  TFormPlotter = class(TForm)
    LabelFunk: TLabel;
    LabelM: TLabel;
    LabelZ: TLabel;
    LabelC: TLabel;
    LabelHyp: TLabel;
    LabelN: TLabel;
    LabelP: TLabel;
    LabelA: TLabel;
    EditM: TEdit;
    EditZ: TEdit;
    EditC: TEdit;
    EditN: TEdit;
    EditP: TEdit;
    EditA: TEdit;
    ImgPlot: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    ButtonZeichnen: TButton;
    ButtonZeichnen2: TButton;
    Label9: TLabel;
    Label10: TLabel;
    procedure ButtonZeichnen2Click();
end;

function f(k:integer):integer;

var
  yp:  Hyp;

implementation

function f(k:integer):integer;
var
n : real; p: real; a: real; f: real; d: real; c: real; cneu: real; calt: real;
e: real; h: real; g : real; i :integer;
begin
calt:=1;
n := StrToFloat(FormPlotter.EditM.Text);
p := StrToFloat(FormPlotter.EditC.Text);
a := StrToFloat(FormPlotter.EditA.Text);
d := power(p,k);
h := 1-p;
g := n-k;
e := power(h,g);

for i := 0 to k-1 do
 begin
   c:=(n-i)/(i+1);
   cneu:=calt+c;
   calt:=cneu;
 end;

f :=calt*d*e;

end;

procedure drawFunktion();
var x: integer; y: integer;
begin
//Koordinatensystem zeichnen
formPlotter.imgPlot.Canvas.Brush.Color := clWhite; { Farbe setzen }
formPlotter.imgPlot.Canvas.rectangle(-1,-1,formPlotter.imgPlot.Width+1, formPlotter.imgPlot.Height+1); { Image leeren }
formPlotter.imgPlot.canvas.Pen.Color := clBlack; { Farbe des Stifts setzen }

formPlotter.imgPlot.canvas.MoveTo(0, formPlotter.imgPlot.Height div 2); { Stift nach Links in der Mitte setzen }
formPlotter.imgPlot.canvas.LineTo(formPlotter.imgPlot.Width, formPlotter.imgPlot.Height div 2); { Horizontale Linie des Koordinatensystems zeichnen }

formPlotter.imgPlot.canvas.MoveTo(formPlotter.imgPlot.Width div 20); { Stift nach Oben in der Mitte setzen }
formPlotter.imgPlot.canvas.LineTo(formPlotter.imgPlot.Width div 2, formPlotter.imgPlot.Height); { Vertikale Linie des Koordinatensystems zeichnen }

//Funktion zeichnen
formPlotter.imgPlot.Canvas.MoveTo(-1,-1);
for x := 0 to formPlotter.imgPlot.Width do
begin
y := round(f(x-formPlotter.imgPlot.Width div  2))+formPlotter.imgPlot.height div 2;  { Funktionswert ermitteln }
y := formPlotter.imgPlot.Height - y;          { Umdrehen }
formPlotter.imgPlot.Canvas.LineTo(x, y);      { Zeichnen }
end;

end;

procedure TFormPlotter.ButtonZeichnen2Click();
begin
drawFunktion();
end;

end.


Hoffe ihr könnt mir auch hier weiterhelfen

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


elundril - Mi 26.05.10 12:58

inhaltlich neue Frage, neues Topic. ;) der übersicht wegen.

lg elundril


SmileySN - Mi 26.05.10 13:28

Du weißt schon, dass Delphi einen internen Debugger besitzt ?

Schau mal nach an welcher Stelle der Fehler auftritt, dann kann man Dir zu diesem Problem auch helfen.