Ereignissteuerung 1

Zu dieser Seite gehört wiederum ein Projekt (Knopf_Muehle_7), das hier heruntergeladen werden kann.

In unserer Mühlenanwendung fragt das Anwendungsobjekt die Knöpfe ab, ob diese gedrückt bzw. angeklickt sind. Das Programm reagiert nur dann, wenn eines dieser Ereignisse eintrifft. Allerdings drehen sich die Mühlen immer, auch wenn kein Knopf gedrückt wurde.

Dieses Verhalten interpretieren wir ein wenig deutlicher: Unser Programm reagiert nur auf die Ereignisse : Maus heruntergedrückt und Maus losgelassen
Später werden wir auch die Ereignisse Maus doppelgeklickt und Tastatur gedrückt einbauen.

Um dieses Verhalten der Anwendung zu verdeutlichen ändern wir die Schleife der Methode run:

Methode run, alte Version (Projekt Knopf_Muehle_6)
Das Programm reagiert nur


Wenn der Stop-Knopf
         angeklickt ist




oder
Wenn der neueMuehle-Knopf
         angeklickt ist







oder
Wenn der schneller-Knopf
         gedrückt ist




oder
Wenn der langsamer-Knopf
         gedrückt ist


oder
Wenn der Ende-Knopf
         angeklickt ist
procedure TAnwendung.run;
begin
   repeat
         if KStop.angeklickt then begin
            Muehle1.stop;
            KStop.deaktiviere;
            KLangsamer.deaktiviere;
            KneueMuehle.aktiviere;
            KEnde.aktiviere;
         end
         else if KneueMuehle.angeklickt then begin
            neueMuehle := TMuehle.init(100+random(600),
                                      200+random(400),
                                      50+random(50),
                                      1+random(3),
                                      random(100));
            neueMuehle.setzeZufallsfarbe;
            neueMuehle.stop;
            Muehle1.haengean(neueMuehle);
         end
         else if KSchneller.gedrueckt then begin
            Muehle1.schneller;
            KLangsamer.aktiviere;
            KStop.aktiviere;
            KneueMuehle.deaktiviere;
            KEnde.Deaktiviere;
         end
         else if KLangsamer.gedrueckt then begin
            Muehle1.langsamer;
         end;
         muehle1.drehe;
         dieUhr.warte(1)
   until KEnde.angeklickt
end;

Da das Anklicken bedeutet, dass bei einem Knopf die Maus vorher innerhalb gedrückt wurde und nun innerhalb losgelassen wird, reagiert die Anwendung also nur auf die Ereignisse Maus ist unten - einfacher MausUnten- und Maus wurde wieder losgelassen - einfacher MausLosgelassen.
Damit stellt sich die Methode run einfacher dar:
Methode run, neue Version (Projekt Knopf_Muehle_7)



Immer, wenn die Maus gedrückt ist


Wird bearbeiteMausUnten aufgerufen.


Ist die Maus nicht gedrückt 
und war auch nicht  gedrückt,
    tritt das sog. Leerlaufereignis ein

BearbeiteMausLosgelassen wird immer aufgerufen;
wenn die Maus nicht gedrückt ist. Die Knöpfe sollen
selbst feststellen, ob sie losgelassen wurden


Diese Konstruktion zum Beenden der Schleife
ist noch verbesserungswürdig!
procedure TAnwendung.run;
begin
   zMausUnten := Falsch;
   repeat
      if dieMaus.istGedrueckt then
            begin
               zMausUnten := Wahr;
               bearbeiteMausUnten;
            end
         else // Maus ist nicht gedrueckt
            begin
               if not zMausUnten // und Maus war auch nicht gedrueckt
                  then bearbeiteLeerlauf;
               zMausUnten := Falsch;
               bearbeiteMausLosgelassen
            end



   until KEnde.angeklickt;
end;

Die Klasse TAnwendung benötigt natürlich nun die neuen Methoden

Diese entsprechen (fast) den entsprechenden Teilen der ersten run-Methode:

Die Ereinisbehandlungsmethoden der Anwendung.

Der Leerlauf besteht natürlich
aus dem Drehen der Mühlen
procedure TAnwendung.bearbeiteLeerlauf;
begin
   muehle1.drehe;
   dieUhr.warte(1)
end;



Der Auftrag wird nur an die erste Mühle erteilt. 
     Die anderen Mühlen reagieren durch Verketttung.
aktivieren und Deaktivieren von Knöpfen


Auch während der Schneller-Knopf gedrückt
wird, sollen sich die Mühlen drehen.




Auch während der Langsamer-Knopf gedrückt
wird, sollen sich die Mühlen drehen.
procedure TAnwendung.bearbeiteMausUnten;
begin
if KSchneller.gedrueckt then
   begin
     Muehle1.schneller;
     KLangsamer.aktiviere;
     KStop.aktiviere;
     KneueMuehle.deaktiviere;
     KEnde.Deaktiviere;
     bearbeiteLeerlauf
   end
else
   if KLangsamer.gedrueckt then
       begin
         Muehle1.langsamer;
         bearbeiteLeerlauf
       end;
end;



Auch hier wird der Auftrag nur der ersten Mühle erteilt.


Erst jetzt kann der Knopf für die neuen Mühlen
       gedrückt werden.







daher ist hier kein Leerlaufereignis nötig, 
    die Mühlen stehen sowieso.
procedure TAnwendung.bearbeiteMausLosgelassen;
begin
  if KStop.angeklickt then
     begin
        Muehle1.stop;
        KStop.deaktiviere;
        KLangsamer.deaktiviere;
        KneueMuehle.aktiviere;
        KEnde.aktiviere;
     end
  else
     if KneueMuehle.angeklickt then
        begin
          neueMuehle := TMuehle.init(100+random(600),
                                     200+random(400),
                                     50+random(50),
                                     1+random(3),
                                     random(100));
          neueMuehle.setzeZufallsfarbe;
          neueMuehle.stop;
          Muehle1.haengean(neueMuehle);
        end
end;

Zum Abschluss und zur Verdeutlichung hier ein Beziehungsdiagramm des Projektes: