C++ Borland 6 - Prośba o pomoc przy zrobieniem komunikatu o pustym Edit'cie

0

Witam. Napisałem dość prosty pogram który liczy z prostych wzorów matematycznych. Śmiga on ładnie, a dane pobiera z dwóch Edit'ów. Lecz gdy użytkownik pozostawi puste okienko to program się wali. I chciałbym zrobić taki warunek aby program automatycznie wyświetlał komunikat o tym że jeden Edit pozostał pusty. Teorytycznie wiem jak to zrobić ale w praktyce program i tak się wali. Mógłby ktoś bardziej doświadczony zerknąć na mój kod. Z góry dziękuję ;) Poniżej fragment kodu na którym pracuję.

if(Interpolacja->ItemIndex==2)
        {
        if(Edit3->Text.ToInt() == NULL)
        {
        Memo1->SetSelTextBuf("Wpisz wartosc wykladnika potegi\r\n");
          ShowMessage("Wpisz wartosc wykladnika potegi");
          }
          else
          {

        if(Edit4->Text.ToInt()>0)
        {

                //obliczamy odlegosci do wezla pierwszego dla wszystkich sondazy
                int indeks2=0;
                for(int j=0; j<=3; j++)
                {
                        indeks2=j;
                        zbior_wezlow[indeks2];


                        for(int i=0; i<8; i++)
                        {
                                zbior_sondazy[i].d=sqrt(pow(zbior_sondazy[i].x-
                                zbior_wezlow[j].x,2.0)+pow(zbior_sondazy[i].y-zbior_wezlow[j].y,2.0));
                        }

                //ustalamy zbior o zadanej liczbie sondazy
                int indeks=0;
                double suma_h_d=0;
                double suma_1_d=0;
                        for(int n=0; n<Edit4->Text.ToInt();n++)
                        {
                                for(int i=0; i<8; i++)
                                {
                                        if(zbior_sondazy[indeks].d>zbior_sondazy[i].d)

                                             {
                                             indeks=i;
                                             }
                                }
                                suma_h_d+=(zbior_sondazy[indeks].h/pow(zbior_sondazy[indeks].d,Edit3->Text.ToInt()));
                                suma_1_d+=(1.0/pow(zbior_sondazy[indeks].d,Edit3->Text.ToInt()));
                                //podstawienie wartosci odleglosci z poza zakresu
                                zbior_sondazy[indeks].d=100000000;

                        }
                        //podstawiamy glebokosc sredniej wazonej odwrotnoscia odlegosci
                        zbior_wezlow[indeks2].h=suma_h_d/suma_1_d;
                }
          
       Memo1->SetSelTextBuf("METODA SREDNIEJ WAZONEJ ODWROTNOSCIA ODLEGLOSCI\r\n");
       Memo1->Lines->Add("------------------------------------------------------------------------------------------------------------");
       Memo1->SetSelTextBuf("Wykladnik potegi: ");
       Memo1->SetSelTextBuf(Edit3->Text.c_str());
       Memo1->SetSelTextBuf("\r\n");
       Memo1->SetSelTextBuf("Liczba punktow do interpolacji: ");
       Memo1->SetSelTextBuf(Edit4->Text.c_str());
       Memo1->SetSelTextBuf("\r\n");
       Memo1->SetSelTextBuf("Węzeł nr1: ");
       Memo1->SetSelTextBuf(FloatToStrF(zbior_wezlow[0].h, ffFixed, 4,2).c_str());
       Memo1->SetSelTextBuf("\r\n");
       Memo1->SetSelTextBuf("Węzeł nr2: ");
       Memo1->SetSelTextBuf(FloatToStrF(zbior_wezlow[1].h, ffFixed, 4,2).c_str());
       Memo1->SetSelTextBuf("\r\n");
       Memo1->SetSelTextBuf("Węzeł nr3: ");
       Memo1->SetSelTextBuf(FloatToStrF(zbior_wezlow[2].h, ffFixed, 4,2).c_str());
       Memo1->SetSelTextBuf("\r\n");
       Memo1->SetSelTextBuf("Węzeł nr4: ");
       Memo1->SetSelTextBuf(FloatToStrF(zbior_wezlow[3].h, ffFixed, 4,2).c_str());
       Memo1->SetSelTextBuf("\r\n");
       Memo1->SetSelTextBuf("\r\n");

       }
       else
          {
          Memo1->SetSelTextBuf("Liczba punktów do interpolacji nie może byc mniejsza niż zero\r\n");
          ShowMessage("Liczba punktów do interpolacji nie może byc mniejsza niż zero");
          }
          }
          } 
4
  1. fatalne formatowanie - jak sam nie umiesz to przepuść to przez http://format.krzaq.cc
  2. fatalne nazewnictwo, a raczej jego brak. Nazy Edit3, Edit4 i Memo1 faktycznie wiele mówią.
  3. zbior_wezlow[indeks2]; to nie jest poprawny C++, bo nie ma w nim VLA (chociaż jak działa a wymuszasz konkretny kompilator to w sumie nie jest aż taki grzech)
  4. Z pobieżnej lektury dokumentacji nie widzę metody sprawdzającej czy udało się wczytać inta ze stringa (jest tylko ToIntDef z domyślną wartością), ale to i tak da się wykorzystać do poprawnego sprawdzenia, czy udało się wczytać.
  5. jak by to Dragon powiedział: zapoznaj się z inkrementacją bo jej nie rozumiesz: http://4programmers.net/Forum/1101404
0

Wszystko śmiga elegancko. Bo testowałem. Ale śmiga pod warunkiem że wpisuje liczby. A ja chce zrobić tak że gdy użytkownik zostawi puste pole (Edit3) to wyskakuje komunikat a nie że program się sypie. Czy było by to możliwe? I czy poniższy sposób jest prawidłowy?

  if(Edit3->Text.ToInt() == NULL)
        {
        Memo1->SetSelTextBuf("Wpisz wartosc wykladnika potegi\r\n");
          ShowMessage("Wpisz wartosc wykladnika potegi");
          }
          else
          { 
             OBLICZENIA
           }

 

Czy może istnieje jakiś inny, lepszy?

Dzięki za link do tego formatowania ! Na pewno się przyda!

1

czy ty wiesz co to robi: Edit3->Text.ToInt()?
Najwyraźniej nie! Nasuń kursor na ToInt naciśnij F1 i przeczytaj dokumentację, szczególnie zwróć uwagę co się dzieje jak nie da się wykonać konwersji napisu na liczbę (słowo kluczowe tutaj to EConvertError).

Daję wędkę nie rybę.

0

Dziękuję za wędkę. Oto ryba którą złowiłem:

 if(Edit3->Text=="" || Edit4->Text=="") 

Dzięki raz jeszcze ! Temat do zamknięcia !

1

@DannyChase nie zrozumiałeś podpowiedzi kolegi @MarekR22. Pomyśl co będzie w przypadku gdy user wpisze w edita np. takie rzeczy jak:
''" "
"12aa"''

Musisz łowić dalej. Poszukaj co to jest EConvertError w helpie.

1
  1. Zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
  2. Zapoznaj się z inkrementacją, bo jej nie rozumiesz: http://4programmers.net/Forum/1101404
  3. Nie używaj innego niż angielskie nazewnictwa: http://4programmers.net/Forum/1208091
  4. for(int n=0; n<Edit4->Text.ToInt();n++) czy zdajesz sobie sprawy że to coś będzie na każdym kroku pętli konwertować tekst na int?
  5. Napisz sobie funkcję:
bool convert(const AnsiString &str,int &value)
  {
   value=INT_MIN; // z <climits>
   try { value=str.ToInt(); } catch(...) { return false; }
   return true;
  }

i używaj sobie: if(!convert(Edit4->Text,n_max)) return;

3

Jak to jest, że jak ktoś się przyzna że używa Dev-C++ to wszyscy się na niego rzucają, a jak używa 15-letniego Buildera to są same merytoryczne odpowiedzi? ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1