Losowa zmiana koloru TShape

dział ogólny

Losowa zmiana koloru TShape

Nowy postprzez gregory » sobota, 3 kwietnia 2010, 10:47

Witam.
Mam za zadanie napisać aplikację, w której komponent TShape będzie zmieniał losowo kolor co sekundę na dowolny z wybranej grupy. Ilość zmiany koloru będzie zależna od liczby w pozycji Edit. Nie wiem jak się za to zabrać. Sądzę że trzeba użyć komponentu Timer, nie wiem natomiast jak to ze sobą powiązać, a szczególnie losować zmianę koloru, może użyć funkcji random?
ProszÄ™ o pomoc.
Avatar użytkownika
gregory
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): środa, 17 lutego 2010, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows 7
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows XPFirefox

Re: Losowa zmiana koloru TShape

Nowy postprzez Cyfrowy Baron » sobota, 3 kwietnia 2010, 10:50

Ile kolorów? Jaki jest zakres liczb do losowania od-do?
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
    Windows XPFirefox

Re: Losowa zmiana koloru TShape

Nowy postprzez gregory » sobota, 3 kwietnia 2010, 10:55

Program ma losować jeden z 6 wybranych kolorów, ilość zmian koloru wpisywana jest w komponencie Edit. Wpisuje 10, klikam na przycisk Start, a TShape zmienia losowo kolor 10 razy co sekundę.
Avatar użytkownika
gregory
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): środa, 17 lutego 2010, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows 7
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows XPFirefox

Re: Losowa zmiana koloru TShape

Nowy postprzez Cyfrowy Baron » sobota, 3 kwietnia 2010, 11:36

Dziesięć razy na sekundę, tej zmiany nie będzie widać, a jak się doda funkcję, która będzie odświeżała kolejkę komunikatów by móc na bieżąco wyświetlać wynik zmiany kolorów, to nie da się takiej dziesięciokrotnej zmiany kolorów wykonać w ciągu jednej sekundy. Jesteś pewien, że o to chodzi w tym zadaniu?!
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
    Windows XPFirefox

Re: Losowa zmiana koloru TShape

Nowy postprzez Cyfrowy Baron » sobota, 3 kwietnia 2010, 12:04

Umieść na formularzu komponenty: Shape1, Edit1 i Timer1.

W Timer1 ustaw właściwość Enabled na true, a Interval na 1000.

W pliku nagłówkowym w sekcji private zadeklaruj listę typu TStringList, która będzie przechowywała sześć zdefiniowanych kolorów w formacie WEB, oraz zmienną typu int, która będzie przechowywała liczbę podaną w Edit1:

Kod: Zaznacz cały
private:
     TStrings* ColorList;
     int count;
 


Teraz w pliku źródłowym w konstruktorze klasy trzeba zdefiniować listę. Następnie w zdarzeniu OnShow formularza trzeba wypełnić listę kolorami. Ustawić tekst w Edit1 na 0, by zatrzymać zegar, ma to związek ze zdarzeniem OnChange obiektu Edit1 w którym umieszczamy kod pobierający tekst do zmiennej count. Zakres liczby wprowadzanej do Edit1 został ograniczony do 0-10, tzn. użytkownik może wprowadzić liczby mniejsze od 0 i większe od 10, ale zostaną one i tak obcięte do pożądanej wartości. To zdarzenie steruje również zegarem, gdy wprowadzona wartość jest mniejsza niż 1 to zegar się zatrzymuje w przeciwnym razie jest uruchamiany. W zdarzeniu OnTimer obiektu Timer1 umieszczamy kod sprawdzający czy zmienna count jest większa od 0, jeżeli nie to dalszy kod się nie wykona. To sprawdzanie jest w zasadzie zbędne, gdyż w przypadku gdy zostanie podana wartość 0, zegar i tak się zatrzyma. Stanowi jakby dodatkowe zabezpieczenie. W zdarzeniu OnTimer odbywa się losowanie liczby z zakresu 0-6 oraz zmiana koloru obiektu Shape1:

Kod: Zaznacz cały

__fastcall TForm1
::TForm1(TComponent* Owner)
    : TForm(Owner)
{
 ColorList = new TStringList;    
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
 ColorList->Add("#ffffff");
 ColorList->Add("#ff0000");
 ColorList->Add("#00ff00");
 ColorList->Add("#0000ff");
 ColorList->Add("#000000");
 ColorList->Add("#ffff00");

 Edit1->Text = "0";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
 delete ColorList;    
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
 count = Edit1->Text.ToIntDef(0);

 if(count > 10) count = 10;
 if(count < 0)  count = 0;

 if(count != 0)
 {
  Timer1->Interval = 1000 / count;
  Timer1->Enabled = true;
 }
 else Timer1->Enabled = false;    
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 if(count == 0) return;

 Shape1->Brush->Color = WebColorStrToColor( ColorList->Strings[Random(6)] );

 Application->ProcessMessages();
}
 


Przedstawiony kod wykorzystuje obiekty i funkcje dostępne w środowisku C++Builder 6 i nowszych.
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
    Windows XPFirefox

Re: Losowa zmiana koloru TShape

Nowy postprzez gregory » sobota, 3 kwietnia 2010, 12:28

Dzięki za pomoc. Oczywiście chodziło mi żeby program raz zmienił kolor w ciągu sekundy, a w sumie 10 razy w ciągu 10 sekund. Mam jeszcze problem z tymi kolorami, jak zrobić by były to kolory z listy typu Shape1->Brush->Color?
Avatar użytkownika
gregory
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): środa, 17 lutego 2010, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows 7
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows 7Firefox

Re: Losowa zmiana koloru TShape

Nowy postprzez Cyfrowy Baron » sobota, 3 kwietnia 2010, 12:35

jak zrobić by były to kolory z listy typu Shape1->Brush->Color?


Nie ma takiej listy! Zadaj prawidłowe pytanie. Color to liczba wszystkich możliwych kolorów, czyli coś około 65 milionów dla 32 bitowej głębi kolorów.

Oczywiście chodziło mi żeby program raz zmienił kolor w ciągu sekundy, a w sumie 10 razy w ciągu 10 sekund.


Więc trzeba zmodyfikować kod:

Kod: Zaznacz cały

void __fastcall TForm1
::Edit1Change(TObject *Sender)
{
 
count Edit1->Text.ToIntDef(0);

 if(
count 10count 10;
 if(
count 0)  count 0;

 if(
count != 0)
 {
  
Timer1->Interval 1000 ;// tutaj wprowadziÅ‚em zmiany
  
Timer1->Enabled true;
 }
 else 
Timer1->Enabled false;    
}
 


Tylko, że 10 razy w ciągu 10 sekund to 1 raz w ciągu sekundy, więc to wogóle nie ma już sensu, gdyż pobierana wartość nie odgrywa w typ przypadku żadnej roli.
Może chodzi raczej o to, żeby zmieniał 1 raz w ciągu 10 sekund? Jeżeli tak, to kod powinien mieć taką postać:

Kod: Zaznacz cały

void __fastcall TForm1
::Edit1Change(TObject *Sender)
{
 
count Edit1->Text.ToIntDef(0);

 if(
count 10count 10;
 if(
count 0)  count 0;

 if(
count != 0)
 {
  
Timer1->Interval 1000 count ;// tutaj wprowadziÅ‚em zmiany
  
Timer1->Enabled true;
 }
 else 
Timer1->Enabled false;    
}
 


Przemyśl to zadanie na spokojnie, gdyż im bardziej się w to zagłębiasz tym mniej ma to sensu.
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
    Windows XPFirefox


Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

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

cron