Działania na labelach

0

witam,
Od razu pisze ze nie jestem jakiś super w programowaniu i więc prosiłbym wszystkich ludzi typu "google nie gryzie" albo "użyj szukaj" o przemilczenie i ominięcie tematu. Szukałem już w internecie wystarczająco a jeśli byłoby to na forum to raczej znalazłbym to jakoś w google (no ale możliwe że coś ominąłem przypadkiem, w SPACJA końcu potrzebuje jedną rzecz a tematów jest 1400).

Do sprawy: mam 7 labeli, po kliknięciu buttona przypisuje im określone kolory, przerwa na pół sekund i potem zmienia ich kolory na inne. Próbowałem robić w pętlach for, while, albo po prostu bez tylko z takim kodem:

Label1.Color:=clred;
Label2.Color:=clolive;
Label3.Color:=clyellow;
Label4.Color:=cllime;
Label5.Color:=claqua;
Label6.Color:=clpurple;
Label7.Color:=clbtnface;

Label8.Color:=clbtnface;
Label9.Color:=clred;
Label10.Color:=clolive;
Label11.Color:=clyellow;
Label12.Color:=cllime;
Label13.Color:=claqua;
Label14.Color:=clpurple;

Label15.Color:=clred;
Label16.Color:=clolive;
Label17.Color:=clyellow;
Label18.Color:=cllime;
Label19.Color:=claqua;
Label20.Color:=clpurple;
Label21.Color:=clbtnface;

Label22.Color:=clbtnface;
Label23.Color:=clred;
Label24.Color:=clolive;
Label25.Color:=clyellow;
Label26.Color:=cllime;
Label27.Color:=claqua;
Label28.Color:=clpurple;

sleep(500);

Label1.Color:=clbtnface;
Label2.Color:=clred;
Label3.Color:=clolive;
Label4.Color:=clyellow;
Label5.Color:=cllime;
Label6.Color:=claqua;
Label7.Color:=clpurple;

Label8.Color:=clred;
Label9.Color:=clolive;
Label10.Color:=clyellow;
Label11.Color:=cllime;
Label12.Color:=claqua;
Label13.Color:=clpurple;
Label14.Color:=clbtnface;

Label15.Color:=clbtnface;
Label16.Color:=clred;
Label17.Color:=clolive;
Label18.Color:=clyellow;
Label19.Color:=cllime;
Label20.Color:=claqua;
Label21.Color:=clpurple;

Label22.Color:=clred;
Label23.Color:=clolive;
Label24.Color:=clyellow;
Label25.Color:=cllime;
Label26.Color:=claqua;
Label27.Color:=clpurple;
Label28.Color:=clbtnface;

i tu jest problem, teoretycznie powinien najpierw zmienić kolory, poczekać pół sekundy a potem zmienić je na kolejne kolory. wszystko byłoby ok gdyby nie to że nie wykonuje części przed sleep, po prostu odczekuje pół sekundy i pokazuje kolory z drugiej zmiany

szukałem o delayu w delphi to ponoć zostało zastępione przez sleep i nie działa, niestety.

i chciałbym żeby działał tak: klikam na button, zmienia kolory labeli, przerwa pół sekundy, zmienia na inne, przerwa pół sekundy, zmienia kolory na poprzedni zestaw i tak w nieskończoność lub przez określoną ilość razy.

Myśle że to nie powinno być skomplikowane dla takich ludzi którzy tutaj przebywają i wykminią jak wytłumaczyć/pokazać zielonemu co i jak powinno być żeby to pykło..

pozdrawiam

0

Wrzuć to w Timer

// zmienna globalna
var
  Zmiana: boolean;

W timerze - ustaw interval na 500.

if not Zmiana then
begin
  Label1.Color:=clred;
  Label2.Color:=clolive;
  Label3.Color:=clyellow;
  Label4.Color:=cllime;
  Label5.Color:=claqua;
  Label6.Color:=clpurple;
  Label7.Color:=clbtnface;
  
  Label8.Color:=clbtnface;
  Label9.Color:=clred;
  Label10.Color:=clolive;
  Label11.Color:=clyellow;
  Label12.Color:=cllime;
  Label13.Color:=claqua;
  Label14.Color:=clpurple;
 
  Label15.Color:=clred;
  Label16.Color:=clolive;
  Label17.Color:=clyellow;
  Label18.Color:=cllime;
  Label19.Color:=claqua;
  Label20.Color:=clpurple;
  Label21.Color:=clbtnface;
 
  Label22.Color:=clbtnface;
  Label23.Color:=clred;
  Label24.Color:=clolive;
  Label25.Color:=clyellow;
  Label26.Color:=cllime;
  Label27.Color:=claqua;
  Label28.Color:=clpurple;

  Zmiana := True; // Zmien na kolory ponizej
end else
begin
 
  Label1.Color:=clbtnface;
  Label2.Color:=clred;
  Label3.Color:=clolive;
  Label4.Color:=clyellow;
  Label5.Color:=cllime;
  Label6.Color:=claqua;
  Label7.Color:=clpurple;
 
  Label8.Color:=clred;
  Label9.Color:=clolive;
  Label10.Color:=clyellow;
  Label11.Color:=cllime;
  Label12.Color:=claqua;
  Label13.Color:=clpurple;
  Label14.Color:=clbtnface;
 
  Label15.Color:=clbtnface;
  Label16.Color:=clred;
  Label17.Color:=clolive;
  Label18.Color:=clyellow;
  Label19.Color:=cllime;
  Label20.Color:=claqua;
  Label21.Color:=clpurple;
 
  Label22.Color:=clred;
  Label23.Color:=clolive;
  Label24.Color:=clyellow;
  Label25.Color:=cllime;
  Label26.Color:=claqua;
  Label27.Color:=clpurple;
  Label28.Color:=clbtnface;
  Zmiana := False; // zmien na kolory przed end else
end;

Możesz to samo zrobić ze sleep ale w wątku.

Ewentualnie sprawdź czy Ci zadziała ten kod co masz, jeśli wstawisz przed Sleep

Application.ProcessMessage;

czyli;

Label1.Color:=clred;
Label2.Color:=clolive;
Label3.Color:=clyellow;
...
 
Application.ProcessMessage;
sleep(500);
 
Label1.Color:=clbtnface;
Label2.Color:=clred;
Label3.Color:=clolive;
...
0

jest postęp, drugi sposób nie działa(Application.ProcessMessage; wyświetla na czerwono i nie uruchamia).
Pierwszy sposób zaczął działać tak że zamienia zestawy kolorów przy nacisku jednego buttona, i to już jest super. Tylko czy da sie żeby po jednym kliknięciu robił te zamiane sam po określonym czasie? ustawiłem timer i w nim interval na 500.

0

Spróbuj

Application.ProcessMessages;

Pisałem wrzuć ten kod do Timera, a nie do przycisku.

Czyli:

Kliknij 2-krotnie na timer i w zdarzeniu onTimer skopiuj ten kod z kolorami, oraz ustaw właściwość enabled timera na

False;

Wrzuć na forme 2 przyciski i nazwij je:
Button1 - Start.
Button2 - Stop.

W zadarzeniu OnClick przycisku Start wpisz:

Timer1.Enabled := True;

W zadarzeniu OnClick przycisku Stop wpisz:

Timer1.Enabled := False;

Cały kod:

procedure TForm1.Button1.OnClick(Sender: TObject);
begin
  Timer1.Enabled := True;
end;

procedure TForm1.Button2.OnClick(Sender: TObject);
begin
  Timer1.Enabled := False;
end;

procedure Timer1.OnTimer(Sender: TObject);
begin
if not Zmiana then
begin
  Label1.Color:=clred;
  Label2.Color:=clolive;
  Label3.Color:=clyellow;
  Label4.Color:=cllime;
  Label5.Color:=claqua;
  Label6.Color:=clpurple;
  Label7.Color:=clbtnface;
 
  Label8.Color:=clbtnface;
  Label9.Color:=clred;
  Label10.Color:=clolive;
  Label11.Color:=clyellow;
  Label12.Color:=cllime;
  Label13.Color:=claqua;
  Label14.Color:=clpurple;
 
  Label15.Color:=clred;
  Label16.Color:=clolive;
  Label17.Color:=clyellow;
  Label18.Color:=cllime;
  Label19.Color:=claqua;
  Label20.Color:=clpurple;
  Label21.Color:=clbtnface;
 
  Label22.Color:=clbtnface;
  Label23.Color:=clred;
  Label24.Color:=clolive;
  Label25.Color:=clyellow;
  Label26.Color:=cllime;
  Label27.Color:=claqua;
  Label28.Color:=clpurple;
 
  Zmiana := True; // Zmien na kolory ponizej
end else
begin
 
  Label1.Color:=clbtnface;
  Label2.Color:=clred;
  Label3.Color:=clolive;
  Label4.Color:=clyellow;
  Label5.Color:=cllime;
  Label6.Color:=claqua;
  Label7.Color:=clpurple;
 
  Label8.Color:=clred;
  Label9.Color:=clolive;
  Label10.Color:=clyellow;
  Label11.Color:=cllime;
  Label12.Color:=claqua;
  Label13.Color:=clpurple;
  Label14.Color:=clbtnface;
 
  Label15.Color:=clbtnface;
  Label16.Color:=clred;
  Label17.Color:=clolive;
  Label18.Color:=clyellow;
  Label19.Color:=cllime;
  Label20.Color:=claqua;
  Label21.Color:=clpurple;
 
  Label22.Color:=clred;
  Label23.Color:=clolive;
  Label24.Color:=clyellow;
  Label25.Color:=cllime;
  Label26.Color:=claqua;
  Label27.Color:=clpurple;
  Label28.Color:=clbtnface;
  Zmiana := False; // zmien na kolory przed end else
end;

end;

0

działa! chciałem pójśc na łatwizne i skopiowałem cały kod ale nie działał to ruszyłem główką i zrobiłem program od nowa ze wszystkim tak jak pisałeś, jesteś wielki, dziekuje bardzo :)

1

Lekcja na dziś: tablice...
Bo to co tu napisałeś to koszmar...

0
Shalom napisał(a)

Lekcja na dziś: tablice...
Bo to co tu napisałeś to koszmar...

Można by to wykonać na macierzach o indeksie typowanym (żeby uniknąć warunku lub dwóch pętli) i odpowiednio przygotowane pętle; Przyda się także FindComponent();

Tablice


Poza tym takie coś:

if not Zmiana then
  {...}
  Zamiana := True;
  {...}
else
  {...}
  Zamiana := False;
  {...}

można skrócić do jednej linii:

Zamiana := not Zamiana;

i wstawić to na sam koniec ciała zdarzenia poza warunkami;


Dupa Jaś, wystarczy zwykła macierz (nie ta o indekscie typowanym), jednowymiarowa o ilości elementów większej o 1, niż ilość kolorów i odpowiednie sprawdzenie wartości zmiennej Zamiana, oraz ustalenie licznika pętli według tej zmiennej; wystarczy prosta macierz i jedna pętla, FindComponent() oraz operator mod;

Macierz kolorów:

const
  TColorsArr: array [1 .. 7] of TColor = (clBtnFace,
                                          clRed,
                                          clOlive,
                                          clYellow,
                                          clLime,
                                          clAqua,
                                          clPurple,
                                          clBtnFace);

Oto ciekawostka :]


Albo jeszcze inaczej - ustawienie licznika na stałe ([1 .. 28]) i dzięki mod wyznaczenie początkowej wartości licznika przeszukującego macierz kolorów;

0

Dokładnie najlepiej zrobić, tak jak napisał @furious programming. Twój kod, który pokazałeś @cordis to po prostu nieporozumienie, porażka i jakiś "potworek". Tablica TLabel, FindComponent oraz Tablica stałych ze zdefinowanymi kolorami, tak powinieneś to rozwiązać i jakbyś na prawdę z głową szukał to byś znalazł takie podpowiedzi na mnóśtwie stron do odszukania w Google. Nawet czytając najpierw kompendium Delphi na 4p, to znalazł byś bez problemu informację o tablicach i ją wykorzystał.

0

pozdrawiam was, wiedziałem że jak napisze na jakimś forum to odezwą sie wielcy znawcy, poprosiłem o coś i dostałem od kogoś odpowiedź, nie interesuje mnie jak to można inaczej zrobić, potrzebowałem to tylko na teraz, żeby zrobić mój program który miałem zadane jako praca, nigdy nie bede programistą, i nie interesuje mnie to jak można to inaczej zrobić, zrobiłem po swojemu i jestem wdzieczny jednej osobie która to potrafiła zrozumieć i mi pomogła

2

Powalająca szczerość. Ale pomysly kolegow mogą przydać się tym zainteresowanym programowaniem...

0
Zibicoder napisał(a)

Ale pomysly kolegow mogą przydać się tym zainteresowanym programowaniem...

No ale po co robić dobrze i krótko, jak można na pałę bezsensownie klepać dziesiątki linii... W ogóle nie ma sensu się do niczego przykładać i robić cokolwiek z głową, bo przecież szybciej jest byle jak, byle by było...

0

No, znalazłem chwilkę i napisałem znacznie krótszą wersję, ma statyczną macierz kolorów, dwie pętle i przypisanie koloru (które jest tak długie, że podzieliłem na dwie linie) oraz zmianę stanu (bChanged):

procedure TMainForm.tmrColorsTimer(Sender: TObject);
const
  ColorsArr: array [0 .. 7] of TColor = (clBtnFace, clRed, clOlive, clYellow,
                                         clLime, clAqua, clPurple, clBtnFace);
var
  iOffset, I, J: Byte;
begin
  for I := 0 to 3 do
    begin
      iOffset := Abs(Abs((I mod 2) - Byte(bChanged)) - 1);

      for J := 0 to 6 do
        TLabel(FindComponent('Label' + IntToStr(I * 7 + J + 1))).Font.Color :=
          ColorsArr[J + iOffset];
    end;

  bChanged := not bChanged;
end;

Aplikacja realizująca ten algorytm w załączniku;


Wpisałem przesunięcie (offset) do osobnej zmiennej;

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