Zmina koloru obiektu po kliknięciu.

0

Witam

Jestem początkujący w tym temacie, dlatego proszę o pomoc.

Mam koło w kolorze czerwonym, po kliknięciu przycisku zmienia ono kolor na niebieski. Chciałbym, by kolejne kliknięcie przywróciło z powrotem kolor czerwony.
Pracuję na programie Borland Delphi Enterprise Lite Edition 7.3.2.4

Fragment kodu źródłowego:

 object Shape23: TShape
    Left = 592
    Top = 600
    Width = 41
    Height = 41
    Brush.Color = clred
    Pen.Style = psDot
    Shape = stCircle
  end 
 object Button23: TButton
    Left = 624
    Top = 184
    Width = 17
    Height = 17
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clblue
    Font.Height = -3
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    ParentFont = False
    TabOrder = 36
    OnClick = Button23Click
  end 

Dopiero się uczę, pracuję z książką i słabo mi idzie.
Proszę o pomoc, jakąś wskazówkę.
Dziękuję i Pozdrawiam

0
procedure TForm1.Button1Click(Sender: TObject);
const
  COLORS: array [Boolean] of TColor =(clRed, clBlue);
begin
  Shape1.Brush.Color:= COLORS[Shape1.Brush.Color = clRed];
end;
0
hadid napisał(a)

Mam koło w kolorze czerwonym, po kliknięciu przycisku zmienia ono kolor na niebieski. Chciałbym, by kolejne kliknięcie przywróciło z powrotem kolor czerwony.

Ja zwykle sposobów jak mrówków;

Skoro masz taką właściwość w obiekcie klasy TShape jak Brush.Color = clRed, to możesz ją zmienić na inną (oczywiście musisz to zaprogramować w zdarzeniu Button23Click);

Możesz to zrobić tak:

procedure TForm1.Button23Click(Sender: TObject);
const
  aColors: array [Boolean] of TColor = (clRed, clBlue);
begin
  Shape23.Brush.Color := aColors[Shape23.Brush.Color = clRed];
end;

Konstrukcja jest bardzo prosta: statyczna macierz typowana logicznie z dwoma kolorami; Zasada działania: jeśli warunek Shape23.Brush.Color = clRed jest spełniony - ustawia kolor clRed, jeśli nie jest spełniony - clBlue;

Oczywiście można to załatwić warunkiem bez macierzy:

procedure TForm1.Button23Click(Sender: TObject);
begin
  if Shape23.Brush.Color = clRed then
    Shape23.Brush.Color := clBlue
  else
    Shape23.Brush.Color := clRed;
end;

Jak wolisz; Mnie jednak bardziej podoba się z macierzą ;-)


Edit: spóźniłem się, @kAzek był szybszy...

0

Dziękuję za tak szybką odpowiedź

Mam jednak kolejny problem. Postąpiłem według waszych instrukcji i dopisałem warunek z macierzą dla każdego zdarzenia.
I wiem, że teraz powinienem wykorzystać funkcję "compile" bądź "build" w programie. Ale okna są "zamrożone". Nie mogę również wykorzystać funkcji "run" by sprawdzić czy wszystko działa jak należy. Pewnie o czymś zapomniałem.

W katalogu roboczym posiadam pliki unit1.ddp, unit1.dfm oraz unit1.pas.
Może ktoś byłby w stanie rozwiązać mój problem.

Dziękuję i Pozdrawiam
hadid

0

Najpiew ogarnij postawy, poczytaj kursy, dopiero później bierz się za pisanie jakichkolwiek własnych programów i zanim zapytasz na forum, pokombinuj chwilę samodzielnie. Bo z plików jakie wyminiłeś wynika, że najprawdopodobniej chcesz skompilować sam unit bez otwartego projektu, a to jest niemożliwe. Najlepiej utwórz nowy projekt i zrób to na nowo, bo zdalnie cięzko ocenić co jeszcze namieszałeś przy braku podstawowej wiedzy. Jeżeli masz otwarty projekt i prawidłowo zainstalowane środowisko to nie spotkałem się raczej z przypadkiem aby Delphi nie chciało go spróbować uruchomić lub skompilowac. Pokazując ewentualne błedy jeżeli takowe są w kodzie od strony składniowej. A pliki możesz też dodać do nowego projektu lub usunąc inne moduły. Polecam jednak później zapisać wszystko do tego samego nowoutworzonego podkatalogu (najlepiej trzymać się zasady: jeden projekt - jeden katalog z potrzebnymi plikami), aby później nie mieć ścieżek względnych w sekcji uses projektu w stylu: nieuzywamgooglewiecjestemnoob in '..\..\..\..\FilmikiDlaDoroslych\nieuzywamgooglewiecjestemnoob.pas; i tym podobne.

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