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:
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:
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:
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.
![]() |
|
![]() |
![]() |
Zur nächsten Seite ![]() |
© 2003 LK 12 If und G. Kubitz | Hannah-Arendt-Gymnasium, Lengerich |