nvdante napisał(a):Powyższa funkcja powoduje, że czasem pojawia się: "Abnormal program termination".
Właściwość
Text obiektu typu
TEdit jest typu
String, nie jest więc liczbą lecz łańcuchem znaków, a Ty mnożysz te łańcuchy, więc nic dziwnego, że czasami występuje błąd. Mnożenie może występować tylko w sytuacji, gdy pola Edit zawierają tekst będący liczbą, jednak gdy takie pole zawiera tekst liczbą nie będący, to mamy błąd. Gdybyś dokonywał konwersji tekstu na liczby, to w przypadku, gdy tekst nie jest liczbą otrzymałbyś komunikat o błędzie konwersji. Ponieważ jednak nie zastosowałeś konwersji to masz ogólny błąd programu.
To co zrobiłeś jest niedopuszczalne. Należy zastosować konwersję.
Jeżeli pola
Edit zawierają liczby całkowite, czyli typu
int, to można sobie darować komunikaty, lub zastosować jeden komunikat, o tym, że coś we wszystkich polach brak tekstu. Dokonując konwersji z wykorzystaniem funkcji
ToIntDef można podać wartość domyślną np.
1 tam gdzie konwersja nie jest możliwa, czyli w sytuacji gdy pole jest puste lub zawiera tekst nie będący liczbą:
if(Key == VK_RETURN)
{
String testEdit = "";
for(int i = 1; i <= 9; i++) /* 10 - Edit1 ... Edit9 */
testEdit = testEdit + dynamic_cast<TEdit *>( FindComponent("Edit" + (String)i) )->Text.Trim();
if( testEdit.IsEmpty() )
ShowMessage("Wprowadź prawidłowe dane");
else
Edit10->Text = IntToStr( ( ToIntDef(Edit1->Text, 1) * ToIntDef(Edit9->Text, 1) ) +
( ToIntDef(Edit3->Text, 1) * ToIntDef(Edit9->Text, 1) ) +
( ToIntDef(Edit5->Text, 1) * ToIntDef(Edit9->Text, 1) )
);
}
Funkcja
IntToStr konwertuje ponownie liczby na łańcuch znaków, gdyż jak wspomniałem właściwość
Text obiektu
TEdit oczekuje zmiennej typu
String a nie
int.
By uniknąć problemów z wprowadzaniem nieprawidłowych danych do pół
Edit można wprowadzić ograniczenie pozwalające na wprowadzanie tylko liczb i ewentualnie przecinka dla liczb zmiennopozycyjnych. W tym celu tworzymy prostą funkcję sprawdzającą i wywołujemy ją w zdarzeniu
OnKeyPress dla
Edit1:
void OnlyDigit(char &Key)
{
if(!strchr("0123456789,", Key) && Key != VK_BACK )
{
Key = 0;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
OnlyDigit(Key);
}
W ten sposób do Edit1 można wprowadzać tylko liczby całkowite i zmiennopozycyjne, ale co z pozostałymi Edit'ami. Dla nich też można utworzyć funkcję OnKeyPress, ale to zbędny kod, lepiej posłużyć się polimorfizmem. Czy dla pozostałych Edit'ów w Object inspector na zakładce Evensts w polu OnKeyPress wybieramy Edit1KeyPress. Postępujemy tak z każdym Edit'em, który chcemy podłączyć pod zdarzenie OnKeyPress obiektu Edit1. W ten sposób wszystkie obiekty korzystają z jednego zdarzenia tak samo jak by to było ich własne zdarzenie. Więcej o polimorfizmie
w serwisie Cyfrowy
Baron w dziale: teoria - rzutowanie typów, przypisanie polimorficzne.onkeypress.png
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.