![]() |
| ||
|
|
Новости |
Поиск |
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;
{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