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.

Hi,
setze einen Brakepoint auf die erste Zeile der Methode in der die CSV Datei geladen wird. dann steppe mal durch, dann hast Du schon mal die Zeile in der der Fehler auftritt. Die Fehlermeldung sagt nichts anderes, als dass Du versuchst einen Leerstring (’’) in eine Zahl umzuwandeln (Gleitkommawert = Float/Double). Und das geht natürlich nicht, weil ‚‘ keine gültige Zahl ist (‚0‘ ist was anderes)

Grüße

Hallo,
beachte bitte auch die Hinweise, die ich paar Postings weiter unten zum Thema Debuggen gegeben habe.
Dann kommst du womöglich auch selber besser zurecht.
-> „Re: Delphi Shellsort - Zahlen sortieren“
/t/delphi-shellsort-zahlen-sortieren/7231773/2
Gruß Uwi

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(’;’,datenze
ile)-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.

Hi …

StringGrid.Cells[4,i]:=floattostr(Blaender[i].BLEinwohner);
StringGrid.Cells[5,i]:=floatotstr(Blaender[i].BLFlaeche);

ich nehme an, es kracht in einer dieser beiden Zeilen. benütze den Debugger um sicher zu sein.

Wahrscheinliche Fehlerquellen:

  1. die csv Datei enthält Leerzeilen ider Leerzeichen, besonders teuflisch wäre das ganz am Ende, weil man die nicht sehen kann. Kannst Du durch einen einfachen Trim der eingelesenen Zeile + Test auf Leerzeile abfangen.
  2. die Zahlenwerte in der csv Datei waren mit Punkten oder Kommata formatiert. Die Umwandlungsfunktion kann nur mit dem „.“ als Dezimaltrennzeichen (amerikanische Zahlenschreibweise) umgehen, andere Formatierungszeichen werden überhaupt nicht unterstützt. Sowas wie 1.123,45 kann man auf diese Weise nicht interpretieren lassen. Halte ich für unwahrscheinlicher, da dann der Absturz dann m.E. anders aussehen müsste, aber ein kurzer Blick in die Datei schadet sicher nicht. Wenn sie nicht allzu lang ist kannst Du sie auch gerne hier reinstellen (Leerzeichen würden wir dann aber vermutlich auch nicht sehen).

Gruss

Armin.

… mehr auf http://w-w-w.ms/a4bf6b