Przejdź do zawartości

Delphi/Zdarzenia

Z Wikibooks, biblioteki wolnych podręczników.
(Przekierowano z Delphi:Zdarzenia)

Zdarzenia

[edytuj]

Działanie bardzo wielu programów polega na obsłudze zdarzeń. Zauważ, że większość programów z reguły nic nie robi: edytor tekstu czeka, aż zaczniesz pisać i dopiero reaguje na Twoje litery, program graficzny reaguje na Twoje ruchy myszką i tak dalej. Twój dotychczasowy program również nic nie robi, poza wyświetleniem etykiety.

Dodaj do swojego programu przycisk. Wybierz w pasku komponentów "Button" i dodaj go do formularza. Nadaj mu nazwę oraz opis (Caption), jeśli chcesz. Uruchom teraz program.

Jak zauważyłeś, przyciskanie przycisku nie powoduje żadnej reakcji programu. Obsługą samego przycisku zajmuje się system Windows (dlatego, gdy klikasz przycisk zmienia się jego wygląd, mimo iż Twój program w ogóle nie ma obsługi przycisku). Obsługę przycisku można rozumieć w następujący sposób: jeżeli użytkownik wciska przycisk, przycisk wysyła do systemu wiadomość, że został wciśnięty. System przekazuje z powrotem tę wiadomość do Twojego programu. Twój program następnie reaguje na tę wiadomość w odpowiedni sposób. Oczywiście, w tym przypadku nie reaguje – ale naprawdę dostaje wiadomość, że przycisk jest wciśnięty.

Zamknij swój program, by powrócić do edycji komponentów. Wybierz teraz przycisk (w Inspektorze Obiektów, wskaż go myszką na formularzu lub w Drzewku Obiektów). W Inspektorze Obiektów masz kartę "Events" (zdarzenia). Karta Events zawiera wszystkie zdarzenia związane z tym przyciskiem, na jakie zareaguje Twój program. Nie wszystkie zdarzenia muszą być przypisane.

Podstawowym zdarzeniem dla przycisku jest OnClick, które jest wywoływane, gdy użytkownik kliknie przycisk. Wejdź na pole OnClick i kliknij dwukrotnie pusty prostokąt. W pustym miejscu pojawi się tekst: Button1Click, jak na rysunku poniżej.

Otworzyło się okienko edytora i Delphi utworzyło dla Ciebie nową metodę formularza: Button1Click. Ta metoda zostanie wykonana wtedy, gdy program otrzyma wiadomość o kliknięciu przycisku Button1.

Metoda jest procedurą (lub funkcją). Obsługa metody jest analogiczna jak obsługa procedur lub funkcji w Pascalu. Załóżmy, że program po kliknięciu przycisku ma zmienić tekst znajdujący się na etykiecie MojaEtykieta.

Wpisz odpowiedni kod:

  procedure TFormularzGlowny.Button1Click(Sender: TObject);
  begin
    MojaEtykieta.Caption:='Przycisk został wciśnięty!';
  end;

Zadaniem tej metody jest zmiana właściwości Caption obiektu o nazwie MojaEtykieta. Właściwość Caption jest typu string. W wyniku przypisania tekstu do tej właściwości powinien zmienić się tekst etykiety.

Uruchom program i sprawdź, czy rzeczywiście kliknięcie przycisku spowoduje zmianę tekstu na etykiecie (zmiana będzie tylko jednokrotna).

W ten sposób Twój program może reagować na różne zdarzenia. Zauważ, że to Twój program reaguje na kliknięcie przycisku, a nie sam przycisk! Jedną metodą możesz obsługiwać dowolną liczbę przycisków, po prostu przypisz ją do zdarzenia OnClick każdego pożądanego przycisku.

Spróbujmy: dodaj do formularza drugi przycisk (Button2). Wybierz ten przycisk i w Inspektorze Obiektów wskaż w zdarzeniu OnClick tego przycisku procedurę (metodę) Button1Click. Uruchom program: niezależnie od tego, który przycisk został wciśnięty, program reaguje jednakowo.

Załóżmy, że w zależności od tego, który przycisk jest kliknięty, ma pojawić się inny tekst. Jako parametr metody Button1Click przekazywany jest obiekt: Sender. Sender (nadawca) zawiera obiekt, który wysłał dany komunikat – w naszym przypadku może to być Button1 lub Button2. Wykorzystując tę zmienną, możemy uzależnić działanie programu od nadawcy.

Zmienna Sender jest typu TObject, a więc jest przodkiem TButton. Można dokonać rzutowania typów, analogicznie jak w języku C, aby wyciągnąć niezbędne dane. Konstrukcja:

TButton(Sender)

utworzy nam obiekt typu TButton, który zawiera wszystkie pola, które zawierają obydwa przyciski.

Utwórzmy sobie zmienną pomocniczą:

  procedure TFormularzGlowny.Button1Click(Sender: TObject);
  var
    but: TButton;
  begin
    but:=TButton(Sender);
    MojaEtykieta.Caption:='Przycisk został wciśnięty!';
  end;

Zmienna "but" ma wszystkie właściwości przycisku – w zależności od tego, który przycisk zostanie kliknięty, przyjmuje ona wartość właściwości formularza Button1 lub Button2.

Jak rozpoznać, który przycisk został wciśnięty? Najprościej po nazwie:

  procedure TFormularzGlowny.Button1Click(Sender: TObject);
  var
    but: TButton;
  begin
    but:=TButton(Sender); // tutaj rzutujemy Sender (nadawca zdarzenia) na typ TButton, by móc wyciągnąć właściwość Name''
    if but.Name='Button1' then // czy jest to pierwszy przycisk?
      MojaEtykieta.Caption:='Przycisk 1 został wciśnięty!';
    if but.Name='Button2' then // czy jest to drugi przycisk?
      MojaEtykieta.Caption:='Przycisk 2 został wciśnięty!';
  end;

W zależności od właściwości Name przycisku, program podejmie inną akcję. Uruchom i sprawdź, czy program działa tak, jak trzeba.

Generalnie, Twoje aplikacje mogą zawierać wiele przycisków. Obsługa wszystkich przycisków w jednej metodzie nie zawsze ma sens, a wprowadza tylko niepotrzebne zaciemnienie kodu. Każdy przycisk (lub ogólniej: komponent) może mieć przypisaną własną obsługę kliknięcia. Utwórz trzeci przycisk (Button3), przejdź do Inspektora Obiektu i kliknij dwukrotnie myszką na jego zdarzeniu OnClick, tak jak to robiłeś dla przycisku Button1. Jeśli spojrzysz teraz w cały kod, zauważysz, że Twój formularz ma dwie metody obsługi kliknięć przycisków: Button1Click oraz Button3Click. Button1Click jest obsługiwane przez przyciski Button1 i Button2, zaś Button3Click – przez przycisk Button3. Jeśli chcesz, możesz każdemu z przycisków przypisać dowolną metodę reagowania na to zdarzenie.

Każdy komponent ma jakieś domyślne zdarzenie. Zamiast szukać zdarzenia OnClick dla swojego przycisku, możesz go po prostu dwukrotnie kliknąć. Zobacz też, jakie zdarzenia ma etykieta (Label).

Pisanie programów w Delphi polega na tworzeniu obsługi zdarzeń, takich jak kliknięcia, wciskanie klawiszy, ruchy myszką itp.


« Poprzednia lekcjaSpis treściNastępna lekcja »