Zdarzenia i komunikaty
24.07.1999
  • Obsługa zdarzeń w czasie pracy programu.

Krok 1:

      Sprawdź, jakiego typu handler będziesz pisać. Handler OnClick jest typu TNotifyEvent. Zdarzenie OnIdle klasy TApplication jest typu TIdleEvent, i przekazuje dwa argumenty do swojego handlera. Możesz zawsze sprawdzić w pomocy programu, jakiego typu handler powinieneś stworzyć dla konkretnego zdarzenia. Dla OnIdle pomoc pokazuje:

__property TIdleEvent OnIdle;

Krok 2:

      Określ jakiego typu zmienną będzie zwracała funkcja (prawie zawsze jest to typ void) i jakie zmienne mają być przekazane do funkcji. Niestety tego nie znajdziesz w helpie. Dla zdarzeń, które mogą być tworzone w fazie projektowania (takich jak np. OnClick), możesz stworzyć fikcyjny handler, a potem wyciąć i wkleić deklaracje funkcji. Dla handlerów, które nie mogą być stworzone w fazie projektowania musisz zaglądać do plików dołączanych do programu.

      Typy handlerów TApplication znajdują się w pliku FORMS.HPP. Możesz tam zajrzeć, znajdź definicję typu TIdleEvent, powinno wyglądać to tak:

typedef void __fastcall (__closure *TIdleEvent)(System::TObject* Sender,
                                                            bool &Done);

To znaczy, że funkcja OnIdle powinna wyglądać następująco:

void __fastcall TForm1::AppIdle(System::TObject *Sender, bool &Done)

Krok 3:

      Dodaj deklarację funkcji do klasy obsługującej zdarzenie. Dla OnIdle będzie to wyglądać tak:

class TForm1 : public TForm
    {
        __published:	// IDE-managed Components
        private:	// User declarations
        void __fastcall AppIdle(System::TObject *Sender, bool &Done);

Krok 4:

      Wpisz kod funkcji.

void __fastcall TForm1::AppIdle(System::TObject *Sender, bool &Done)
    {
        // Tutaj wpisz ciało funkcji
    }

Krok 5:

      I wreszcie to, na co czekałeś. Aby skojarzyć swój handler ze zdarzeniem, musisz przypisać nazwę funkcji do handlera. Najdogodniejszym miejscem aby to uczynić jest wnętrze konstruktora klasy, która zawiera funkcję obsługującą zdarzenie.

__fastcall TForm1::TForm1(TComponent* Owner)
          : TForm(Owner)
    {
        Application->OnIdle = AppIdle;
    }

      Zauważ, że nie ma to nic wymyślnego. Po prostu przypisujesz nazwę funkcji do handlera. Nie przypisuj adresu funkcji do handlera.