Autor Beitrag
gecko676
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Fr 26.03.04 20:11 
Hallo!

Habe ein Programm zu statistischen Auswertung von Versuchen geschrieben.

In einen StringGrid werden in n Zeilen (abhängig von der Probezahl n) Werte geschrieben (z.B 25,89 ; 58900 u.ä)
also Extended-Werte. Nun möchte ich sicherstellen das nur solche Werte eingegeben wurden!

Habe versucht folgende function auf mein Problem anzuwenden:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
    { Prüft ob String ein Extendedwert ist } 
function IsValidExtended(S: String): Boolean; 
var 
  E: Extended; 
begin 
  Result := TextToFloat(PChar(S), E, fvExtended); 
end

if IsValidExtended(S) 
    then ShowMessage(Format('%s ist eine gültige Extended Zahl', [S])) 
    else ShowMessage(Format('%s ist keine gültige Extended Zahl', [S]));



nun der Ausschnitt aus meinem Quelltext:
StringGrid1: 4 Spalten und n Zeilen, in der letzten Zeile stehen die Werte [4,i]
Ereignis TabSheet4Enter nur wenn true....
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:
// Auslesen der Zellen
procedure TForm1.TabSheet4Enter(Sender: TObject);
var code: Integer;
    s: String;
var i: Integer;
    tmp1, tmp2, Summe1, Summe2, Summe3, Summe4: Extended;
begin
if Streu = 2 then
 begin
  case ASW of
  1begin
     gridladen(StringGrid2,'c:\statAuswertung\Stringgrids\uw95.grd',true);
     Val(StringGrid2.Cells[n-1,QW], KS, code);
     end;
  2begin if (QW-2 > 0then begin
     gridladen(StringGrid3,'c:\statAuswertung\Stringgrids\uw90.grd',true);
     Val(StringGrid3.Cells[n-1,QW-2], KS, code); end
     else begin ShowMessage('nur 10%, 5% und 1% möglich!'); end;
     end;
  3begin if (QW-2 > 0then begin
     gridladen(StringGrid4,'c:\statAuswertung\Stringgrids\uw75.grd',true);
     Val(StringGrid4.Cells[n-1,QW-2], KS, code); end
     else begin ShowMessage('nur 10%, 5% und 1% möglich!'); end;
     end;
  end;
end
else if Streu = 1 then
 begin
  case ASW of
  1begin if (QW-2 > 0then begin
     gridladen(StringGrid5,'c:\statAuswertung\Stringgrids\bw95.grd',true);
     Val(StringGrid5.Cells[n-1,QW-2], KS, code); end
     else begin ShowMessage('nur 10%, 5% und 1% möglich!'); end;
     end;
  2begin if (QW-2 > 0then begin
     gridladen(StringGrid6,'c:\statAuswertung\Stringgrids\bw90.grd',true);
     Val(StringGrid6.Cells[n-1,QW-2], KS, code); end
     else begin ShowMessage('nur 10%, 5% und 1% möglich!'); end;
     end;
  3begin if (QW-2 > 0then begin
     gridladen(StringGrid7,'c:\statAuswertung\Stringgrids\bw75.grd',true);
     Val(StringGrid7.Cells[n-1,QW-2], KS, code); end
     else begin ShowMessage('nur 10%, 5% und 1% möglich!'); end;
     end;
  end;
  Str(KS:3:2, s);
  end
else ShowMessage('Bitte Streuung wählen');
// Berechnung
(* Mittelwert berechnen und in "Mittelwert" ablegen: *)
 Summe1 := 0;
 for i := 1 to n do
 begin
  Val(StringGrid1.Cells[4,i], tmp1, code);
  if code = 0 then
  Summe1 := Summe1 + tmp1;
 end;
 Summe1 := Summe1 / n;
 Str(Summe1:3:0, Mittelwert);
 StringGrid8.Cells[1,1] := Mittelwert;
(* Standardabweichung *)
 Summe2 := 0;
 for i := 1 to n do
 begin
  Val(StringGrid1.Cells[4,i], tmp2, code);
  if code = 0 then
  Summe2 := Summe2 + sqr(tmp2 - Summe1);
 end;
  Summe2 := sqrt(Summe2/4);
  Str(Summe2:3:2, SAW);
(* Variationskoeffizient *)
  Summe3 := Summe2 / Summe1;
  Str(Summe3:3:2, VK);
(* Fraktilwert *)
  Summe4 := Summe1 - (KS * Summe2);
  Str(Summe4:3:0, W);
end;


ihr werdet bestimmt sagen das der code schlecht geschrieben ist, aber ich versuche Delphi gerade mir selbst beizubringen.
Wobei mir dieses Forum schon treue Dienste geleistet hat.

Ich hoff mir kann jemand helfen, habe schon verschiedene Variationen ausprobiert.

Kann auch meinen kompletten Quelltext reinstellen, wenns jemanden interessiert und er nich zu lange ist!

Gruss
gecko676 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Do 01.04.04 19:50 
Noch einmal zum obigen Problem.
Da noch keine Antwort kamm versuche ich es mal so.

Ich gebe in einen StringGrid1 mit 5 Spalten und n Zeilen Extended-Werte ein um bei der Berechnung eine Division durch Null zu verhindern und die Eingabe von Zahlen sicher zustellen!
eine Zeile als Beispiel:
Durchmesser = 15.2
Höhe = 30.4
Gewicht = 12345
E-Modul = 45014,35
mal mit mal ohne Kommastellen!

Nun soll sichergestellt werden, dass nur Extended (Float) in den Zellen steht.
Also habe ich folgendes geschrieben:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
{ Prüft ob String ein Extendedwert ist }         // aus dem Forum
function IsValidExtended(S: String): Boolean;
var
  E: Extended;
begin
  Result := TextToFloat(PChar(S), E, fvExtended);
end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
// alle Eingabefelder auf Extended-Werte überprüfen
  for i := 1 to StringGrid1.ColCount-1
  do begin
   for j := 1 to StringGrid1.RowCount-1
   do begin
    s := StringGrid1.Cells[i,j];
    if IsValidExtended(S)
    then x := true       // gültiger Extendedwert
    else x := false;     // kein Extendedwert
   end;
  end;

procedur Berechnung
begin
 if x = true then
 begin
  rechnen
 end
 else ....
end;


nun bekomme ich die "Meldung" kein gültiger Extendedwert, also x = false.
Extended ist doch ein Gleitkommawert, oder!?

sobald ich ein Komma drin habe läuft nix mehr ....

:? bitte helft mir