как считать в структуру значение StringGrid
void __fastcall TForm1::Button1Click(TObject *Sender)
{
struct {
double fakt [10][10];
double plan [10];
}Pers, *Ppers;
Ppers = &Pers;
Ppers->fakt[2][2]=StrToFloat(StringGrid1->Cells[2][2]);
}
Люди вы не могли бы объяснить дураку что не так я хочу считать в структуру значение StringGrid но у меня не чего не выходит в чём дело.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
struct {
double fakt [10][10];
double plan [10];
}Pers, *Ppers;
Ppers = &Pers;
Ppers->fakt[2][2]=StrToFloat(StringGrid1->Cells[2][2]);
}
проверил твой код, все отлично считывает... что ты имеешь ввиду под не выходит?
Project Project1.exe raised exception class EconverError with message is not a valid floating point value Process stopped Use step or Run to continue
Я так понял что он генерирует исключение
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}// вот здесь строка подсвечивается синим цветом
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//---------------------------------------------------------------------------
Что не так
Пишет вот что
Project Project1.exe raised exception class EconverError with message is not a valid floating point value Process stopped Use step or Run to continue
Я так понял что он генерирует исключение
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}// вот здесь строка подсвечивается синим цветом
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//---------------------------------------------------------------------------
Что не так
Попробуйте запустить следующее и сразу все пойметеЖ
AnsiString S = "", SS = "0";
float f1 = StrToFloat(SS);
float f2 = StrToFloat(S); // и синяя строка будет там-же
У вас exception, скорее всего, вылетает на пустых ячейках
попробуй так
void __fastcall TForm1::Button1Click(TObject *Sender)
{
struct {
double fakt [10][10];
double plan [10];
}Pers, *Ppers;
Ppers = &Pers;
try
{
Ppers->fakt[2][2]=StrToFloat(StringGrid1->Cells[2]
[2]);
}
catch(...)
{
Ppers->fakt[2][2]= 0;
}
}
Ну да - она тебе же пишет EconverError
попробуй так
void __fastcall TForm1::Button1Click(TObject *Sender)
{
struct {
double fakt [10][10];
double plan [10];
}Pers, *Ppers;
Ppers = &Pers;
try
{
Ppers->fakt[2][2]=StrToFloat(StringGrid1->Cells[2]
[2]);
}
catch(...)
{
Ppers->fakt[2][2]= 0;
}
}
Извините, но зачем писать try / catch, если можно что-нибудь вроде следующего:
Ppers->fakt[2][2] = (StringGrid->Cells[2][2].Length()?StrToFloat(StringGrid->Cells[2][2]):0);
А вовторых - как отработаеться ваш код если в ячейке я напишу слово "жопа"
Ну вопервых так правильно
А вовторых - как отработаеться ваш код если в ячейке я напишу слово "жопа"
1. Мы, помогая друг-другу, даем не готовое решение, а путь к нему.
2. Как вы думаете, что скажет бухгалтер или иной пользователь, если вместо суммы или процентов там появиться "жопа". Пользователь может решить, что это ваша оценка его деятельности, и побежит с вами разбираться. А если серьезно, то корректность данных в ячейке следует отслеживать при заполнении Grid'a или таблицы-источника, до их визуализации.
3. М.б. я и не прав, но мне не кажется правильным без необходимости строить свою работу на обработках исключений.
4. Вот для того, чтобы отловить просочившуюся "жопу", следует использовать try / catch, т.е. в итоге получим
try
{
Ppers->fakt[2][2] = (StringGrid->Cells[2][2].Length()?StrToFloat(StringGrid->Cells[2][2]):0);
}
catch(...)
{
Ppers->fakt[2][2]= 0;
}
Исключения и даны для того что бы не заморачивать себе голову разными проверками. Кроме этого заключение блоков кода в try/catch являеться не просто хорошим стилем программирования, но и обязательным для использования в программах. Кроме того слова "жопа" в ячейке - это утрированный пример. Привожу реальный - бухгалтер вместо точки поставила запятую в дробном числе. Стока не пустая и при этом вылазиет (по ее мнению) какая то матерная надпись. Так во поверь мне что пользователю труднее обяснить что нужно ставить всегда точку, чем заставить программу говорить ему по русски что он не прав. При этом если программа говорит что пользователь не прав на русском языке - это для него свого рода истина.
Поэтому try/catch нужно спользовать всегда и уж ни вкоем случае не заменять проверкой if.
1.
Трудно возразить, что и отражено в п.4 моего предыдущего сообщения.
2. Ваше
мое
или при их вводе.
3.
- ключевые слова "без необходимости"
4. Вообще-то, у меня складывается впечатление, что мы с вами, "размахивая кулаками", старательно соглашаемся друг с другом. Все дело в разумности (чустве меры) при использовании того или иного инструмента.