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;


{RASkov}   (2007-11-16 11:45:00) [1]

> [50] Галинка ©   (16.11.07 11:38)

Для компилятора " (кавычка) - это обычный символ, а ' (одинарный апостроф) - граница текстовой строки(константы)....)
И что значит - принято? есть синтаксис.
Садись два :)


Галинка   (2007-11-16 11:38:00) [2]

Ну вообще-то втроку в кавычках писать принято, а не в апострофах. Или я уже настолько дельфи забыла?


ЮЮ   (2007-11-16 03:41:00) [3]

> ХВАЛА НЕБЕСАМ

Да уж. За неделю дошло.


> Мне посоветовали туповезде заменить strtofloat на strtofloatdef

Тупо использовать строки вместо чисел, ожидая всегда получить число из строки.


ser_tr   (2007-11-15 13:18:00) [4]

ХВАЛА НЕБЕСАМ. Раньше использовал strtofloatdef только в месте, где производились расчеты, и при этом все равно вываливалась ошибка.  Мне посоветовали тупо везде заменить strtofloat на strtofloatdef. Теперь  все работает :)


Думкин   (2007-11-14 07:34:00) [5]

> ser_tr   (14.11.07 06:02) [46]

Выложи тут вариант процедуры с TryStrToIntDef, но не тот, чьто уже приводил - а исправленный и поклянись, что он не работает.


ser_tr   (2007-11-14 06:02:00) [6]


> ЮЮ ©   (13.11.07 10:27) [41]
> К тебе относится, да простят меня чукчи, только одно:
> ЧУКЧА - НЕ ЧИТАТЕЛЬ, ЧУКЧА - ПИСАТЕЛЬ.
> Ни одной строчки исправленного кода, и только сказки расказываешь


> Anatoly Podgoretsky ©   (13.11.07 11:36) [44]
> > ЮЮ  (13.11.2007 10:45:43)  [43]
> У автора ерунда написана, сам же сказал чукча.


Готов выслать прогу, чтобы воочию убедились. Может просто мы говорим на разных языках или я просто чего то не понимаю. Я не расказываю сказки, а говорю то, что вижу в экране.
(при <CODEif Length(StringGrid1.Cells[i,j]=0
then StringGrid1.Cells[i,j]:='0'
выскакивает все равно "is not a valid floating point value")

И раз вы все такие умные, то напишите код для чукчи, дабы показать, как надо делать. Ибо ни подсказать, тем более научить "индюка чукотского сообщества некому"......... :((((((


ЮЮ   (2007-11-13 11:59:00) [7]

> У автора ерунда написана, сам же сказал чукча.

А цитируешь меня. Вот и создается неприятный осадок :)


Anatoly Podgoretsky   (2007-11-13 11:36:00) [8]

> ЮЮ  (13.11.2007 10:45:43)  [43]

У автора ерунда написана, сам же сказал чукча.


ЮЮ   (2007-11-13 10:45:00) [9]

>
>
> [42] Anatoly Podgoretsky ©   (13.11.07 10:37)
> > ЮЮ  (13.11.2007 09:49:39)  [39]
>
> > Хватит сказки рассказывать. Showmessage ('пустая ячейка')
> ничем не круче StringGrid1.Cells[i,j]:='0'.
>
> Вообще то есть большая разница, между пустым значением и
> 0


Анатолий, ты сегодня чего-то "плаваешь" во всех постах. Иди кофейку попей :)  
Ну не настолько же БОЛЬШАЯ, что

1) у автора работает
if Length(StringGrid1.Cells[i,j]=0
then showmessage ('пустая ячейка');

2) у автора НЕ работает
if Length(StringGrid1.Cells[i,j]=0
then StringGrid1.Cells[i,j]:='0'


Anatoly Podgoretsky   (2007-11-13 10:37:00) [10]

> ЮЮ  (13.11.2007 09:49:39)  [39]

> Хватит сказки рассказывать. Showmessage ('пустая ячейка') ничем не круче StringGrid1.Cells[i,j]:='0'.

Вообще то есть большая разница, между пустым значением и 0
Если данные предполагается например перекидывать в базу или другое использование, например расчет среднего значения, когда пустые значения не учитываются, результаты же разные получаются, толи среднее по 7 ячейкам, толи по 10 ячейкам. Да и смотрится 0 немного хуже в отчетах.
Лучше при расчете учитывать пустые значения, а не заменять на 0, кроме особых вариантов.

А 0 это все таки конкретное значение!


ЮЮ   (2007-11-13 10:27:00) [11]

> что как мне кажется ни коим образом ко мне не относится.

К тебе относится, да простят меня чукчи, только одно:

ЧУКЧА - НЕ ЧИТАТЕЛЬ, ЧУКЧА - ПИСАТЕЛЬ.

Ни одной строчки исправленного кода, и только сказки расказываешь


ser_tr   (2007-11-13 10:11:00) [12]


> А вот проверку на "пустоту" правильнее делать так
>
> if Trim(StringGrid1.Cells[i,j]) = ''

Причем здесь Trim. Насколько понимаю, это есмь обрезание пробелов, что как мне кажется ни коим образом ко мне не относится.


ЮЮ   (2007-11-13 09:49:00) [13]

> if Length(StringGrid1.Cells[i,j]=0
> проверяет пустую строку, и при этом можно выполнить какое-
> то действие, к примеру
> then showmessage ('пустая ячейка');, а если поставить
> then StringGrid1.Cells[i,j]:='0'
> ни к чему не приводит.
Применение strtofloatdef тоже результатов не дало. Видимо  при нажатии  кнопки для расчета, и при наличии пустой ячейки  все равно вываливается "is not a valid floating point value". Блин, я уже совсем запутался.


Хватит сказки рассказывать. Showmessage ('пустая ячейка') ничем не круче StringGrid1.Cells[i,j]:='0'.

А вот проверку на "пустоту" правильнее делать так

if Trim(StringGrid1.Cells[i,j]) = '' ибо пробелы, вставленные пользоветем, хоть в гриде и не видны, но в ячейке присутствуют.

З.Ы. Когда пояаится исправленный ( с учетом [32]), но по твоим уверениям так и нерабоьающий код?


ser_tr   (2007-11-13 09:43:00) [14]


> Галинка ©   (09.11.07 12:46) [33]

Тогда наверное будет правильно сказать не работает проверка на "пустую строку",  хотя
if Length(StringGrid1.Cells[i,j]=0
проверяет пустую строку, и при этом можно выполнить какое-то действие, к примеру
then showmessage ('пустая ячейка');, а если поставить
then StringGrid1.Cells[i,j]:='0'
ни к чему не приводит.
Применение strtofloatdef тоже результатов не дало. Видимо  при нажатии  кнопки для расчета, и при наличии пустой ячейки  все равно вываливается "is not a valid floating point value". Блин, я уже совсем запутался.

А вот вопрос, при забивании данной таблицы можно ли как то поставить ограничение на "пустоту", типа в духе ограничения ввода символов. Скажем если пользователь вместо цифры оставляет пустоту, то выходит сообщение "введите число"? или скажем определить минимально количество символов в ячейке - "1"?


Думкин   (2007-11-13 08:38:00) [15]

> ser_tr   (13.11.07 08:28) [35]

По тому, как развивается ветка - это будет очень верным решением препoдавателя.


ЮЮ   (2007-11-13 08:34:00) [16]

> [35] ser_tr   (13.11.07 08:28)
> > ЮЮ ©   (09.11.07 10:52) [32]


А в цитируемом моем ответе так и не заметил намека на то, что не везде заменил заменил strtofloat на strtofloatde?


ser_tr   (2007-11-13 08:28:00) [17]


> ЮЮ ©   (09.11.07 10:52) [32]

А не доволен тем, что такую версию (не работает с пустой ячейкой) не примут к зачету.


{RASkov}   (2007-11-09 18:30:00) [18]

> [31] ser_tr   (09.11.07 10:49)
> Заменил strtofloat на strtofloatde(...,0) но результат такой же.

Я не совсем понял, что там у тебя за расчеты, но вот данный пример показывает работу Грида с подсчетом сумм по столбцам
и никаких ошибок....
Пример только для показа что ошибки из сабжа не возникает.... Может уже и не в тему этот пример, тогда сорри.... всю ветку внимательно не читал, но видел, что уже предлогали такой вариант, а ты говоришь не работает.... не верю.

procedure TForm1.FormCreate(Sender: TObject);
begin
 StringGrid1.Options:=StringGrid1.Options+[goEditing];
end;

procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String);
var N: Integer; Summ: Extended;
begin
 Summ:=0;
 for N:= 1 to StringGrid1.RowCount-2 do
  if N<>ARow then Summ:=Summ+StrToFloatDef(StringGrid1.Cells[ACol, N], 0)
   else Summ:=Summ+StrToFloatDef(Value, 0);
 StringGrid1.Cells[ACol, StringGrid1.RowCount-1]:=FloatToStr(Summ);
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
begin
 CanSelect:=ARow<StringGrid1.RowCount-1;
end;


Галинка   (2007-11-09 12:46:00) [19]

ser_tr   (09.11.07 09:18) [20]

погоди, ты вроде сказал, чтот присвоение не работает? А сам его используешь? Или не работает проверка на "пустую строку"? Что конкретно "так однозначно не работает"?


ЮЮ   (2007-11-09 10:52:00) [20]

> Я выложил то, что стабильно работает,

Чего же ты тогда недоволен, тем что теперь она с нулями работает, но с пустой ячейкой нет, если получил стабильную версию и изменять её не намерен?


> Заменил strtofloat на strtofloatde(...,0) но результат такой
> же.
>
> if strtofloat <и где?>(StringGrid1.Cells[1,i])<>0 then begin


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

Наверх

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