2016-04-14 6 views
1

Ich versuche ein recht einfaches Programm zur BMI-Berechnung zu erstellen, aber ich scheine diesen Fehler immer wieder zu bekommen und bin mir nicht sicher warum oder wie man es repariert.Delphi: Inkompatible Typen: 'Integer' und 'Extended', wenn beide Werte als real zugewiesen sind

das sind meine Variablen:

weight : real; 
height : real; 
bmi : real; 

meine Codierung wie folgt:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    weight := strtofloat(inputbox('weight', 'Enter your weight in  kilograms','')); 
    height := strtofloat(inputbox('height', 'Enter your height in centimeters','')); 
    bmi := weight/sqr(height); 
    EDIT1.Text := floattostr(BMI); 
end; 

Wie kann ich diesen Fehler zu beheben, und was es verursacht?

Antwort

7

Height wird als Self.Height verwechselt, die sich auf die Height-Eigenschaft des Formulars bezieht, die eine Ganzzahl ist. Verwenden Sie für die Variable einen anderen Namen oder machen Sie sie lokal für die Methode. Die folgende funktioniert gut für mich:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Weight, Height, BMI: Real; 
    s: string; 
begin 
    s := InputBox('Weight', 'Enter your weight in kilos', ''); 
    Weight := StrToFloat(s); 
    s := InputBox('Height', 'Enter your height in centimeters', ''); 
    Height := StrToFloat(s); 
    BMI := Weight/sqr(Height); 
    Edit1.Text := FloatToStr(BMI); 
end; 

Meine bevorzugte Lösung wäre, einen anderen Namen zu verwenden, um mögliche Verwirrung in der Zukunft zu vermeiden. Ich würde wahrscheinlich etwas mehr wie folgt tun:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    BodyWeight, BodyHeight, BMI: Real; 
    s: string; 
begin 
    s := InputBox('Weight', 'Enter your weight in kilos', ''); 
    BodyWeight := StrToFloat(s); 
    s := InputBox('Height', 'Enter your height in centimeters', ''); 
    BodyHeight := StrToFloat(s); 
    BMI := BodyWeight/sqr(BodyHeight); 
    Edit1.Text := FloatToStr(BMI); 
end; 
+0

Danke für diese Lösung. Zum Zeitpunkt der Programmierung dachte ich nicht über den Variablennamen nach, der das Problem verursacht hat, aufgrund der Fehlermeldung: "Inkompatible Typen: 'Integer' und, Extended ', wenn beide Werte als echt zugewiesen sind" aber Danke für Ihre Hilfe. Ich werde das bei der Programmierung berücksichtigen. – 1337x

+0

Für die vollständige Abdeckung der möglichen Wege - gibt es auch eine dritte Option - um die globale Variable mit dem Namen der Einheit, wie "BMI: = Gewicht/sqr (Unit1.Height);" - und eine vierte Option - machen diese Variablen Mitglieder der TForm1-Klasse. In diesem speziellen Fall sind die Variablen jedoch von Natur aus temporäre Variablen und local-vars (Methode # 1) sind die richtigen Methoden, um das Programm zu entwerfen. –

Verwandte Themen