Entwickler-Ecke
Sonstiges (Delphi) - Hilfe für Wiedereinsteiger
Flonkon - Do 06.10.11 17:57
Titel: Hilfe für Wiedereinsteiger
Hallo ihr da ich bin auf euer Forum gestoßen weil ich an einem Problem verzweifle ...
Hoffe das ihr mir helfen könnt...
Und zwar bin ich seit kurzem Wiedereinsteiger mit Delphi, hab eine ganze Zeit lange mit Delphi gearbeitet und dann wieder über 1 Jahr gar nicht...
jetzt wollte ich mal wieder anfangen und wollte mir einen ganz einfachen Stundenrechner für meine Arbeitszeiten basteln, das ganze im Zusammenhang mit
einer MySql Datenbank, hat soweit schon alles super geklappt, Datenbank erstellt, mit Delphi geöffnet ausgelesen, schreiben etc funktioniert problemlos
so wie ich es in Erinnerung habe.
Mein jetztiges Problem ist folgendes, ich bin mir aller Variablentypen nicht mehr sicher, in meiner Datenbank habe ich die Arbeitsstunden in Float gesichert,
lese Sie in Delphi in Real aus und schreibe sie als String in Textfelder, ich bekomme es aber nicht hin diese Daten wieder rauszuholen und
dann die Arbeitsstunden mal den Stundenlohn zu rechnen, ich probiere sie aus dem String zu holen und mit strtofloat dann wieder in die Real Variable zu bringen,
aber Delphi sagt mir das meine Zahl (in meinem Fall 6,5) not a valid float ... ist ... hier mal der Ausschnitt von meinem Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var s:string; hl2:string; hl3:string; hl5:real; i:integer; hrs:real; hl:real; hl4:longint;
label1.Caption:=FloatTostr(hrs); hl3:=label3.caption; hl4:=strtoint(hl3); hrs:=hrs*hl4;
label5.caption:=floattostr(hr s) |
jaenicke - Do 06.10.11 18:07
Hallo und :welcome:
Der Fehler kommt eher bei StrToFloat. :gruebel:
In welcher Zeile genau tritt der Fehler denn auf?
Nebenbei:
Real sollte besser nicht verwendet werden, nimm besser Double...
Flonkon - Do 06.10.11 18:26
Hab das ganze jetzt wieder anders versucht und aufgebaut und es sieht jetzt folgendermaßen aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| var i:integer; s:string; hl2:string; hl3:double; hl5:double; hrs:double; hl:double; hl4:double;
hl3:=strtofloat(label1.caption); hl4:=strtofloat(label3.caption); hl5:=hl3*hl4;
label5.caption:=floattostr(hl5); |
Bekomme nun den gleichen Fehler ind Zeile 13 also bei:
Delphi-Quelltext
1:
| hl3:=strtofloat(label1.caption); |
Ich arbeite übrigens noch mit Delphi 6 falls das irgendwas ausmacht...
Dude566 - Do 06.10.11 18:38
Wie sieht denn die Beschriftung des Labels aus, also z.B. "2,3" oder "2.3"?
Edit: Im Falle von "2.3" müsste dann zur Laufzeit eine Fehlermeldung kommen, dass "2.3" kein gültiger Gleitkommawert ist. ;)
HenryHux - Do 06.10.11 18:56
Hi
Das Problem ist, dass du nach der Variablendeklaration das begin vergessen hast.
lg
Dude566 - Do 06.10.11 19:01
Dann würde aber Delphi doch eine andere Fehlermeldung werfen oder? :gruebel:
Flonkon - Do 06.10.11 19:11
Das sind nur Ausschnitte aus meinem Code, der gesamte sieht anders aus, ich kopier ihn hier mal rein:
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:
| procedure TfrmMain.Button2Click(Sender: TObject); var s:string; hl2:string; hl3:double; hl5:double; i:integer; hrs:double; hl:double; hl4:double;
begin db.ListTables(); listbox2.items:= db.GetResultAsStrings;
if wrapquery (db,'SELECT Datum FROM tbl_datum') then listbox5.items:=db.GetResultAsStrings;
if wrapquery(db,'SELECT Uhrzeit FROM tbl_uhrzeit') then listbox6.Items:=db.GetResultAsStrings;
if wrapquery(db,'SELECT Zeit FROM tbl_zeit') then listbox7.Items:=db.GetResultAsStrings;
if wrapquery(db,'SELECT Titel FROM arbeitgeber') then s:=db.GetResultAsText; label7.Caption:=s;
if wrapquery(db,'SELECT stundenlohn FROM lohn') then s:=db.getresultastext; s:=StringReplace(s,'.' , ',' ,[rfReplaceAll, rfIgnoreCase]); edit1.Text:=s; label3.Caption:=s;
For i:=0 to listbox7.Count-1 do begin
hl2:=listbox7.Items[i]; hl2:=StringReplace(hl2,'.' , ',' ,[rfReplaceAll, rfIgnoreCase]); hl:=strtofloat(hl2); hrs:=hrs+hl;
end;
label1.Caption:=FloatTostr(hrs);
hl3:=strtofloat(label1.caption); hl4:=strtofloat(label3.caption); hl5:=hl3*hl4;
label5.caption:=floattostr(hl5);
end; |
So siehts insgesamt aus ich habe also vorher alle Punkte in meiner Zahl durch Kommas ersetzt und es klappt trotz allem nicht...
Marc. - Do 06.10.11 19:24
Was mir noch auffällt ist, dass du die Variable hrs nicht initialisiert hast.
Weißt du eigentlich, wofür deine Abkürzungen stehen? hrs, hl ist ein Double, hl2 dagegen ein String. Für mich ist die Bennenung sehr verwirrend. :gruebel:
Dude566 - Do 06.10.11 19:32
Flonkon hat folgendes geschrieben : |
So siehts insgesamt aus ich habe also vorher alle Punkte in meiner Zahl durch Kommas ersetzt und es klappt trotz allem nicht... |
Ich kann den Fehler nicht nachvollziehen, bei mir funktioniert folgender Code einwandfrei:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1.Button1Click(Sender: TObject); var test : double; begin test := StrToFloat(edit1.Text); end; |
Flonkon - Do 06.10.11 19:56
@Marc
Ja ich muss da mal aufräumen das stimmt wohl bin selber etwas durcheinander gekommen teilweise mit den Variablen, damit hat ich schon immer Probleme
@Dude566
Funktioniert das denn auch wenn du es aus nem label nimmst und nicht aus nem edit ?
Dude566 - Do 06.10.11 20:16
Flonkon hat folgendes geschrieben : |
@Dude566
Funktioniert das denn auch wenn du es aus nem label nimmst und nicht aus nem edit ? |
Ja funktioniert es.
Marc. - Do 06.10.11 20:20
Flonkon hat folgendes geschrieben : |
| Funktioniert das denn auch wenn du es aus nem label nimmst und nicht aus nem edit ? |
Unter Delphi2009 ja, sofern ich als Trennzeichen das Komma statt dem Punkt verwende. Aber das ist Systemeinstellung. ;)
Befindet sich in deiner Caption vielleicht noch ein Leerzeichen oder sonstige Steuerzeichen, wie #13#10?
jaenicke - Do 06.10.11 20:25
Da die Variable nicht initialisiert ist, ist es schlicht Zufall was in dem Label ankommt. Gib den Inhalt doch einfach einmal in der Zeile vor dem Fehler mit
Delphi-Quelltext
1:
| ShowMessage('"' + label1.caption + '"'); |
aus. Dann siehst du ja was drin ist.
Dude566 - Do 06.10.11 20:27
So wie ich ihn verstanden habe, hat er das Label ja wohl mit "6,5" beschriftet und so funktioniert es auch bei mir, wieso auch nicht. :lol:
Flonkon - Do 06.10.11 20:39
In dem Label stehen genau die 6,5 also der Stundenlohn, ich versteh auch nicht woher das kommen kann wenn ich das in nem anderen Programm ausprobiere, dann klappt es auch ich weiß nicht woran das liegen könnte...
HenryHux - Do 06.10.11 21:38
Du könntest doch einmal das komplette Projekt hochladen, würde es einfacher für uns machen.
Chemiker - Do 06.10.11 22:11
Hallo,
| jaenicke hat folgendes geschrieben: |
Real sollte besser nicht verwendet werden, nimm besser Double
|
Das ist eigentlich egal, weil real double entspricht. Was man nicht mehr verwenden sollte ist real48, dieser Datentyp ist veraltet.
Bis bald Chemiker
Flonkon - Fr 07.10.11 06:13
Ich hab euch hier mal das komplette Projekt hochgeladen, ich möchte bitte keine Anspielungen zur formatierung meines Source hören,
ich weiß das es absolut unübersichtlich und schlecht ist... aber bis jetzt hat es funktioniert :-)
Ich benutze wie gesagt Delphi 6 und Xampp, ihr müsst also die "stundenplaner.sql" bei Xampp einfügen sonst klappt das ganze nicht ...
und falls ihr bei Xampp anderen Benutzernamen und Passwort habt dies auch im Programm ändern...
Versucht mal euer Glück...
http://www.mediafire.com/?x9q7i6w7c8qh97o
jaenicke - Fr 07.10.11 06:30
Mal eine ganz andere Frage:
Benutzt du zufällig Windows 7?
Wenn ja, stell doch einfach mal in den Regions- und Spracheinstellungen die Formateinstellung auf eine andere Sprache, übernehme und stell sie zurück auf Deutschland. Da gibt es nämlich auf einigen PCs (offenbar nur / vor allem vorkonfiguriert ausgelieferte) falsche Einstellungen. ;-)
Wegen dem Downloadlink:
Häng die Datei doch bitte einfach im Forum an, das wäre sinnvoller...
Flonkon - Fr 07.10.11 08:53
Windows 7 habe ich habs ausprobiert aber es klappt leider auch nicht mit den Regions und Spracheinstellungen
hier nochmal die Datei....
Moderiert von
Narses: Inline- in normalen Anhang gewandelt, Binaries aus dem Archiv entfernt.
Flonkon - Mo 10.10.11 08:31
Kann denn nun jemand wenigstens dass problem nachvollziehen ?
Horschdware - Mo 10.10.11 09:15
Der Fehler ist, dass du Komponenten, welche für die grafische Ausgabe zuständig sind, für die Datenhaltung benutzt.
Baue dein Programm so um, dass die Werte, mit denen gerechnet werden soll, in passenden Variablen abgelegt wird.
So sparst du dir auch die "Punkt-oder-Komma-Problematik".
Flonkon - Mo 10.10.11 09:51
Okay kannste mir vielleicht ein Beispiel geben wie genau du dass meinst ?
Boldar - Mo 10.10.11 10:01
Benutze die Labels nicht zum Vorhalten der Werte. Mache dir unter private entsprechende Variablen, oder wenn sich der Wert nie ändert, eine Konstante.
Horschdware - Mo 10.10.11 10:03
Speichere die Werte, die du von der Datenbank liest / die der Benutzer eingibt / die du errechnest / etc. in Variablen, die du im private-Bereich deines Formulars erstellst.
Nach dem Laden / Ändern musst du dann jeweils eine Ausgabe der Werte auf deine grafische Oberfläche veranlassen.
Flonkon - Mo 10.10.11 15:53
Funktioniert leider auch nicht, ich bin glaub ich etwas zu blöd, ich habe die 6,5 ja in der DB als Float gespeichert, weiß aber nicht wie ich sie auch als solche auslese sondern lese den Lohn als String aus, wenn ich den dann in eine Double konvertieren will mit StrToFloat kommt der Fehler egal ob ich die Werte direkt in die Labels schreibe oder in Variablen ablege...
Chemiker - Mo 10.10.11 19:37
Hallo Flonkon,
ich kenne jetzt nicht MySql, aber ich vermute das die float-Zahlen mit einem Punkt abgespeichert werde (6.5). Um weiter zu kommen könntest Du die Zahl aus der DB erst mal in einen String Umwandeln, zum Testen würde sich die Procedure Str anbieten.
Delphi-Quelltext
1: 2:
| Str(DB_StdLohn, StrStdLohn); Label1.Caption:= StrStdLohn; |
DB_StdLohn ist der Wert aus der DB als float
StrStdLohn muss noch als String deklariert werden.
Das ist nur ein Test, also nicht das ganze Programm umstellen.
Bis bald Chemiker
Flonkon - Di 11.10.11 06:27
@Chemiker
Danke für den Tipp, aber das war das was ich oben beschrieben habe, ich hole mir die Zahl aus der Datenbank ja als String, tausche dann Punkt mit Komma und versuche sie dann in eine Double Variable zu bekommen und genau da bekomme ich den Fehler...
--
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!