Delphi: kein güktiger Gleitkommawert !

Hey Leute,

ich arbeite grad im Rahmen einer Hausaufgabe an einem Delphi-projekt mir record und array. Ich weiß hier darf man keine HA reinstellen aber ich hab das Programm schon fertig nur zeigt es mir immer wenn ich grad eine csv -Datei öffnen möchte und sie in eine Tabelle reinladen möchte : ‚‘ ist kein gültiger Gleitkommawert !" ??? Ich hab echt keine Ahnung wie ich das Problem beheben soll. Könnt Ihr mir vllt. helfen ?

MEIN QUELLTEXT:

unit UnitMain;
// Felix Schmidt, GYB12
interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, Grids;

type TBundesland = record // record für Bundesländer

BLID :string[2]; // Bundesländer - ID (max 2 Zeichen)
BLName :string[40]; // Bundesländername (max. 30 Zeichen)
BLHauptstadt :string[30]; // Bundesländerhauptstadt (max. 10 Zeichen)
BLEinwohner :real; // Bundesländereinwohner
BLFlaeche :real; // Bundesfläche

end;

type
TFormMain = class(TForm)
MainMenu1: TMainMenu;
OpenDialog: TOpenDialog;
Menu1: TMenuItem;
N1: TMenuItem;
ffnen1: TMenuItem;
StringGrid: TStringGrid;
procedure FormCreate(Sender: TObject);
procedure ffnen1Click(Sender: TObject);
private
{ Private-Deklarationen }
datei :textfile; // Dateivariable (textfile)
Blaender :array[1…15] of TBundesland; // array für 16 Bundesländer
procedure BLaender_laden; // Procedure für das Laden der Bundesländer
procedure BLaender_ausgabe; // Procedure für das Ausgeben der Bundesländer
public
{ Public-Deklarationen }
end;

var
FormMain: TFormMain;

implementation

{$R *.DFM}

{ TFormMain }

procedure TFormMain.BLaender_ausgabe;
var i :integer;
begin
For i:=1 To 15 DO
Begin
StringGrid.Cells[1,i]:=Blaender[i].BLID;
StringGrid.Cells[2,i]:=Blaender[i].BLName;
StringGrid.Cells[3,i]:=Blaender[i].BLHauptstadt;
StringGrid.Cells[4,i]:=floattostr(Blaender[i].BLEinwohner);
StringGrid.Cells[5,i]:=floatotstr(Blaender[i].BLFlaeche);
end;
end;

procedure TFormMain.BLaender_laden;
var datenzeile :string; zeile :integer;
begin
assignfile(datei,opendialog.filename);
reset(datei);
readln(datei);

For zeile:= 1 TO 15 Do
Begin
readln(datei,datenzeile);

Blaender[zeile].BLID:=copy(datenzeile,1,pos(’;’,datenzeile)-1);
delete(datenzeile,1,pos(’;’,datenzeile));

Blaender[zeile].BLName:=copy(datenzeile,1,pos(’;’,datenzeile)-1);
delete(datenzeile,1,pos(’;’,datenzeile));

Blaender[zeile].BLHauptstadt:=copy(datenzeile,1,pos(’;’,datenzeile)-1);
delete(datenzeile,1,pos(’;’,datenzeile));

Blaender[zeile].BLID:=copy(datenzeile,1,pos(’;’,datenzeile)-1);
delete(datenzeile,1,pos(’;’,datenzeile));

Blaender[zeile].BLID:=copy(datenzeile,1,pos(’;’,datenzeile)-1);
delete(datenzeile,1,pos(’;’,datenzeile));

Blaender[zeile].BLEinwohner:=strftoloat(copy(datenzeile,1,pos(’;’,datenzeile)-1));
delete(datenzeile,1,pos(’;’,datenzeile));

Blaender[zeile].BLFlaeche:=strtofloat(copy(datenzeile,1,pos(’;’,datenzeile)-1));
delete(datenzeile,1,pos(’;’,datenzeile));
end;

closefile(datei);

end;

procedure TFormMain.FormCreate(Sender: TObject); // Tabellenbeschriftung
begin
StringGrid.Cells[0,0]:=‚Bundesland-ID‘;
StringGrid.Cells[1,0]:=‚Bundeslandname‘;
StringGrid.Cells[2,0]:=‚Bundeslandhauptstadt‘;
StringGrid.Cells[3,0]:=‚Bundeslandeinwohner‘;
StringGrid.Cells[4,0]:=‚Bundeslandfläche‘;
end;

procedure TFormMain.ffnen1Click(Sender: TObject);
begin
IF opendialog.Execute Then
Begin
BLaender_laden;
BLaender_ausgabe;
end;

end;

end…

Hallo Antitofu,

ich habe mir Dein Programm angesehen und mir sind ein paar Ungereimtheiten aufgefallen.

Vielleicht ist es ja Absicht von Dir, aber es kommt mir ziemlich merkwürdig vor, dass Du in der Prozedur

TFormMain.BLaender_laden Du folgendes machst :

1.) Du kopierst zweimal BLID und löschst anschließend
BLID.
Das erste Mal funktioniert das. Beim zweiten Mal
ist tatsächlich kein gültiger Gleitkommawert
vorhanden.
Kommentiere eines davon aus und teste das Programm
erneut.

2.) Beim Kopieren von BLEinwohner ist ein Schreibfehler
vorhanden. Es muss doch sicherlich „strtofloat“
heissen und nicht „strftoloat“.

3.) So ganz verstehe ich nicht, warum Du im
„BLaender_laden“ BLEinwohner in eine float Variable
umwandelst und nachher in „BLaender_ausgabe“ Du
wieder „Blaender.BLEinwohner“ wieder in einen
String umwandelst.

Normalerweise kannst Du Dir das sparen. Wenn die
Variable als String vorliegt, dann kopiere sie als
String, denn in der Ausgabe wird die Variable auch
als String benötigt.

Meines Erachtens gibt es bei Einwohnern keine
Kommastellen (bei Fließkomma Variablen), es sei
denn, Du hast irgendwelche Werte wie „13.9
Millionen“

4.) Gleiches gilt für BLFlaeche. Obwohl hier sicherlich
Kommawerte auftauchen werden, ist hier die Eingabe
ein String und die Ausgabe ebenfalls ein String.

5.) Mir drängt sich ein Verdacht auf. Hast Du
vielleicht in der Datendatei ein Komma als
Dezimaltrennzeichen stehen ??? Dein Gedanke war,
durch die Umwandlung hin und zurück würde das
Dezimaltrennzeichen von einem Komma in einen Punkt
geändert. Das funktioniert so nicht, weil bei dem
ersten Aufruf schon keine Fließkommazahl gefunden
wird.

Ersetze dieses durch einen Punkt und Dein Problem
hat sich erledigt.

Ich hoffe, ich konnte Dir helfen.

MfG

Cowboy_herby

Moin moin,

ein Problem dürfte sein, dass die Typ-Konvertierung strtofloat heißt und nicht strftoloat (Buchstabendreher!) zum anderen benötigt die Typ-Konvertierfunktion strtofloat ein Dezimaltrennzeichen, welches dem entspricht, was in den Ländereinstellungen hinterlegt ist. Ist in den Ländereinstellung das Komma (,) als Dezimaltrennzeichen hinterlegt, so laufen Werte wie 1234.56 auf einen Typkonvertierungsfehler. Gleiches gilt natürlich für den Dezimalpunkt (.), Wenn die Werte in der Form 1234,56 gelesen werden.

Ein weiteres Problem könnte der Datentyp der Zielvariablen sein. Die Funktion strtofloat konvertiert in eine ‚Extended floating point number‘ und Variablen vom Typ REAL können nur eine Untermenge von EXTENDED aufnehmen. Wenn der konvertierte String zu groß ist für REAL, kann es auch zu dieser Fehlermeldung kommen.

Hier die Definition für alle Gleitkommazahlen in Delphi:

Type Currency A decimal type with 4 decimal points used for financial values
Type Double A floating point type supporting about 15 digits of precision
Type Extended The floating point type with the highest capacity and precision
Type Real A floating point type supporting about 15 digits of precision
Type Real48 The floating point type with the highest capacity and precision
Type Single The smallest capacity and precision floating point type