Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - '-13.916' kein gültiger Gleitkommawert


Martello - Sa 21.03.09 00:09
Titel: '-13.916' kein gültiger Gleitkommawert
Warum zum Deiphi ist '-13.916' kein gültiger Gleitkommawert?

Mo.


JayEff - Sa 21.03.09 00:10

Vielleicht ist DecimalSeparator = ',' ? :nixweiss:


Martello - Sa 21.03.09 00:16

user profile iconJayEff hat folgendes geschrieben Zum zitierten Posting springen:
Vielleicht ist DecimalSeparator = ',' ? :nixweiss:


Hatte ich auch schon probiert. Aber der Standard ist Dezimalpunkt, und daran liegt es definitiv nicht :cry:


JayEff - Sa 21.03.09 00:19


Delphi-Quelltext
1:
2:
3:
4:
var
  x : Extended;
begin
  x := -13.916;
klappt bei mir :nixweiss:

edit: erst bei der Nutzung von StrToFloat wird's abhängig vom Systemstandard: x := StrToFloat('-13,916'); klappt, mit . nicht.


Manina - Sa 21.03.09 00:22

Du hast doch nicht etwa die Hochkommas mit im Quelltext ? :oops:

Delphi-Quelltext
1:
2:
3:
4:
5:
var f : Double;
begin
  f := '-13.916'// falsch
  f := -13.916// richtig
end;


Martello - Sa 21.03.09 00:28

user profile iconJayEff hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
var
  x : Extended;
begin
  x := -13.916;
klappt bei mir :nixweiss:

edit: erst bei der Nutzung von StrToFloat wird's abhängig vom Systemstandard: x := StrToFloat('-13,916'); klappt, mit . nicht.


Ich hatte den gleichen Test durchgeführt :wink:

... und bei der Nutzung von StrToFloat kommt die Fehlermeldung. Blöd.

Wo oder wie kann ich den Systemstandard modifizieren, da hier offensichtlich der Hund begraben liegt...

Mo.


jaenicke - Sa 21.03.09 00:35

user profile iconMartello hat folgendes geschrieben Zum zitierten Posting springen:
Wo oder wie kann ich den Systemstandard modifizieren, da hier offensichtlich der Hund begraben liegt...
Wenn mir ein Programm den für das gesamte System verändern würde, dann würde das Programm aber sowas von schnell von der Festplatte fliegen...

Wie du die Einstellung für dein Programm änderst, hat user profile iconJayEff doch gleich als erstes praktisch schon geschrieben. Also welche Variable das ist.

Die Frage ist aber eher woher der Wert kommt, vielleicht kann man da gleich für das richtige Format sorgen.


F34r0fTh3D4rk - Sa 21.03.09 00:36

Ich denke mal, dass du schauen solltest wie du den Systemstandard erfragst und da wurde schon der Suche in der Entwickler-Ecke DECIMAL SEPARATOR genannt, der wahrscheinlichsterweise (interessante neue Wortkonstruktion) für dein Problem verantwortlich ist.

mfg


Martello - Sa 21.03.09 00:50

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Die Frage ist aber eher woher der Wert kommt, vielleicht kann man da gleich für das richtige Format sorgen.


Der Punkt kommt aus der Input-Datei.txt. Und der alte TP-Code innerhalb meiner UNIT1 verarbeitet nur Dezimalpunkte richtig, so wie ich es aus TP kenne.

Der String heißt "zeile"


Delphi-Quelltext
1:
2:
edit1.text:=zeile;
PaintBox1.Canvas.LineTo(j,round(strtofloat(zeile)));


und mit edit1.text:= zeile wollte ich mir den Wert anzeigen lassen, aber in Edit1 erscheint kein String :cry:

Mo.


JayEff - Sa 21.03.09 01:10

Schreib dir doch ein eigenes MyStrToFloat in dem du per TryStrToFloat prüfst ob's geht, und falls nicht, per StringReplace(alt, '.', ',', [rfReplaceAll); den Punkt durch ein Komma ersetzt :)

Dein Quellcode suggestiert, dass 'zeile' leer ist. Vielleicht liegt der Fehler ja da, zeig doch mal ein bisschen mehr relevantes? Vielleicht ließt du die Datei in einer Schleife aus und der Fehler tritt bei einer Leerzeile auf, die am Ende der Datei sitzt?


jaenicke - Sa 21.03.09 01:36

user profile iconMartello hat folgendes geschrieben Zum zitierten Posting springen:
Der Punkt kommt aus der Input-Datei.txt. Und der alte TP-Code innerhalb meiner UNIT1 verarbeitet nur Dezimalpunkte richtig, so wie ich es aus TP kenne.
Dann setz doch einfach den Dezimalseparator und das Tausendertrennzeichen entsprechend, wenn du sicher bist, dass das Format der Daten immer so ist.


mkinzler - Sa 21.03.09 09:28

Oder verwende (wenn durch deine Delphiversion unterstützt) die überladenen Version der Konvertierungsfunktion mit angabe der Formateinstellungen


Martello - Sa 21.03.09 12:02

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconMartello hat folgendes geschrieben Zum zitierten Posting springen:
Der Punkt kommt aus der Input-Datei.txt. Und der alte TP-Code innerhalb meiner UNIT1 verarbeitet nur Dezimalpunkte richtig, so wie ich es aus TP kenne.
Dann setz doch einfach den Dezimalseparator und das Tausendertrennzeichen entsprechend, wenn du sicher bist, dass das Format der Daten immer so ist.


Der Fehler tritt doch in der selben UNIT1 auf, in der der Dezimalpunkt (vom alten Code) korrekt verwendet wird.
Erst die Funktion StrToFloat liefert die Fehlermeldung, gleich beim ersten Wert übrigends und nicht erst am Ende der Input-Datei. Aber stutzig macht mich auch die Tatsache, daß edit1 leer bleibt. Ich habe diese Zuweisung nämlich nur als Kontrolle vor die störrische geschrieben.


Martello - Sa 21.03.09 12:04

user profile iconmkinzler hat folgendes geschrieben Zum zitierten Posting springen:
Oder verwende (wenn durch deine Delphiversion unterstützt) die überladenen Version der Konvertierungsfunktion mit angabe der Formateinstellungen


Das würde ich mir gerne für ein fortgeschritteneres Lernstadium vorbehalten :wink:


Martello - Sa 21.03.09 12:12

user profile iconJayEff hat folgendes geschrieben Zum zitierten Posting springen:
Schreib dir doch ein eigenes MyStrToFloat in dem du per TryStrToFloat prüfst ob's geht, und falls nicht, per StringReplace(alt, '.', ',', [rfReplaceAll); den Punkt durch ein Komma ersetzt :)

Dein Quellcode suggestiert, dass 'zeile' leer ist. Vielleicht liegt der Fehler ja da, zeig doch mal ein bisschen mehr relevantes? Vielleicht ließt du die Datei in einer Schleife aus und der Fehler tritt bei einer Leerzeile auf, die am Ende der Datei sitzt?


zeile ist ein String, nur solche Zahlen wie z.B. -13.916 stehen in der Text-Datei inn, die hier ausgelesen wird


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
repeat          {alle Punkte}

readln(pkt,zeile);
val(zeile,zeiger,code);   {Zeiger zeigt auf Startpunkt jedes Zyklus'}

reset(inn);
for i:= 1 to zeiger-4 do readln(inn,zeile); {neuer Startpunkt mit Vorlauf}
for j:= 1 to arr do     begin

    readln(inn,zeile);
    if zeile[6]=#09 then zeile:= copy(zeile,1,5);
    edit1.text:=zeile;
    PaintBox1.Canvas.LineTo(j,round(strtofloat(zeile)));

    write(out,zeile,#9end;
    writeln(out);       {fr nexten Zyklus...}



until eof(pkt); {alle Punkte}


jaenicke - Sa 21.03.09 16:09

user profile iconMartello hat folgendes geschrieben Zum zitierten Posting springen:
Der Fehler tritt doch in der selben UNIT1 auf, in der der Dezimalpunkt (vom alten Code) korrekt verwendet wird.
Erst die Funktion StrToFloat liefert die Fehlermeldung, gleich beim ersten Wert übrigends und nicht erst am Ende der Input-Datei.
Wenn die alten Turbo Pascal Funktionen nicht die Systemeinstellungen verwenden...
Welcher Code funktioniert denn bei der Umwandlung korrekt?

user profile iconMartello hat folgendes geschrieben Zum zitierten Posting springen:
Aber stutzig macht mich auch die Tatsache, daß edit1 leer bleibt. Ich habe diese Zuweisung nämlich nur als Kontrolle vor die störrische geschrieben.
Wenn bei StrToFloat nicht der richtige Wert ankommen würde, dann würde ja auch nicht die Fehlermeldung mit dem richtigen Wert angezeigt werden. ;-)


Martello - Sa 21.03.09 21:09

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wenn bei StrToFloat nicht der richtige Wert ankommen würde, dann würde ja auch nicht die Fehlermeldung mit dem richtigen Wert angezeigt werden. ;-)


Interessant ist ja, daß der Sting in edit1.text angezeigt wird, wenn ich ihn testweise kurz zuvor als
'-13,916' definiere. Dann bleibt auch die Fehlermeldung aus. Somit ist '-13,916' ein String und eine korrekte Floatzahl wohingegen '-13.916' weder String noch eine korrekte Floatzahl ist :?. Blöd bleibt natürlich die Tatsache, daß die TP-Funktionen nur mit Dezimalpunkt arbeiten, Delphi aber Kommata erwartet.

Ich erwarte eine aktuellere Delphi-Version als CD-Beilage zu einem populären Lernbuch, das ich gestern bestellt habe. Oder kann ich auch in der Version 1.0 bereits irgendwo "Punkt" als Dezimaltrenner definieren?


jaenicke - Sa 21.03.09 21:15

user profile iconMartello hat folgendes geschrieben Zum zitierten Posting springen:
Ich erwarte eine aktuellere Delphi-Version als CD-Beilage zu einem populären Lernbuch, das ich gestern bestellt habe. Oder kann ich auch in der Version 1.0 bereits irgendwo "Punkt" als Dezimaltrenner definieren?
Version 1.0? :shock:

Nimm doch das kostenlose und sehr gute Turbo Delphi (das ist Delphi 2006 Professional ohne Unterstützung für zusätzliche Packages):
http://www.delphi-library.de/viewtopic.php?p=539975
Das ist ohnehin viel komfortabler als die alte Delphi 7 PE, die in einem Buch mal dabei war.

user profile iconMartello hat folgendes geschrieben Zum zitierten Posting springen:
Blöd bleibt natürlich die Tatsache, daß die TP-Funktionen nur mit Dezimalpunkt arbeiten, Delphi aber Kommata erwartet.
[...]
Oder kann ich auch in der Version 1.0 bereits irgendwo "Punkt" als Dezimaltrenner definieren?
Gibt es denn die bereits mehrfach angesprochene Variable DecimalSeparator usw. noch nicht bei dir? Hast du das denn getestet?


Martello - Sa 21.03.09 21:31

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Gibt es denn die bereits mehrfach angesprochene Variable DecimalSeparator usw. noch nicht bei dir? Hast du das denn getestet?


Die Hilfe kennt diesen Begriff jedenfalls noch nicht. Ich glaube, ich warte lieber mal ein Weilchen bis ich ein aktuelleres Delphi habe. A propos Turbo Delpbi: Ich hatte das bereits downgelaodet und die Installation gestartet. Als er dann aber nach und nach aufforderte zuerst WE6 und dann irgend ein NET zu installieren, habe ich wieder abgebrochen und alles von der Platte gelöscht. Vielleicht probier ich's nochmal, wenn du von der 7PE abrätst, ich glaube nämlich, genau die wird mit dem Buch geliefert...


jaenicke - Sa 21.03.09 21:39

user profile iconMartello hat folgendes geschrieben Zum zitierten Posting springen:
Als er dann aber nach und nach aufforderte zuerst WE6 und dann irgend ein NET zu installieren, habe ich wieder abgebrochen und alles von der Platte gelöscht. Vielleicht probier ich's nochmal, wenn du von der 7PE abrätst, ich glaube nämlich, genau die wird mit dem Buch geliefert...
Der Delphi 7 PE fehlen sehr sehr viele Funktionen, die das neuere Turbo Delphi schon hat.

Einziger wirklich großer Vorteil von Delphi 7: Es läuft auch noch unter Windows 98/ME und es ist sehr schnell beim Start.

Voraussetzung für Turbo Delphi sind die Microsoft.NET 1.1 Runtime und das 1.1 SDK, die J# Runtime, MSXML und der InternetExplorer 6.01 oder höher (wobei der IE ja schon aus Sicherheitsgründen ohnehin aktuell sein müsste).


Martello - Sa 21.03.09 21:47

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Voraussetzung für Turbo Delphi sind die Microsoft.NET 1.1 Runtime und das 1.1 SDK, die J# Runtime, MSXML und der InternetExplorer 6.01 oder höher (wobei der IE ja schon aus Sicherheitsgründen ohnehin aktuell sein müsste).


Vor der Installation müssen unbedingt zuerst diese Dinger installiert werden, behauptet die Installtion:

ZITAT

Microsoft .NET Framework v1.1 Redistributable
Sprachpaket Deutsch für Microsoft .NET Framework v1.1
Microsoft .NET Framework v1.1 SP1
Microsoft .NET SDK v1.1
Microsoft Internet Explorer 6 SP1
Microsoft Visual J# v1.1 Redistributable
Sprachpaket für Microsoft Visual J# .NET Redistributable Package v1.1
Microsoft XML Core Services (MSXML) v4.0 SP2

Diese Software ist auch in einer einzigen Zip-Datei HIER als Download verfügbar.

ZITAT ENDE

"HIER" gibt es aber gar nicht mehr. Muß es nun die ganze Liste sein, oder genügt die Auswahl, die Du genannt hast?
IE6 hab ich bereits...

Mo.


Martello - Sa 21.03.09 21:53

error


jaenicke - Sa 21.03.09 21:55

Ja, die SPs und so habe ich in der Auflistung weggelassen, weil ich die auswendig nicht wusste. Brauchen tust du die schon, aber das musst du ja nicht selbst manuell einzeln installieren.

In dem Link habe ich ja gezeigt wie das Setup von Delphi selbst die Installationen fehlender Voraussetzungen automatisch startet.


Martello - Sa 21.03.09 22:05

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
In dem Link habe ich ja gezeigt wie das Setup von Delphi selbst die Installationen fehlender Voraussetzungen automatisch startet.


Statt einer SerienNummer habe ich eine reg736.txt erhalten. Bedeutet dies, daß die Zertifizierung heute wahrscheuinlich ein wenig anders abläuft. als in Deiner "Rezeptur" beschrieben?


jaenicke - Sa 21.03.09 22:32

In dieser Datei steht ja wo du sie hinlegen musst. Die Datei gehört unter:

Quelltext
1:
2:
3:
c:\Dokumente und Einstellungen\[Benutzername]
bzw.
C:\Users\[Benutzername]


Martello - So 22.03.09 21:12

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
In dieser Datei steht ja wo du sie hinlegen musst. Die Datei gehört unter:

Quelltext
1:
2:
3:
c:\Dokumente und Einstellungen\[Benutzername]
bzw.
C:\Users\[Benutzername]


Turbo 2006 läuft fein. Danke für die Hilfe.

Als nächstes möchte ich Daten im Diagramm nicht nur statisch darstellen, sondern mit einem Kursor (Mausaktionen) Marken setzen und weiterverarbeiten. In welcher Gegend der vielen Delphi-Objekte muß ich denn suchen und ausprobieren, um das zu lernen?

Mo.


jaenicke - So 22.03.09 21:48

Das wirst du selbst umsetzen müssen (oder du findest eine entsprechende Komponente). Du musst darauf reagieren, wenn der Benutzer mit der Maus auf die PaintBox klickt usw., aber zu dem Thema solltest du dann auch ein neues Thema aufmachen. ;-)