Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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)
> 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.041 c
15-1194525911
Sonia
2007-11-08 15:45
2007.12.09
Может еще кто-то помнит Фортран....


15-1194734939
Johnmen
2007-11-11 01:48
2007.12.09
А где Digitman?


15-1194854187
Me
2007-11-12 10:56
2007.12.09
Новый винт


6-1175513188
Digo
2007-04-02 15:26
2007.12.09
Трансляция видео через lan


3-1185982794
StriderMan
2007-08-01 19:39
2007.12.09
TIBValidationService





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский