Форум: "Начинающим";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];
Внизпри пустой ячейке выскакивает "is not a valid floating point valu Найти похожие ветки
← →
ser_tr (2007-11-07 09:15) [0]ЗДРАВТСВУЙТЕ, ПАМАГИТЕ ПЛИЗ ламеру, НЕ могу сдать зачет по 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;
← →
Ega23 © (2007-11-07 09:39) [1]
var
ss : string
Code : Integer;
Value : Double;
begin
...............
ss := StringGrid1.Cells[5,i]
Val(ss, Value, Code);
if Code<>0 then
ShowMessage("StringGrid1.Cells[5,i] - Неправильное число");
end;
Приблизительно, в таком вот аксепте
← →
Галинка © (2007-11-07 09:57) [2]Правильно. Если пробел или пустое месть попытаться перевести в Float (StrToFloat) то и будет подобная ошибка конвертации.
← →
Kolan © (2007-11-07 10:00) [3]
Ega23 © (07.11.07 09:39)
> ValTryFloatToStr
?
← →
ser_tr (2007-11-07 10:13) [4]
> Галинка © (07.11.07 09:57) [2]
> Правильно. Если пробел или пустое месть попытаться перевести
> в Float (StrToFloat) то и будет подобная ошибка конвертации
На словах то оно вроде понятно, но как реализовать в проге.....
← →
clickmaker © (2007-11-07 10:18) [5]
> как реализовать в проге.....
вот не понимаю: зачем писать в форум, если все равно ответы не читаешь?
тихо самому с собою нравится вести беседу?
← →
Kolan © (2007-11-07 10:20) [6]> На словах то оно вроде понятно, но как реализовать в проге…
var
Val: Double;
if not TryStrToFloat(StringGrid1.Cells[5,i], Val) then
ShowMessage("Не флоат это, не флоат!")
else
ShowMessage("А вот это пойдёт.")
← →
Ega23 © (2007-11-07 10:25) [7]
> TryFloatToStr ?
А разница?
← →
Kolan © (2007-11-07 10:27) [8]у вал название непонятное, и параметров больше, и енто вообще из паскаля истчо…
← →
Галинка © (2007-11-07 10:30) [9]Ну самое очевидное, прорверять заполнены ли все ячейки таблицы. Еще до конвертации. Что-то типа:
boolean IsCompleat(_grid : TStringGrid)
var
i,j : integer;
begin
Result := true;
for i=0 to _grid.RowCount-1 do
for j=0 to _grid.ColCount-1 do
if _grid.Cell[i,j] = "" then
begin
ShowMessage("There is empty cells in grid !!!");
//не уверена, есть ли у ячейки метод SetFocus
Result := false;
break;
end;
end;
← →
Anatoly Podgoretsky © (2007-11-07 14:11) [10]> Ega23 (07.11.2007 10:25:07) [7]
Компактная запись.
← →
Anatoly Podgoretsky © (2007-11-07 14:13) [11]> Галинка (07.11.2007 10:30:09) [9]
Фокусировать можно. А проверка обязательно, нет смысла производить какие то вычисления при неверных данных.
← →
ser_tr (2007-11-08 07:02) [12]Самая главная для меня проблема, это как сделать, чтобы при выполнении расчета (нажатии кнопки), ячейки, которые пустые (специально оставленные пустыми), автоматом приравнялись к нулю и выводился 0, т.к. если в ячейке постаить ноль, то прога все считает (деление на ноль обходит программа).
← →
ЮЮ © (2007-11-08 08:44) [13]> [12] ser_tr (08.11.07 07:02)
заменить StrToFloat(...) на StrToFloatDef(..., 0)
← →
Ega23 © (2007-11-08 09:10) [14]
> Anatoly Podgoretsky © (07.11.07 14:11) [10]
Ну разве что.
Лично у меня - как и Str - просто привычка.
← →
Галинка © (2007-11-08 10:30) [15]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;
← →
engine © (2007-11-08 11:51) [16]> [13] ЮЮ © (08.11.07 08:44)
И будет вылезать деление на ноль.
← →
ЮЮ © (2007-11-08 11:53) [17]> [16] engine © (08.11.07 11:51)
> И будет вылезать деление на ноль.
У автора:
> [12] ser_tr (08.11.07 07:02)
> Самая главная для меня проблема, это как сделать, чтобы
> при выполнении расчета (нажатии кнопки), ячейки, которые
> пустые (специально оставленные пустыми), автоматом приравнялись
> к нулю и выводился 0, т.к. если в ячейке постаить ноль,
> то прога все считает (деление на ноль обходит программа)
> .
← →
engine © (2007-11-08 12:32) [18]> [17] ЮЮ © (08.11.07 11:53)
В приведенном им коде — никак не обходит. Но это уже дело автора.
← →
ser_tr (2007-11-09 09:17) [19]
> 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;
← →
ser_tr (2007-11-09 09:18) [20]
> Галинка © (08.11.07 10:30) [15]
Так однозначно не выходит, еще на первых этапах перепробовал
← →
ЮЮ © (2007-11-09 09:23) [21]> Я прогу доработал, теперь она с нулями работает, но с пустой
> ячейкой нет.
Когда последуешь хоть одному совету, например, [13] ЮЮ © (08.11.07 08:44), то и с пустой ячейкой и с ячейкой, содержащей не числа (например, "abc"), будет работать как с нулем
← →
ser_tr (2007-11-09 09:24) [22]
> ЮЮ © (08.11.07 08:44) [13]
> > [12] ser_tr (08.11.07 07:02)
>
> заменить StrToFloat(...) на StrToFloatDef(..., 0)
Пробовал использовать strtofloatdef но ничего не изменилось, проблема осталась:(
← →
engine © (2007-11-09 09:31) [23]> [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;
← →
ЮЮ © (2007-11-09 09:32) [24]> Пробовал использовать strtofloatdef но ничего не изменилось,
> проблема осталась:(
Сказки иди рассказывай на других форумах. В [19] нет ни одной попытки. А без этого проблемв не исчезнет.
> Так однозначно не выходит, еще на первых этапах перепробовал
Аналогично сказанному выше.
← →
ser_tr (2007-11-09 09:33) [25]
> ЮЮ © (09.11.07 09:23) [21]
Возможно и получилось бы, но в силу своих возможностей я пробовал применить strtofloatdef, ничего не выходит. Программа работает также. Повторяю
> по Delphi, а я в нем индюк
И стараюсь следовать любому совету, которые мне предлагают. Вот так.
← →
Думкин © (2007-11-09 09:36) [26]Кетмара сюда надо. Он бы если бы нашел мозг у индюка - продул бы его на раз.
← →
ЮЮ © (2007-11-09 09:41) [27]> И стараюсь следовать любому совету, которые мне предлагают.
> Вот так.
Вот и последуй хотя бы ЮЮ © (08.11.07 08:44) [13], а здесь приведи код, который по-прежнему не работает.
← →
Думкин © (2007-11-09 09:45) [28]Видимо есть тайный глубокий смысл юзать конструкции вида
strtofloat(StringGrid1.Cells[2,kol+1])
в таком количестве. Что мешает объявитьfunction Get(i,j : integer) : extended;
begin
Result := StrToFloatDef(StringGrid1.Cells[i,j],0)
end;
и в итоге хотя бы чуть-чуть очеловечить код, вместо того чтобы приводить в оправдание лишь то, что индюк в Дельфи?
← →
Anatoly Podgoretsky © (2007-11-09 09:58) [29]> Думкин (09.11.2007 09:45:28) [28]
> хотя бы чуть-чуть очеловечить код, вместо того чтобы приводить в оправдание лишь то, что индюк в Дельфи?
Ему нравистя обиндюченый код.
← →
ser_tr (2007-11-09 10:32) [30]
> Сказки иди рассказывай на других форумах. В [19] нет ни
> одной попытки
Я выложил то, что стабильно работает, а все остальные попытки не сохранял. И думаю не стоит наседать на человека, который реально с Delphi общается только пару недель.
← →
ser_tr (2007-11-09 10:49) [31]
> приведи код, который по-прежнему не работает.
Заменил 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;
← →
ЮЮ © (2007-11-09 10:52) [32]> Я выложил то, что стабильно работает,
Чего же ты тогда недоволен, тем что теперь она с нулями работает, но с пустой ячейкой нет, если получил стабильную версию и изменять её не намерен?
> Заменил strtofloat на strtofloatde(...,0) но результат такой
> же.
>
> if strtofloat<и где?>(StringGrid1.Cells[1,i])<>0 then begin
← →
Галинка © (2007-11-09 12:46) [33]ser_tr (09.11.07 09:18) [20]
погоди, ты вроде сказал, чтот присвоение не работает? А сам его используешь? Или не работает проверка на "пустую строку"? Что конкретно "так однозначно не работает"?
← →
{RASkov} (2007-11-09 18:30) [34]> [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;
← →
ser_tr (2007-11-13 08:28) [35]
> ЮЮ © (09.11.07 10:52) [32]
А не доволен тем, что такую версию (не работает с пустой ячейкой) не примут к зачету.
← →
ЮЮ © (2007-11-13 08:34) [36]> [35] ser_tr (13.11.07 08:28)
> > ЮЮ © (09.11.07 10:52) [32]
А в цитируемом моем ответе так и не заметил намека на то, что не везде заменил заменил strtofloat на strtofloatde?
← →
Думкин © (2007-11-13 08:38) [37]> ser_tr (13.11.07 08:28) [35]
По тому, как развивается ветка - это будет очень верным решением препoдавателя.
← →
ser_tr (2007-11-13 09:43) [38]
> Галинка © (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 09:49) [39]> 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 10:11) [40]
> А вот проверку на "пустоту" правильнее делать так
>
> if Trim(StringGrid1.Cells[i,j]) = ""
Причем здесь Trim. Насколько понимаю, это есмь обрезание пробелов, что как мне кажется ни коим образом ко мне не относится.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.041 c