带有消息“''的异常类EConvertError不是有效的浮点值”。

时间:2018-08-11 15:46:58

标签: delphi

嘿,有人可以帮我解决这个错误,我似乎找不到解决方法。 任何帮助,将不胜感激。 我正在使用Windows 8和Delphi RAD Studio 2010。

如果还有更多错误,那么我指的是什么,请随时对其进行评论。

procedure TfrmStats.FormShow(Sender:      TObject);
begin
 // // Code that connects the     TADOConnection to the database
// //conDatabase.Close;
// conDatabase.ConnectionString :=        'Provider=Microsoft.Jet.OLEDB.4.0;Data    Source=E:\[Phase    2]\db_DatabaseStock.mdb;Persist Security    Info=False' ;
// conDatabase.Open;

// Code sets radiobutton.checked and   checkbox.checked to true to avoid errors   and
 // simplify GUI
 rb2D.Checked := True;
 chkShowLegend.Checked := True;

 // Code hides ShowGrid checkbox
 chkShowItemGrid.Visible := False;

 //Code hides Stringgrid
 SGStats.Visible := False;

     DrawPie;
     **end;**  // The breakpoint is here (Where delphi says the error is)

我还将显示被调用过程的代码:

procedure TfrmStats.DrawPie;
var
sSQL :string;
iRow, iCol, iA : Integer;
dblGT, dblLST, dblValue, PiePercentage : Double;
begin
 // Procedure used to draw the chart of data
 // Here call Subtotal
 SGstats.Cells[0,1] := 'Sub Total';
 SGstats.Cells[1,1] :=    IntToStr(GetSub);

 with qryItems do
 begin
 // Select itemname an populate the stringgrid
   SQL.Clear;
   sSQL := 'SELECT DISTINCT ItemName FROM tblItems ORDER BY ItemName';
   SQL.Add(sSQL);
   Open;
   Active := False;
   Active := True;

   if (RecordCount <> 0) then
   begin
     SGstats.RowCount := SGstats.RowCount + RecordCount;
     for iRow := 0 to RecordCount -1 do
     begin
       SGstats.Cells[0,iRow+2] :=   FieldByName('ItemName').AsString;
       Next;
     end;

   end;
 end;
 qryItems.Close;

  with qryItems do
 begin
 // Select itembookquantity and populate the stringgrid
   SQL.Clear;
       sSQL := 'SELECT DISTINCT ItemName, ItemBookQuantity FROM tblItems ORDER BY ItemName';
   SQL.Add(sSQL);
   Open;
   Active := False;
   Active := True;

   if (RecordCount <> 0) then
    begin
      SGstats.RowCount := SGstats.RowCount + RecordCount;
      for iRow := 0 to RecordCount -1 do
      begin
       SGstats.Cells[1,iRow+2] := FieldValues['ItemBookQuantity'];
       Next;
      end;
   end;
 end;

 // Code that actually draws piechart
 with chtStats do
 begin
   //Clear the charts series
   while (SeriesCount> 0) do
   Series[0].Free;

    //Change title
   Title.Text.Clear;
   Title.Text.Add('Items');

    // Add series to piechart
   AddSeries(TPieSeries.Create(Self));
   Series[0].Name := 'PieItems';

   for iRow := 2 to SGstats.RowCount -2      do
    begin
          PiePercentage :=     (StrToFloat(SGstats.Cells[1,iRow])/StrToFloat(SGstats.Cells[1,1]))*100;
         Series[0].Add(StrToFloat(SGstats.Cells[1,  iRow]), SGStats.Cells[0,iRow] + ', ' + FormatCurr('0.####',PiePercentage) + ' %', clteecolor);
       end;
     end;  

小计应该是整数。运行程序时,我也遇到“身份验证失败”错误,我们将为您提供任何帮助。我仍然只是一个初学者,所以我可能忽略了小事情或犯了简单的错误:D

如果我需要添加更多信息来帮助您,请告诉我!

1 个答案:

答案 0 :(得分:2)

错误消息非常清楚:您试图转换为浮空字符串。 Delphi引发异常,因为空字符串不表示任何有效的float值。

您需要首先检查所使用的字符串是否为空,然后确定在这种情况下的处理方式:通知用户,画一个空的馅饼,...

顺便说一句,如果要将空字符串视为零,则可以编写自己的自定义转换函数。

function CustomStrToFloat(string: variant): double;
begin
  if (string = null) or (Trim(string) = '') then Result := 0
  else Result := StrToFloat(string);  
end;

请注意,如果您输入的内容不是空字符串(或null变量),则此函数仍会引发异常,因此用户将知道您收到的输入不一致。

现在您只需要更改代码即可使用自定义的转换功能

...
PiePercentage := (CustomStrToFloat(SGstats.Cells[1,iRow])/CustomStrToFloat(SGstats.Cells[1,1]))*100;
Series[0].Add(CustomStrToFloat(SGstats.Cells[1,  iRow]), SGStats.Cells[0,iRow] + ', ' + FormatCurr('0.####',PiePercentage) + ' %', clteecolor);
...

关于“身份验证失败”错误,您可以调试代码并检查导致该错误的行吗?看起来将在执行SQL查询时出现,在这种情况下,您在SQLQuery的连接对象上定义的凭据不正确。

编辑:正如Remy Lebeau所建议的那样,Delphi已经包含两个函数来处理来自不包含有效浮点值表示形式的字符串的转换。第一个是StrToFloatDef(使用无效字符串的默认值浮动的字符串)。

您只需要将代码更改为:

...
PiePercentage := (StrToFloatDef(SGstats.Cells[1,iRow],0)/StrToFloatDef(SGstats.Cells[1,1],0))*100;
Series[0].Add(StrToFloatDef(SGstats.Cells[1,  iRow],0), SGStats.Cells[0,iRow] + ', ' + FormatCurr('0.####',PiePercentage) + ' %', clteecolor);
...

我不使用它,因为它不仅会将所有空字符串视为零,而且还将所有其他内容不一致的字符串都视为零,在这种情况下,我更愿意让程序引发异常,因此用户可以使用会被告知输入值无效。

您可以使用的另一个函数是TryStrToFloat,它将尝试进行转换,如果转换成功,则返回true或false。

如果使用此选项,则需要将这两行更改为:

var FirstCell, SecondCell: extended;
...
...

FirstCell := 0;
SecondCell := 0;

if not TryStrToFloat(SGstats.Cells[0,iRow], FirstCell) then 
   ShowMessage('Input Values not valid');
if not TryStrToFloat(SGstats.Cells[1,iRow], SecondCell) then 
   ShowMessage('Input Values not valid');

PiePercentage := (SecondCell/FirstCell)*100;
Series[0].Add(SecondCell, SGStats.Cells[0,iRow] + ', ' + FormatCurr('0.####',PiePercentage) + ' %', clteecolor);
...