PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mein erster Delphiversuch


LordDeath
2004-05-10, 16:24:58
ich hab vor, per button in delphi in ein bestimmtes label eine zahl anzeigen zu lassen, die folgendermaßen berechnet werden soll: 10000/(0.8 * Edit1.text)
also in das eingabefald edit1.text soll also ein wert X eingesetzt werden, und dann soll diese f(x)=10000/(0.8*X) formel eine zahl in label 1 anzeigen lassen.
ich hab also in den button bis jetzt folgendes geschrieben:
Label1.caption := 10000/(0.8 * Edit1.text);

beim compilieren kommt dann [Fehler] HLCalc.pas(30): Inkompatible Typen: 'String' und 'Extended' und die angegebene zeile wird rot makiert. muss ich irgendwie dafür sorgen, dass in das eingabefeld nur zahlen reingeschrieben werden können? wenn ja, wie geht das?

Achilless
2004-05-10, 18:09:22
Ich bin zwar kein Delphi-Spezialist, aber müsstest du die Eingabe aus dem Textfeld nicht erst in einen Zahlenwert konvertieren, bevor du damit rechnen kannst? Zumindest kenne ich das aus Java so.

Das wäre zumindest meine Vermutung, was den Fehler betrifft.

LordDeath
2004-05-10, 18:47:49
muss ich da die caption von dem textfeld auf integer stellen oder wie soll das gehen? hab kein plan davon und mittwoch ist infotest :D

LordDeath
2004-05-10, 19:07:04
ich hab jetzt einen variable names "wert" erstellt und ihr "integer" zugewiesen
am anfang der prozedur hab ich jetzt einfach wert := 1; eingefügt, damit der "wert" auf "1" steht und ein integer ist. jetzt hab ich auchnoch den rest auf Label1.caption := 10000/(0.8 * wert);
gesetzt und dennoch erscheint die gleiche fehlermeldung an selber stelle. woran kann das liegen?

ich hab dreit objekte in der from: button1, label1 und edit1

ich quote mal den gesammten code. hoffentlich kommt ihr mir da etwas weiterhelfen :D

unit HLCalc;

interface

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

type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
wert: integer;
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
wert := 1;
Label1.caption := 10000/(0.8 * wert);
end;

end.

Ganon
2004-05-10, 19:41:50
StrToFloat? Guck mal in der Hilfe.

loewe
2004-05-10, 20:12:34
Original geschrieben von LordDeath
ich hab vor, per button in delphi in ein bestimmtes label eine zahl anzeigen zu lassen, die folgendermaßen berechnet werden soll: 10000/(0.8 * Edit1.text)
also in das eingabefald edit1.text soll also ein wert X eingesetzt werden, und dann soll diese f(x)=10000/(0.8*X) formel eine zahl in label 1 anzeigen lassen.
ich hab also in den button bis jetzt folgendes geschrieben:


beim compilieren kommt dann und die angegebene zeile wird rot makiert. muss ich irgendwie dafür sorgen, dass in das eingabefeld nur zahlen reingeschrieben werden können? wenn ja, wie geht das?

Das kann ja auch nicht anders sein!

Die Eigenschaft Caption ist vom Typ String und deine Division liefert so immer einen real-Wert.

Wenn schon, dann solltest du das so schreiben:


Label1.caption := FloatToStr(10000/(0.8 * StrToFloat(Edit1.text)));

dcAlge
2004-05-10, 20:14:32
entweder
Label1.caption := floattostr(10000/(0.8 * wert));
oder
Label1.caption := inttostr(10000/(0.8 * wert));

bin nich sicher ....

du must den zahlenwert den du berechnest (integer oder float ka welches das jetzt is) in string umwandeln und das geht mit einem von den befehlen...
viel spass damit...
dcalge

x-dragon
2004-05-10, 20:39:51
Original geschrieben von dcAlge
entweder
Label1.caption := floattostr(10000/(0.8 * wert));
oder
Label1.caption := inttostr(10000/(0.8 * wert));

bin nich sicher ....

du must den zahlenwert den du berechnest (integer oder float ka welches das jetzt is) in string umwandeln und das geht mit einem von den befehlen...
viel spass damit...
dcalge Wenn eine Division erfolgt ist das Ergebnis immer eine Float-Zahl (nach der Fehlermeldung, Extended), also muss FloatToStr zur Umwandlung verwendet werden, ansonsten müßte man zuvor alle Kommastellen abschneiden und in Integer umwandeln.

LordDeath
2004-05-10, 21:18:07
ok, von diesem floattostr hör ich zum ersten mal und das teil funzt auch damit. nur muss ich wohl noch lernen, das teil richtig einzusetzten und was der unterschied zwischen floattostr und strtofloat ist.

btw.
in edit1 ist standartmäßig ein kleiner text, der auffordert, dass man hier eine zahl eingibt. aber wenn ich keine zahl eingebe und den wert dort lasse, stürzt das programm ab. wie sollte ich jetzt dieses problem angehen?

LordDeath
2004-05-10, 21:37:08
und noch ein problem :(

ich will, dass falls der wert über 5000 ist, auch nur maximal 5000 angezeigt wird. dies wär bei den zahlren 2 (6250) und 1 (12500) der fall. mit procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.caption := FloatToStr(10000/(0.8 * StrToFloat(Edit1.text)));
if label1.caption > floattostr(5000) then
label1.caption := floattostr(5000);
end; hab ich dies auch teilweise erreicht. nur "2" zeigt der mir auch 5000 an, aber bei "1" steht da immernoch 12500. warum ignoriert delphi bei "1" die if bedingung?

und kann mir bitte auch jemand erklären, was der unterschied zwischen FloatToStr und StrToFloat ist?
wird da irgendwas string zu float und umgekehrt gemacht?

BubbleBoy
2004-05-10, 21:55:08
FloatToStr -> Gleitkommazahl in Text
StrToFloat -> Text in Gleitkommazahl


procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := FloatToStr(10000/(0.8 * StrToFloat(Edit1.Text)));
if StrToFloat(Label1.Caption) > 5000 then
Label1.Caption := FloatToStr(5000);
end;


Für numerische Vergleiche mußt du den Text erstmal in eine Zahl umwandeln (sonst willst du wissen was größer ist, ein Döner oder eine 5 ;)).

Xmas
2004-05-11, 13:36:49
LordDeath, da musst du noch einiges lernen... ;)

Daten haben einen Datentyp. Die Zeichenkette "5000" ist etwas ganz anderes als die Zahl 5000, und wenn du "12500" mit "5000" vergleichst, ist "5000" größer, weil Zeichenketten (Strings) alphanumerisch sortiert werden. Ebenso wie "Aal" vor "Zypresse" kommt, gehört "123456789" vor "2". Rechnen kannst du nur mit numerischen Typen. "20" * "50" ist genausowenig sinnvoll wie "Hut" * "Mantel".

Original geschrieben von LordDeath
btw.
in edit1 ist standartmäßig ein kleiner text, der auffordert, dass man hier eine zahl eingibt. aber wenn ich keine zahl eingebe und den wert dort lasse, stürzt das programm ab. wie sollte ich jetzt dieses problem angehen?
Nimm den Text da raus und setz ihn in ein Label neben der Edit-Box.
Außerdem solltest du die Exception EConvertError abfangen, aber versuch es besser erst mal ohne Exception-Handling.

LordDeath
2004-05-11, 14:25:38
vielen dank nochmal, leutz. habt mir echt geholfen ;)

@Xmas: ok, ich werd das mit dem label machen. von Expetion handling hab ich so noch keine ahnung und lass erstmal die finger davon :D