Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort zur 6. Auflage
1 Allgemeine Einführung in .NET
2 Grundlagen der Sprache C#
3 Das Klassendesign
4 Vererbung, Polymorphie und Interfaces
5 Delegates und Ereignisse
6 Strukturen und Enumerationen
7 Fehlerbehandlung und Debugging
8 Auflistungsklassen (Collections)
9 Generics – Generische Datentypen
10 Weitere C#-Sprachfeatures
11 LINQ
12 Arbeiten mit Dateien und Streams
13 Binäre Serialisierung
14 XML
15 Multithreading und die Task Parallel Library (TPL)
16 Einige wichtige .NET-Klassen
17 Projektmanagement und Visual Studio 2012
18 Einführung in die WPF und XAML
19 WPF-Layout-Container
20 Fenster in der WPF
21 WPF-Steuerelemente
22 Elementbindungen
23 Konzepte von WPF
24 Datenbindung
25 Weitere Möglichkeiten der Datenbindung
26 Dependency Properties
27 Ereignisse in der WPF
28 WPF-Commands
29 Benutzerdefinierte Controls
30 2D-Grafik
31 ADO.NET – Verbindungsorientierte Objekte
32 ADO.NET – Das Command-Objekt
33 ADO.NET – Der SqlDataAdapter
34 ADO.NET – Daten im lokalen Speicher
35 ADO.NET – Aktualisieren der Datenbank
36 Stark typisierte DataSets
37 Einführung in das ADO.NET Entity Framework
38 Datenabfragen des Entity Data Models (EDM)
39 Entitätsaktualisierung und Zustandsverwaltung
40 Konflikte behandeln
41 Plain Old CLR Objects (POCOs)
Stichwort

Download:
- Beispiele, ca. 62,4 MB

Buch bestellen
Ihre Meinung?

Spacer
Visual C# 2012 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual C# 2012

Visual C# 2012
Rheinwerk Computing
1402 S., 6., aktualisierte und erweiterte Auflage 2013, geb., mit DVD
49,90 Euro, ISBN 978-3-8362-1997-6
Pfeil 5 Delegates und Ereignisse
Pfeil 5.1 Delegates
Pfeil 5.1.1 Einführung in das Prinzip der Delegates
Pfeil 5.1.2 Verwendung von Delegates
Pfeil 5.1.3 Vereinfachter Delegatenaufruf
Pfeil 5.1.4 Multicast-Delegates
Pfeil 5.1.5 Anonyme Methoden
Pfeil 5.1.6 Kovarianz und Kontravarianz mit Delegaten
Pfeil 5.2 Ereignisse eines Objekts
Pfeil 5.2.1 Ereignisse bereitstellen
Pfeil 5.2.2 Die Reaktion auf ein ausgelöstes Ereignis
Pfeil 5.2.3 Allgemeine Betrachtungen der Ereignishandler-Registrierung
Pfeil 5.2.4 Wenn der Ereignisempfänger ein Ereignis nicht behandelt
Pfeil 5.2.5 Ereignisse mit Übergabeparameter
Pfeil 5.2.6 Ereignisse in der Vererbung
Pfeil 5.2.7 Hinter die Kulissen des Schlüsselworts »event« geblickt
Pfeil 5.2.8 Die Schnittstelle »INotifyPropertyChanged«
Pfeil 5.3 Änderungen im Projekt »GeometricObjects«
Pfeil 5.3.1 Überarbeitung des Events »InvalidMeasure«
Pfeil 5.3.2 Weitere Ereignisse

Galileo Computing - Zum Seitenanfang

5.3 Änderungen im Projekt »GeometricObjects«Zur nächsten Überschrift


Galileo Computing - Zum Seitenanfang

5.3.1 Überarbeitung des Events »InvalidMeasure«Zur nächsten ÜberschriftZur vorigen Überschrift

In Abschnitt 5.2 wurde das Ereignis InvalidMeasure in der Klasse Circle eingeführt. Eine inakzeptable Wertzuweisung kann natürlich auch die beiden Eigenschaften Length und Width der Klasse Rectangle betreffen. Wir sollten daher das Ereignis in der Basisklasse GeometricObject bereitstellen, einschließlich der entsprechenden OnXxx-Methode.

Nun könnte es natürlich sein, dass den Benutzer einer der von GeometricObject abgeleiteten Klassen interessiert, welche Eigenschaft von der Ablehnung der Zuweisung betroffen ist. Um auch diese Information zu liefern, wollen wir die Klasse InvalidMeasureEventArgs um eine Eigenschaft vom Typ string ergänzen, in der der Bezeichner der betroffenen Eigenschaft angegeben wird. Falls der Name der fehlerverursachenden Eigenschaft nicht ausdrücklich namentlich angegeben oder null übergeben wird, soll bei einer Auswertung von PropertyName die Ausgabe [unknown] erfolgen.

Nach diesen Vorgaben sieht der Code in der Klasse InvalidMeasureEventArgs wie folgt aus:

public class InvalidMeasureEventArgs : EventArgs {

// Felder

private int _InvalidMeasure;
private string _PropertyName;

// Eigenschaften

public int InvalidMeasure {
get { return _InvalidMeasure; }
}

public string PropertyName {
get { return _PropertyName; }
}

// Konstruktor

public InvalidMeasureEventArgs(int invalidMeasure, string propertyName) {
_InvalidMeasure = invalidMeasure;
if (propertyName == "" || propertyName == null)
_PropertyName = "[unknown]";
else
_PropertyName = propertyName;
}
}

Listing 5.27 Die Definition der Klasse »InvalidMeasureEventArgs«

Natürlich müssen Sie diese Erweiterung auch in den Eigenschaften Radius, Width und Length berücksichtigen.


Galileo Computing - Zum Seitenanfang

5.3.2 Weitere EreignisseZur vorigen Überschrift

Das Ereignis InvalidMeasure ist eher untypisch, weil es im Fehlerfall ausgelöst wird (später werden wir diese Stelle im Programm auch noch viel besser codieren). Nun wollen wir unser Projekt auch um zwei sehr typische Ereignisse erweitern, die in der Methode Move ausgelöst werden sollen. Es sind die Ereignisse Moving (wird ausgelöst vor der eigentlichen Verschiebung) und Moved (wird ausgelöst nach erfolgter Verschiebung). Solche Ereignispärchen treten häufig im .NET Framework auf und entsprechen in ihrem Verhalten immer demselben Muster. Werden die Xxxing-Ereignisse abonniert, besteht die Möglichkeit, die eingeleitete Operation im buchstäblich letzten Moment doch noch abzubrechen. Üblicherweise stellt das EventArgs-Objekt dieser Ereignisse dazu eine Eigenschaft namens Cancel bereit, die in der Ereignisquelle nach der Eventauslösung ausgewertet werden muss. Zum Abbrechen der Operation muss der Ereignisempfänger Cancel nur auf true setzen.

public class MovingEventArgs : EventArgs
{
public bool Cancel { get; set; }
}

Listing 5.28 Die Klasse »MovingEventArgs«

MovingEventArgs ist sehr einfach implementiert. Da die Eigenschaft Cancel im Ereignishandler unter Umständen einen neuen Wert erhält, der ausgewertet werden muss, genügt uns die einfache Deklaration einer booleschen Variablen.

Das Moved-Ereignis, das nach der Verschiebeoperation ausgelöst wird, dient nur dazu, dem Benutzer die Möglichkeit zu eröffnen, nach der Verschiebung nach eigenem Ermessen zusätzliche Operationen zu codieren. Das EventArgs-Objekt soll selbst keine weiteren, zusätzlichen Daten bereitstellen. Daher können wir direkt auf die Klasse EventArgs zurückgreifen.

Mit diesen Überlegungen lassen sich die beiden notwendigen Delegates beschreiben.

public delegate void MovingEventHandler(Object sender, MovingEventArgs e);

public delegate void MovedEventHandler(Object sender, EventArgs e);

Listing 5.29 Zusätzliche Delegaten im Projekt »GeometricObjects«

In der Klasse GeometricObject ist die Move-Methode definiert, in der die beiden Ereignisse Moving und Moved ausgelöst werden sollen. Folglich gilt es, in dieser Klasse die beiden Ereignisse zu definieren. Dazu gehören auch die entsprechenden geschützten Methoden, die die Ereignisauslösung kapseln.

Move wird um den Code ergänzt, der prüft, ob der Anwender die eingeleitete Verschiebung des Bezugspunktes abbrechen möchte. Dazu wird die Eigenschaft Cancel des MovingEventArgs-Objekts untersucht. Hat der Benutzer mit true kundgetan, doch nicht zu verschieben, wird Move mit return beendet.

public abstract class GeometricObject {

// Ereignisse

public event MovingEventHandler Moving;
public event MovedEventHandler Moved;

// Geschützte Methoden

protected virtual void OnMoving(MovingEventArgs e){
if (Moving != null)
Moving(this, e);

}

protected virtual void OnMoved(EventArgs e){
if (Moved != null)
Moved(this, e);
}

public virtual void Move(double dx, double dy){

// Moving-Ereignis

MovingEventArgs e = new MovingEventArgs();
OnMoving(e);
if (e.Cancel == true) return;
XCoordinate += dx;
YCoordinate += dy;

// Moved-Ereignis

OnMoved(new EventArgs());
}
[...]
}

Listing 5.30 Ergänzung der Klasse »GeometricObject«

Damit sind wir aber noch nicht fertig. Wir müssen uns noch einmal die Überladung der Methode Move in Circle genau ansehen, die momentan immer noch wie folgt implementiert ist:

public virtual void Move(double dx, double dy, int dRadius)
{
Move(dx, dy);
Radius += dRadius;
}

Beim Aufruf von Move in der ersten Anweisung könnte die eingeleitete Verschiebung noch abgebrochen werden. Das wird auch gemacht, aber nur halbherzig. Denn die Bezugskoordinaten werden zwar in X- und Y-Richtung nicht verschoben, aber der Radius wird trotzdem geändert, weil die zweite Anweisung in der dreifach parametrisierten Move-Methode keine Kenntnis vom Abbruch der Operation bekommt. Besser wäre es stattdessen, den Aufruf der zweifach parametrisierten Methode durch die vollständige Implementierung zu ersetzen:

public virtual void Move(double dx, double dy, int dRadius) {
MovingEventArgs e = new MovingEventArgs();

// Moving-Ereignis auslösen

OnMoving(e);
if (e.Cancel == true) return;
XCoordinate += dx;
YCoordinate += dy;
Radius += dRadius;

// Moved-Ereignis auslösen

OnMoved(new EventArgs());
}

Listing 5.31 Änderung der überladenen »Move«-Methode

In gleicher Weise muss auch die vierfach parametrisierte Move-Methode in Rectangle angepasst werden.

Sie finden den kompletten Code des überarbeiteten Beispiels auf der Buch-DVD unter
\Beispiele\
Kapitel 5\GeometricObjectsSolution_6.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
<< zurück
  Zum Katalog
Zum Katalog: Visual C# 2012

Visual C# 2012
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Katalog: Windows Presentation Foundation






 Windows Presentation
 Foundation


Zum Katalog: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Katalog: C++ Handbuch






 C++ Handbuch


Zum Katalog: C/C++






 C/C++


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2013
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de