![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
при пустой ячейке выскакивает "is not a valid floating point valu [D7, XP]
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, т.к. если в ячейке постаить ноль, то прога все считает (деление на ноль обходит программа).