Ereignissteuerung 4

Wir werfen zuerst noch einmal einen Blick auf die bisherige Klassenstruktur und Aufgabenverteilung:

Hier gibt es noch einen Kritikpunkt: In der Klasse TEreignisanwendung sollten alle diejenigen Aufgaben durchgeführt werden, die für alle Anwendungen in gleicher Weise durchzuführen sind. Das Verteilen von Ereignissen an die Knöpfe, das im jetzigen Entwicklungsstand noch von der Mühlenanwendung durchgeführt wird, gehört eigentlich auch zu diesen Aufgaben. Also ergibt sich das Ziel, diese Verteilung in die Klasse TEreignisanwendung zu verschieben.

Als Problem stellt sich natürlich dar, dass die Knöpfe erst durch die init-Methode der KLasse TMuehlenanwendung erzeugt werden. Die Klasse TEreignisanwendung weiß also noch gar nicht, an welche Knöpfe die Aufträge zu verschicken sind. 

Als eine mögliche Lösung bietet sich an, die Knöpfe genauso wie die Mühlen miteinander zu verketten. Dann reicht es aus, dem ersten Knopf einen Auftrag zu senden. Dieser wird dann von den verketteten Knöpfen selbständig an alle anderen Knöpfe weitergeleitet. In der Klasse TEreignisanwendung ist dann ein erster Knopf zu erzeugen. Wir wählen hierfür den Ende-Knopf, da jede Anwendung einen solchen Knopf benötigt. 

Die Klasse TEreignisKnopf ändert sich hiermit zu: 

Zur Verkettung benötigt man wie bei den Mühlen das Attribut 'kenntNaechstenKnopf' und die Methode 'HaengeAn( pKnopf: TEreignisknopf)' . Bei den bearbeite Maus-Methoden ist dann am Ende das Weiterleiten an die anderen Knöpfe sicherzustellen:
Weiterleiten von BearbeiteMausDoppelklick:

Hier 
der
'normale'
Code
der
Prozedur






Hier das Weiterleiten
an die anderen Knöpfe
procedure TEreignisKnopf.bearbeiteMausDoppelKlick(pX,pY:Zahl);
begin
if zAktiv then
      begin
         if innerhalb(pX,pY) then
            begin
               anzeige('Doppelklick : '+self.zAufschrift,600,300);
            end;
         loesche;
         zWurdeGedrueckt := Falsch;
         zMausWarOben := Wahr;
         zeichne;
         anzeige('Gedrueckt : ---',600,100)
      end;
   if kenntNaechstenKnopf <> nil
     then kenntNaechstenKnopf.bearbeiteMausDoppelklick(pX,pY)
end;


In der Klasse TEreignisanwendung sind die Verteilungsmethoden wie bearbeiteMausDoppelklick einzubauen. Diese können privat bleiben. 
Ferner hat diese Klasse nun den Ende Knopf:

Hier noch einige Anmerkungen zum Code einiger Methoden:

Anmerkungen zum Code von TEreignisanwendung:

Neben den immer
benötigten Objekten


wird auch der Ende-Knopf
erzeugt.
//-------- init (public) -----------------------------------------------
constructor TEreignisAnwendung.init;
begin
  derBildschirm := Bildschirm.init;
  dieMaus       := Maus.init;
  hatStift      := Stift.init;
  dieTastatur   := Tastatur.init;
  KEnde         := TRechteckknopf.init(310,450,80,'ENDE',dieMaus);
  KEnde.aktiviere;
end;				
Das Verteilen der Maus-Ereignisse
geschieht einfach durch einen
Auftrag an den ersten Knopf, 
nämlich den Ende-Knopf.
//-------- bearbeiteMausDoppelklick (private) --------------------------
procedure TEreignisAnwendung.bearbeiteMausDoppelklick;
begin
   KEnde.bearbeiteMausDoppelklick(dieMaus.hPosition, dieMaus.vPosition)
end;

Der Klasse TMuehlenanwendung verbleibt nur noch das Erzeugen der Knöpfe mit Aktivieren und Verketten sowie die Leerlaufmethode:

 

Auch hier ein paar Hinweise zum Code:

Anmerkungen zum Code von TMuehlenanwendung:

N



Erzeugen der Knöpfe




Verketten der Knöpfe
durch Anhöngen
an den ersten Knopf.


Aktivieren und Deaktivieren
der Knöpfe



Erzeugen weiterer Objekte
der speziellen Anwendung
/-------- init (public) -----------------------------------------------
constructor TMuehlenAnwendung.init;
begin
  inherited init;

  KSchneller    := TKreisknopf.init(100,400,10,'+',dieMaus);
  KStop         := TKreisknopf.init(150,400,10,'|||',dieMaus);
  KLangsamer    := TKreisknopf.init(200,400,10,'-',dieMaus);
  KneueMuehle   := TRechteckknopf.init(300,400,100,'NEUE MÜHLE',dieMaus);

  KEnde.HaengeAn(KSchneller);
  KEnde.HaengeAn(KStop);
  KEnde.HaengeAn(KLangsamer);
  KEnde.HaengeAn(KneueMuehle);

   KSchneller.aktiviere;
   KLangsamer.aktiviere;
   KStop.aktiviere;
   KneueMuehle.aktiviere;

  dieUhr        := Uhr.init;
  Muehle1       := TMuehle.init(150,300,150,3,rot);
  neueMuehle    := TMuehle.init(300,200,120,2,blau);
  Muehle1.haengeAn(neueMuehle);
end;
		
Das Verteilen der Maus-Ereignisse
geschieht einfach durch einen
Auftrag an den ersten Knopf, 
nämlich den Ende-Knopf.
//-------- bearbeiteMausDoppelklick (private) --------------------------
procedure TEreignisAnwendung.bearbeiteMausDoppelklick;
begin
   KEnde.bearbeiteMausDoppelklick(dieMaus.hPosition, dieMaus.vPosition)
end;




Zum jetzt erreichten Entwicklungsstand gibt es wieder ein Projekt : Knopf_Muehle_11_nur_Verkettung.  Es kann hier heruntergeladen werden.