C++ (Builder) - Timer.

2

Witam!

Zaczynam zabawę na lekcji w C++ Builderze - jako zadanie dostałem coś oto takiego:

Po kliknięciu w BUTTON - przesunie się on od jednej krawędzi do drugiej, następnie gdy dojdzie do krawędzi to "odbije się" i zawróci.

No to zrobiłem to następująco, iż wrzuciłem Button1->Left++; - w pente.

Nauczyciel coś mówił na temat użycia Timera - próbowałem - tylko:
-ma on opcje enabled (true/false).
-interval (w ms).
-OnClik (np Button1).

Problem w tym, że nie rozumiem za bardzo co z czym się je. Co to jest w ogóle ten Timer? Jest to coś takiego jak funkcja Sleep?
Że robi pewnego rodzaju zatrzymanie? Czy bardziej jak pętla - powtarza określoną czynność.

Początkowo zrobiłem coś takiego - klikłem dwa razy na button, następnie wpisałem:
Timer1->Interwal=5000;
Button1->Caption="test";

Problem w tym, że u mnie niczym to się nie różni od tego, jak bym tylko wpisałem Button1->Caption="test";

Ten timer trzeba jakoś wystartować? (standardowo mam - Enable - True.).

Mógłby mi ktoś podesłać jakiś link z lekturą w J. Polskim? Lub też wytłumaczyć - albo podesłać kod zadania z timerem - to podejrzewam, iż rozkminie "co z czym się je".

PS2. Mam małe pytanko - świeżo co przeszedłem ze programowania strukturalnego i nie rozumiem jednej rzeczy.

Gdy w button wpisze - Button1->Left=Left+10; - to po kliknięciu przesunie się o 10 pikseli - a jak drugi trzeci itd - kliknę, to nie przesuwa się już w ogóle - czemu tak jest? I jak to zmienić?

Pozdrawiam i czekam na odpowiedź - Mikołaj N.

1

Timer to po prostu kontrolka, która odmierza czas i wykonuje czynność po upłynięciu danego okresu czasu np. 10ms. Nie rozumiem tego zdania:

Gdy w button wpisze - Button1->Left=Left+10; - to po kliknięciu przesunie się o 10 pikseli - a jak drugi trzeci itd - kliknę, to nie przesuwa się już w ogóle - czemu tak jest? I jak to zmienić?

Co drugi, trzeci klikniesz?

1

Zrób sobie zmienną globalną np.


 int pozycja = 0;

a w timmerze wpisz interwal na jakąś liczbę całkowitą np. 500 (500 milisekund czyli 0,5 sekundy).
teraz wygeneruj zdarzenie timmera przez 2-klik na zakładce events i zrób mniej więcej tak: (pisze z palca)


pozycja++;
Label1->Caption = pozycja;

co każde 0,5 sek. powinna się zmieniać wartość label'a o 1.

myślę że z resztą sobie teraz poradzisz. Aha ustawienie enabled na true rozpoczyna działanie "zegarka" więc ustaw go na true

0

Okej - postanowiłem zrobić konto - więc od początku:
Moim zadaniem jest zrobienie tego pseudo pływającego guzika wykorzystując przy tym Timer.

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer1->Interwal=5000;
Button1->Caption="test";
}

Według tego zapisu - po kliknięciu w button - powinno upłynąć 5000 MS (5 sek) i zmienić się napis - niestety - napis zmienia się od razu.

A co do:
Gdy w button wpisze - Button1->Left=Left+10; - to po kliknięciu przesunie się o 10 pikseli - a jak drugi trzeci itd - kliknę, to nie przesuwa się już w ogóle - czemu tak jest? I jak to zmienić?
To nie jest zadanie tylko takie moje małe testy. Mam coś takiego:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Button1->Left=Left+10;
}

Klikam raz na button - przesuwa się o 10 pikseli - klika później obojętnie ile razy w ten button - i nie przesuwa się - lecz stoi w miejscu. Pytanie Dlaczego?

1
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Button1->Left=Button1->Left+10;
}
1

Interwał jeżeli nie musisz w kodzie, to zawsze umieszczaj we właściwościach Timer'a w Object Inspector'rze. Ustaw tam te 100ms czy ileś i w metodzie, która wykonuje się po kliknięciu button'a wklej samo to co Timer1->Enabled = true, a w metodzie Timer'a wpisz to co nobody napisał. Musi zadziałać.

I nie Interwal tylko Interval.

0

Tak tak - naturalnie - już rozumiem całą koncepcje timera - jak go startować i tak dalej ;).

Problem leży w czymś innym - jak napisać, to zadanie z "pływającym guzikiem".

zrobiłem tak:

if(Button1->Left<168)
Button1->Left++;

I stanąłem (168 to krawędź końcowa mojego okienka) - nie wiem jak napisać żeby wracał w miejsce 8 (początkowa krawędź).

0

Button1->Left = 0 ;
zmniejszanie jak łatwo się domyślić Button1->Left--; :>
warto też pobierać aktualny rozmiar okna w zdarzeniu bo co gdy user np. zrobi maksymalizacje :>

1

Lepiej będzie jak dasz w miejsce 168 faktyczny, aktualny rozmiar rect formy. To chyba jest nazwa_formy->ClientWidth dla długości, a wysokości
nazwa_formy->ClientHeight.
Tak jak teraz byś chciał zrobić nie będzie do końca tak jak chcesz. Tu gotowy kod na odbijanie i ruch.

if (Button1->Left + Button1->Width >= Form1->ClientWidth)
    Button1->Left--;
else if (Button1->Left <= 0) 
    Button1->Left++;

I teraz dojedzie w prawo i się "odbije", a potem "odbije się" od lewa itd.

0

Tak - można by było zrobić tak jak myślisz - ale tu chodzi o efekt "pływania" - tak jak daje Button1->Left++; inkrementacja w prawo o 1 - tak trzeba zrobić dekrementacje w prawo o 1 - czyli Button1->Left --;

Lecz gdy zrobię:
if(Button1->Left<168)
Button1->Left++;
if(Button1->Left>8)
Button1->Left--;

Kicha - bo one będą kolidować ze sobą...

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