Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.09;
Скачать: CL | DM;

Вниз

при пустой ячейке выскакивает "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)
> Val


TryFloatToStr ?


 
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]

> На словах то оно вроде понятно, но как реализовать в проге&#133

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]

у вал название непонятное, и параметров больше, и енто вообще из паскаля истчо&#133


 
Галинка ©   (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)

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


 
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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.025 c
1-1190024793
Илья_С
2007-09-17 14:26
2007.12.09
события в RunTime


9-1164063132
Горгер
2006-11-21 01:52
2007.12.09
Вывод битмапа на плоскость OpenGL


15-1193175070
Прочее
2007-10-24 01:31
2007.12.09
Как сделать чтобы в OnKeyPress проходило сообщение VK_UP ?


11-1180814692
=BuckLr=
2007-06-03 00:04
2007.12.09
RichEdit и RE_OverwriteMode


1-1190278304
tytus
2007-09-20 12:51
2007.12.09
Рамка вокруг региона????