C++ builder [okienka] kilka problemów


(Kamyk9944) #1

Witam. Mam kilka problemów które wydają się być proste, ale ja już na to nie mam pomysłów.

1)Pierwszy z nich to zabezpieczenie przed wpisywaniem znaków, liter do Editów. W editach mogą znajdować się tylko cyfry 0-9. Bo gdy wpiszę literę lub znak, to wywala błąd przy kliknięciu buttona który ma rysować funkcję matematyczną. Próbowałem robić tak:

*for(int i=0;i<=9;i++){

        if(Edit1->Text!=i){

        Application->MessageBox("Nie można wpisywac liter i znakow do Edita", "Blad",MB_OK | MB_ICONWARNING);

        break;

oraz tak (zakres cyfer w ascii):

/*if(Edit1->Text <'48' || Edit1->Text > '57')

                Application->MessageBox("Nie można wpisywac liter i znakow do Edita","Blad", MB_OK | MB_ICONWARNING);

nic z tego nie działa i błąd jak był tak jest. Próbowałem zamienić też Edity na MaskEdity ale to nie dobry pomysl bo mask edit wyświetla w Edicie te znaki "_".

2)drugi problem to aktualizowanie informacji o wykresie. Mam Forma 5 w którym są labele które mają za zadanie wyświetlać Dane funkcji. Czyli współczynnik a, b,c, delta, miejsca zerowe. Po narysowaniu pierwszego wykresu działa, ale jak narysuje kolejny to już się nie aktualizuje, a co ciekawe jak narysuje f.kwadratową to aktualizuje się zawsze, a kod jest identyczny jak do pozostalłych funkcji. Tutaj próbowałem kod wrzucić do buttona który rysuje wykres i po narysowaniu przekazywał by dane do tego Forma5. Próbowałem też osobnym przyciskiem lecz nic z tego.

3)Kolejny problem to rysowanie funkcji Logarytmicznej. przerabiałem ją tyle razy ale błędu nie usunąłem. jak klikam przycisk do rysowainia wywala błąd log sing error, ale funkcję rysuje (o dziwo) ale troche nie tak jak trzeba bo zamiast rysować mniej więcej tak(zielony kolor) to rysuje tak(czerwony):

to cchyba tyle. mam nadzieję że pomożecie :wink:


(Johny) #2

Bo cały Edit traktuje się jako obiekt,przed sprawdzeniem musisz wyciągnąć tekst przypisując go zmiennej stringowej i dopiero na tej zmiennej możesz sprawdzić.

AnsiString lancuch;

lancuch = Edit1->Text();

Tu chyba nawet funkcja jest GetString

dopiero tą zmienną możesz traktować jako tablicę

Co do drugiego punktu przed narysowaniem wykresu czyść Canvas np rysując biały prostokąt.

Obsługę grafiki łatwo znajdziesz.

int myValue = Edit1->Text.ToInt(); - wyciąganie wartości z konwersją na liczbę

u ciebie będzie

String myValue=Edit1->Text.toString();


(Kamyk9944) #3

1 sposób z tym przypisaniem editów dalej nie działa :frowning:

a co do wykresu to czyszczenie canvasa mi nie pasuje bo jak chce narysować np. pare wykresów na jednym układzie to lipa :). Już nawet olać błąd, ale żeb dobrze rysowalo.


(Johny) #4

A wyciągałeś znaki z tego stringa ?

potem trzeba sprawdzać funkcjami isalpha() isdigit() czy podany znak jest literą,liczbą,poducz się języka C,bo z tym masz problem.

Ciekawe czy utworzyłeś projekt,bo bez tego też nie skompilujesz.

Obiekty Edit1,Edit2,itd. muszą istnieć.


([alex]) #5

sing error - prawdopodobnie próbujesz obliczyć log(0)


(Kamyk9944) #6

to znaczy ja c++ ucze sie okolo rok, bo to robie do szkoly projekt. Edity mam, ale nie znam tak zaawansowanych funkcji dlatego opieram to na takich podstawowych i na takich chcę to tez zrobic. a co do log, to nie dziele przez 0, bo ustawilem zabezpieczenie e wpisana liczba nie moze byc mniejsza niz 1.


([alex]) #7

Co ma wpisana liczba do rysowanego wykresu?


(Kamyk9944) #8

uporałem się, po problemie. została kwestia znaków w editach (żeby nie można było wpisywac) oraz aktualizacja danych o wykresie. (jak naciskam przycisk rysuj, to pokazują się informacje. ale jak narysuje inny wykres to się nie aktualizują)


([alex]) #9

double Dane=StrToFloatDef(Edit1->Text,0);

if(Dane!=StrToFloatDef(Edit1->Text,-1)) //Niepoprawne dane

else // Poprawne dane

Dla przerysowania trzeba dać Invalidate();


(Kamyk9944) #10

problem rozwiązany. Dzieki :slight_smile: