Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

при пустой ячейке выскакивает "is not a valid floating point valu [D7, XP]


Страницы:   1 2 3

ser_tr ©   (2007-11-07 09:15:00) 

ЗДРАВТСВУЙТЕ, ПАМАГИТЕ ПЛИЗ ламеру, НЕ могу сдать зачет по Delphi, а я в нем индюк. Есть таблица, в которой вводим факт 1,2,3,4 год. Таблица расчитывает удельный вес по каждому году плюс отклонения.
Если же не ввести в одну из ячеек число (т.е. ячейка будет пустая), то выскакивает ошибка "is not a valid floating point value". Я перерыл много форумов, но так и ничего не нашел..... (или скорей всего не понял, т.к. повторюсь, я индюк). Вот кусочек программы. Заранее Спасибо.

procedure TForm1.BitBtn2Click(Sender: TObject);
var
Value: Double; ch: Currency;
q : Integer;
begin

for i:=1 to StringGrid1.RowCount-2 do
for q:=1 to 8 do If q mod 2 = 1 then form1.StringGrid1.Cells[q,kol+1]:=currToStr(strtocurr(form1.StringGrid1.Cells[q,kol+1])+strtocurr(form1.StringGrid1.Cells[q,i]));
for i:=1 to StringGrid1.RowCount-2 do begin
//1 год удельный вес
StringGrid1.Cells[2,i]:=FloatToStr(100/strtofloat(StringGrid1.Cells[1,kol+1])*strtofloat(StringGrid1.Cells[1,i]));
StringGrid1.Cells[2,kol+1]:=FloatToStr(strtofloat(StringGrid1.Cells[2,kol+1])+strtofloat(StringGrid1.Cells[2,i]));
//2 год удельный вес
StringGrid1.Cells[4,i]:=FloatToStr(100/strtofloat(StringGrid1.Cells[3,kol+1])*strtofloat(StringGrid1.Cells[3,i]));
StringGrid1.Cells[4,kol+1]:=FloatToStr(strtofloat(StringGrid1.Cells[4,kol+1])+strtofloat(StringGrid1.Cells[4,i]));
//3 год удельный вес
StringGrid1.Cells[6,i]:=FloatToStr(100/strtofloat(StringGrid1.Cells[5,kol+1])*strtofloat(StringGrid1.Cells[5,i]));
StringGrid1.Cells[6,kol+1]:=FloatToStr(strtofloat(StringGrid1.Cells[6,kol+1])+strtofloat(StringGrid1.Cells[6,i]));
//3-год удельный вес фактический
StringGrid1.Cells[8,i]:=FloatToStr(100/strtofloat(StringGrid1.Cells[7,kol+1])*strtofloat(StringGrid1.Cells[7,i]));
StringGrid1.Cells[8,kol+1]:=FloatToStr(strtofloat(StringGrid1.Cells[8,kol+1])+strtofloat(StringGrid1.Cells[8,i]));
//% выполнения плана
StringGrid1.Cells[9,i]:=FloatToStr(strtofloat(StringGrid1.Cells[5,i])/strtofloat(StringGrid1.Cells[7,i])*100);
StringGrid1.Cells[9,kol+1]:=FloatToStr(strtofloat(StringGrid1.Cells[5,kol+1])/strtofloat(StringGrid1.Cells[7,kol+1])*100);
//1-года
StringGrid1.Cells[10,i]:=FloatToStr(strtofloat(StringGrid1.Cells[5,i])/strtofloat(StringGrid1.Cells[1,i])*100);
StringGrid1.Cells[10,kol+1]:=FloatToStr(strtofloat(StringGrid1.Cells[5,kol+1])/strtofloat(StringGrid1.Cells[1,kol+1])*100);
//2-года
StringGrid1.Cells[11,i]:=FloatToStr(strtofloat(StringGrid1.Cells[5,i])/strtofloat(StringGrid1.Cells[3,i])*100);
StringGrid1.Cells[11,kol+1]:=FloatToStr(strtofloat(StringGrid1.Cells[5,kol+1])/strtofloat(StringGrid1.Cells[3,kol+1])*100);
end;
for i:=1 to 11 do begin
for j:=1 to kol+1 do begin
if (i mod 2 = 0) or (i=11) or (j=kol+1) or(i=9) then // округление только ячеек, где производится расчет
form1.StringGrid1.Cells[i,j]:= okruglenie(StrTocurr(form1.StringGrid1.Cells[i,j]), 2);
end;
end;
end;


ser_tr   (2007-11-09 10:49:00) [21]


> приведи код, который по-прежнему не работает.

Заменил strtofloat на strtofloatde(...,0) но результат такой же.

if strtofloat(StringGrid1.Cells[1,i])<>0 then begin
StringGrid1.Cells[2,i]:=FloatToStr(100/strtofloatdef(StringGrid1.Cells[1,kol+1],0)*strtofloatdef(StringGrid1.Cells[1,i],0));
StringGrid1.Cells[2,kol+1]:=FloatToStr(strtofloatdef(StringGrid1.Cells[2,kol+1],0)+strtofloatdef(StringGrid1.Cells[2,i],0));
end
else
begin StringGrid1.Cells[2,i]:='0';
StringGrid1.Cells[2,kol+1]:='0'; end;


ser_tr   (2007-11-09 10:32:00) [22]


> Сказки иди рассказывай на других форумах. В [19] нет ни
> одной попытки

Я выложил то, что стабильно работает, а все остальные попытки не сохранял. И думаю не стоит наседать на человека, который реально с Delphi общается только пару недель.


Anatoly Podgoretsky   (2007-11-09 09:58:00) [23]

> Думкин  (09.11.2007 09:45:28)  [28]

> хотя бы чуть-чуть очеловечить код, вместо того чтобы приводить в оправдание лишь то, что индюк в Дельфи?

Ему нравистя обиндюченый код.


Думкин   (2007-11-09 09:45:00) [24]

Видимо есть тайный глубокий смысл юзать конструкции вида
strtofloat(StringGrid1.Cells[2,kol+1])
в таком количестве. Что мешает объявить

function Get(i,j : integer) : extended;
begin
      Result := StrToFloatDef(StringGrid1.Cells[i,j],0)
end;


и в итоге хотя бы чуть-чуть очеловечить код, вместо того чтобы приводить в оправдание лишь то, что индюк в Дельфи?


ЮЮ   (2007-11-09 09:41:00) [25]

> И стараюсь следовать любому совету, которые мне предлагают.
> Вот так.


Вот и последуй хотя бы  ЮЮ ©   (08.11.07 08:44) [13], а здесь приведи код, который по-прежнему не работает.


Думкин   (2007-11-09 09:36:00) [26]

Кетмара сюда надо. Он бы если бы нашел мозг у индюка - продул бы его на раз.


ser_tr   (2007-11-09 09:33:00) [27]


> ЮЮ ©   (09.11.07 09:23) [21]

Возможно и получилось бы, но в силу своих возможностей я пробовал применить strtofloatdef, ничего не выходит. Программа работает также. Повторяю
> по Delphi, а я в нем индюк

И стараюсь следовать любому совету, которые мне предлагают. Вот так.


ЮЮ   (2007-11-09 09:32:00) [28]

> Пробовал использовать strtofloatdef но ничего не изменилось,
> проблема осталась:(


Сказки иди рассказывай на других форумах. В [19] нет ни одной попытки. А без этого проблемв не исчезнет.


> Так однозначно не выходит, еще на первых этапах перепробовал

Аналогично сказанному выше.


engine   (2007-11-09 09:31:00) [29]

> [22] ser_tr   (09.11.07 09:24)

procedure IsCompleat(_grid : TStringGrid)
var
i,j : integer;
k : Double;
begin
for i := 0 to _grid.RowCount-1 do
 for j := 0 to _grid.ColCount-1 do
    if not TryStrToFloat(_grid.Cells[i,j], k) then
      _grid.Cells[i,j] := '0';
end;


ser_tr   (2007-11-09 09:24:00) [30]


> ЮЮ ©   (08.11.07 08:44) [13]
> > [12] ser_tr   (08.11.07 07:02)
>
> заменить  StrToFloat(...) на  StrToFloatDef(..., 0)

Пробовал использовать strtofloatdef но ничего не изменилось, проблема осталась:(


ЮЮ   (2007-11-09 09:23:00) [31]

> Я прогу доработал, теперь она с нулями работает, но с пустой
> ячейкой нет.

Когда последуешь хоть одному совету, например, [13] ЮЮ ©   (08.11.07 08:44), то и с пустой ячейкой и с ячейкой, содержащей не числа (например, 'abc'),  будет работать как с нулем


ser_tr   (2007-11-09 09:18:00) [32]


> Галинка ©   (08.11.07 10:30) [15]

Так однозначно не выходит, еще на первых этапах перепробовал


ser_tr   (2007-11-09 09:17:00) [33]


> engine ©   (08.11.07 12:32) [18]

Я прогу доработал, теперь она с нулями работает, но с пустой ячейкой нет.


procedure one;
begin
Form1.StringGrid1.RowCount:=kol+2;
for i:=1 to 11 do
form1.StringGrid1.Cells[i,kol+1]:='0';
for i:=1 to kol+1 do
form1.StringGrid1.Cells[0,i]:=inttostr(i);

for i:=1 to kol+1 do  begin
 form1.StringGrid1.Cells[1,i]:='0';
 form1.StringGrid1.Cells[3,i]:='0';
 form1.StringGrid1.Cells[5,i]:='0';
 form1.StringGrid1.Cells[7,i]:='0';
end;  // Приравняли все ячейки к нулям изначально

procedure TForm1.BitBtn2Click(Sender: TObject);
var
  Value: Double; ch: Currency;
  q : Integer;
begin
for i:=1 to StringGrid1.RowCount-2 do
for q:=1 to 8 do If q mod 2 = 1 then
StringGrid1.Cells[q,kol+1]:=FloatToStr(strtofloat(StringGrid1.Cells[q,kol+1])+strtofloat(StringGrid1.Cells[q,i]));
for i:=1 to StringGrid1.RowCount-2 do begin

//Сделали расчет с обходом нуля
   if strtofloat(StringGrid1.Cells[1,i])<>0 then begin
   StringGrid1.Cells[2,i]:=FloatToStr(100/strtofloat(StringGrid1.Cells[1,kol+1])*strtofloat(StringGrid1.Cells[1,i]));
   StringGrid1.Cells[2,kol+1]:=FloatToStr(strtofloat(StringGrid1.Cells[2,kol+1])+strtofloat(StringGrid1.Cells[2,i]));
    end
    else
    begin  StringGrid1.Cells[2,i]:='0';
           StringGrid1.Cells[2,kol+1]:='0'; end;


engine   (2007-11-08 12:32:00) [34]

> [17] ЮЮ ©   (08.11.07 11:53)

В приведенном им коде — никак не обходит. Но это уже дело автора.


ЮЮ   (2007-11-08 11:53:00) [35]

> [16] engine ©   (08.11.07 11:51)
> И будет вылезать деление на ноль.


У автора:


> [12] ser_tr   (08.11.07 07:02)
> Самая главная для меня проблема, это как сделать, чтобы
> при выполнении расчета (нажатии кнопки), ячейки, которые
> пустые (специально оставленные пустыми), автоматом приравнялись
> к нулю и выводился 0, т.к. если в ячейке постаить ноль,
> то прога все считает (деление на ноль обходит программа)
> .


engine   (2007-11-08 11:51:00) [36]

> [13] ЮЮ ©   (08.11.07 08:44)

И будет вылезать деление на ноль.


Галинка   (2007-11-08 10:30:00) [37]

ser_tr   (08.11.07 07:02) [12]

и в чем проблема? примерно так:

procedure IsCompleat(_grid : TStringGrid)
var
i,j : integer;
begin
for i=0 to _grid.RowCount-1 do
  for j=0 to _grid.ColCount-1 do
     if _grid.Cell[i,j] = "" then _grid.Cell[i,j] = "0";
end;


Ega23   (2007-11-08 09:10:00) [38]


> Anatoly Podgoretsky ©   (07.11.07 14:11) [10]


Ну разве что.
Лично у меня - как и Str - просто привычка.


ЮЮ   (2007-11-08 08:44:00) [39]

> [12] ser_tr   (08.11.07 07:02)

заменить  StrToFloat(...) на  StrToFloatDef(..., 0)


ser_tr   (2007-11-08 07:02:00) [40]

Самая главная для меня проблема, это как сделать, чтобы при выполнении расчета (нажатии кнопки), ячейки, которые пустые (специально оставленные пустыми), автоматом приравнялись к нулю и выводился 0, т.к. если в ячейке постаить ноль, то прога все считает (деление на ноль обходит программа).


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо