problem z TEdit i TUpDown

problemy z funkcjonowaniem bibliotek, komponentów itp.

problem z TEdit i TUpDown

Nowy postprzez jabu74 - ekspert » wtorek, 12 sierpnia 2008, 15:04

witam !

wpisalem we wlasciwosciach Edit1 w pole Text "1000";

poczym napisalem procedure

Kod: Zaznacz cały
void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button)
{
   int i;

   if (Button == btNext) {

      i =   Edit3->Text.ToInt();

      ++i;

      Edit3->Text = IntToStr(i);

   }
   else {

      i =   Edit3->Text.ToInt();

      --i;

      Edit3->Text = IntToStr(i);

   }
}


warunek dla Button rowny btNext chodzi dobrze, natomiast drugi nie chodzi prawidlowo tzn. nie odejmuje od wartosci 1000, jak naklikam wyzsza wartosc to dziala prawidlowo i odejmuje ale jak dojde do 1000 to znowu staje

nie wiem co jest grane :(

pozdrawiam
Avatar użytkownika
jabu74 - ekspert
 
    NieznanyNieznana

Re: problem z TEdit i TUpDown

Nowy postprzez Cyfrowy Baron » wtorek, 12 sierpnia 2008, 18:21

Dzieje się tak dlatego, że obiekt UpDown po pierwszym wywołaniu zdarzenia OnClick podłącza się do obiektu Edit i pobiera z niego wartość = 1000, ustawia sobie tą wartość jako maksymalną i nie możesz przejść powyżej.

Sterowanie wartościami w Edit poprzez UpDown nie wymaga żadnego kodu, gdyż UpDown zawiera już kod sterujący.
Powinieneś to zrobić tak. Umieszczasz na formularzu obiekt Edit następnie umieszczasz obiekt UpDown. W właściwości Associate obiektu UpDown wybierasz obiekt Edit, następnie we właściwości Max obiektu UpDown ustawiasz maksymalną wartość jaką może ten obiekt osiągnąć UpDown przy zwiększaniu wartości dojdzie tylko do wartości maksymalnej, we właściwości Min obiektu UpDown ustawiasz minimalna wartość jaką może osiągnąć UpDown, obiekt nigdy nie przekroczy tej wartości. W właściwości Incremental ustawiasz co ile ma następować skok wartości, czyli o ile będzie zwiększana i zmniejszana wartość. W właściwości Position obiektu UpDown ustawiasz wartość początkową, czyli taką jaka wyświetli się w Edit na samym początku.
Od teraz bez żadnego dodatkowego kodu UpDown będzie sterował zawartością obiektu Edit określonego w jego właściwości Associate. W ten sposób możesz sterować za pomocą tego obiektu każdym innym obiektem posiadającym właściwość Text lub Caption, nawet obiektem Button, czy Memo.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: problem z TEdit i TUpDown

Nowy postprzez jabu74 - ekspert » wtorek, 12 sierpnia 2008, 19:55

wlasnie o to chodzi, ze inkrementuje powyzej tylko nie chce dekrementowac ponizej 1000.

ja by nie komplikowac podalem wartosc 1000, a tak naprawde to chce tam umieszczac wartosc z przecinkiem tzn. np. 5,00
bo jakby dzialalo jak powinno to ja bym sobie poradzil z przecinkiem poniewaz mam przygotowana procedurke, ktora odczytuje Edit1->Text, potem
usuwa przecinek, nastepnie juz bez przecinka zamienia na int (czyli w tym przypadku 500) inkrementuje lub dekrementuje (w zaleznosci, ktora strzalka wcisnieta)
po czym wykonuje odwrotne operacje by zapisac nowa wartosc do Edit. to ze mi nie chodzi to znacznie skomplikowalo mi sytuacje.

nie wiem czy da sie zrobic z przecinkiem. :(
Avatar użytkownika
jabu74 - ekspert
 
    NieznanyNieznana

Re: problem z TEdit i TUpDown

Nowy postprzez jabu74 - ekspert » wtorek, 12 sierpnia 2008, 21:23

witam !

ponizej procedurka, ktora nie dziala do konca prawidlowo, a wg mnie jest dobra (zdarzenie OnClick TUpDown)

Kod: Zaznacz cały
void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button)
{
        AnsiString str;

        int i;

        str = Edit3->Text;      //w str jest teraz "2,00"

        str.Delete(2,1);

        if (Button == btNext) {

                i = str.ToInt();

                ++i;

                str = IntToStr(i);

                str.Insert(",",2);

                Edit3->Text = str;

        }
        else {

                i = str.ToInt();

                --i;

                str = IntToStr(i);

                str.Insert(",",2);

                Edit3->Text = str;

        }
}


pozornie jest wszystko ok tzn. inkrementuje powyzej 2,00, jak jest wieksza to tez dekrementuje, ale nie ponizej 2,00 :evil:

moze macie inne propozycje jak obejsc ten problem :-)

pozdrawiam
Avatar użytkownika
jabu74 - ekspert
 
    NieznanyNieznana

Re: problem z TEdit i TUpDown

Nowy postprzez Cyfrowy Baron » Å›roda, 13 sierpnia 2008, 09:24

Poświęciłem trochę uwagi temu obiektowi i wiem już, że w momencie pierwszej inkrementacji, czyli pierwszego kliknięcia w obiekt pobiera on sobie wartość ze zdarzenia i ustawia na minimalną, dlatego przy kolejnych kliknięciach nie możesz zmniejszyć początkowej wartości jest to wewnętrzny zahermetyzowany mechanizm tego komponentu, więc nie można tego zmienić.




Proponuję zamiast niego użyć komponentu TCSpinEdit znajdującego się na zakładce Samples. Ma on dwa zdarzenia OnDownClick - inkrementacja w dół i OnUpClick - inkrementacja w górę.

Jeżeli chcesz inkrementować wartości dziesiętne to cała ta procedura z usuwaniem przcinka nie ma sensu, wystarczy zamiast zmiennej typu Integer zastosować zmienną typu double i inkrementować np. o 0.5

Kod: Zaznacz cały
void __fastcall TForm1::CSpinButton1DownClick(TObject *Sender)
{
Edit1->Text = (String)(Edit1->Text.ToDouble() - 0.5);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CSpinButton1UpClick(TObject *Sender)
{
  Edit1->Text = (String)(Edit1->Text.ToDouble() + 0.5);
}
//---------------------------------------------------------------------------
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: problem z TEdit i TUpDown

Nowy postprzez jabu74 - ekspert » Å›roda, 13 sierpnia 2008, 13:08

witam

ale wlasnie nie chce zamieniac na double

pozdrawiam
Avatar użytkownika
jabu74 - ekspert
 
    NieznanyNieznana

Re: problem z TEdit i TUpDown

Nowy postprzez jabu74 - ekspert » Å›roda, 13 sierpnia 2008, 13:11

ponizszy kod moze sie wam przydac wiec pozwole sobie na krotki komentarz.

dzialanie polega na inkrementacji/dekrementacji o 0,01 pola Edit3 po nacisnieciu na strzalki komponentu TUpDown

w tej postaci jest dobry dla ciagu znakow "0,00" do "5,00" wpisanych w polu Edit3. ciagi znakow zamieniane sa na odpowiednie wartosci int (zmienna i)
dzieki temu mamy mozliwosc latwego wykonywania operacji arytmetyczno-logicznych i porownan. dla przykladu np. ciag "1,23" na wartosc 123.
po malej modyfikacji kodu mozna zmienic zakres od "0,00" do "9,99"

napisalem prosta funkcje IntToString() chociaz istnieje standardowa funkcja IntToStr() poniewaz ta druga obcina nieznaczace zera (np. dla 15 standardowa daje "15", a moja "015").

po prostej modyfikacji mozna zwiekszyc zakres np. do "9,999". takze b. latwo mozna manipulowac polozeniem przecinka.

Kod: Zaznacz cały
unsigned int i;

void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button)
{
        AnsiString str;


        str = Edit3->Text; // zapisanie lancucha np."2,00" z pola Edit1 do str

        str.Delete(2,1); // usuniecie przecinka

        i = str.ToInt();

        if (Button == btNext) {

                if (i < 500) // maksymalna wartosc dla tego przykladu nie moze byc wieksza od 999
                        ++i;

        }
        else {
                if (i > 0) // minimalna wartosc nie moze byc mniejsza od 0 (zawsze)
                        --i;

        }

        str = IntToString(i);

        Edit3->Text = str.Insert(",",2); // wstawienie przecinka i wpisanie do pola Edit3

}

AnsiString __fastcall TForm1::IntToString(unsigned int i)
{
        AnsiString str = "000"; // maksymalna wartosc dla tej funkcji to 999

        str[1] = i / 100 + 0x30;
        i %= 100;
        str[2] = i / 10 + 0x30;
        i %= 10;
        str[3] = i + 0x30;

        return str;
}



zycze owocnego programowania :lol:

pozdrawiam
Avatar użytkownika
jabu74 - ekspert
 
    NieznanyNieznana

Re: problem z TEdit i TUpDown

Nowy postprzez Cyfrowy Baron » Å›roda, 13 sierpnia 2008, 20:49

Nie pojmuję sensu wykonywania całej tej operacji i czemu to ma służyć, ale dla twojej ciekawości istnieje prostszy sposób usuwania przecinka, wystarczy prost funkcja:

Kod: Zaznacz cały
  Edit3->Text = StringReplace(Edit3->Text, ",", "", TReplaceFlags() << rfReplaceAll);


I w ten oto prosty sposób przecinek został usunięty z Edit3 i to niezależnie od tego na jakiej pozycji się znajduje, podczas gdy Twój sposób usuwa tylko przecinek z drugiej pozycji, a co jeżeli tam nie będzie przecinka - zostanie usunięta litera (liczba).

Jeżeli chodzi o formatowanie liczb całkowitych lub zmiennopozycyjnych w sposób jaki podałeś, czyli przerobienie np. 15 na 015 to na też już istnieje gotowa funkcja FormatCurr:

Kod: Zaznacz cały
int liczba = Edit1->Text.ToIntDef(0); // poczÄ…tkowo Edit1 zawiera np. liczbÄ™ 15
Edit1->Text = FormatCurr("#000", liczba); // po formatowaniu zawiera już liczbę 015, liczba zer po znaku # określa ile znaków ma zawierać tekst


A o tym wszystkim możesz przeczytać w serwisie: Cyfrowy Baron w działach: porady zmienne i łańcuchy znaków.

Może Ci się to przyda...
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Biblioteki i komponenty

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 11 gości

cron