Delegaten. Ein erster Blick auf Delegaten

Größe: px
Ab Seite anzeigen:

Download "Delegaten. Ein erster Blick auf Delegaten"

Transkript

1 17 Delegaten 315 Ein erster Blick auf Delegaten 318 Rückrufe in statische Methoden 320 Rückrufe in Instanzmethoden 320 Delegaten enträtselt 324 System.Delegate und System.MulticastDelegate 325 Delegaten vergleichen 326 Delegatenketten 330 Einzelne Objekte einer Delegatenkette aufrufen 332 Delegaten und Reflektion In diesem Kapitel werden wir uns mit Rückruffunktionen (Callback Function) beschäftigen. Rückruffunktionen sind eine extrem leistungsfähige Programmiertechnik, die bereits seit etlichen Jahren im Einsatz ist. Das Microsoft.NET Framework stellt Rückruffunktionen in Form von Delegaten zur Verfügung. Im Unterschied zu Rückrufmechanismen auf anderen Plattformen (zum Beispiel in nicht verwaltetem C++) bieten Delegaten einen deutlich größeren Funktionsumfang. Zum Beispiel stellen Delegaten sicher, dass die Rückrufmethode typsicher ist; auf diese Weise verwirklichen die Delegaten eines der wichtigsten Ziele der Common Language Runtime. Delegaten bieten außerdem die Möglichkeit, mehrere Methoden nacheinander aufzurufen, und sie können sowohl statische Methoden als auch Instanzmethoden aufrufen. Ein erster Blick auf Delegaten Die Funktion qsort aus der C-Laufzeitbibliothek sortiert Elemente innerhalb eines Arrays; dazu übernimmt sie eine Rückruffunktion als Parameter. In Microsoft Windows werden Rückruffunktionen für Fensterfunktionen, Hook-Funktionen, asynchrone Funktionsaufrufe und etliche andere Einsatzzwecke benutzt. Im.NET Framework werden Rückrufmethoden für eine ganze Reihe von Aufgaben eingesetzt. Zum Beispiel können Sie Rückrufmethoden anmelden, um eine Vielzahl von Benachrichtigungen zu erhalten: über nicht abgefangene Ausnahmen, Änderungen am Zustand von Fenstern, Auswahl eines Menübefehls, Veränderungen im Dateisystem oder den Abschluss von asynchronen Operationen. 315

2 In nicht verwaltetem C/C++ ist die Adresse einer Funktion nichts anderes als eine normale Speicheradresse. Diese Adresse transportiert keinerlei ergänzende Informationen, etwa die Anzahl der Funktionsparameter, die Typen dieser Parameter, den Rückgabewert und die Aufrufkonvention der Funktion. Kurz gesagt: Rückruffunktionen in nicht verwaltetem C/C++ sind nicht typsicher. Im.NET Framework sind Rückruffunktionen genauso nützlich und allgegenwärtig wie in der nicht verwalteten Windows-Programmierung. Das.NET Framework stellt aber einen typsicheren Mechanismus namens Delegaten zur Verfügung. Als Einstieg in dieses Thema möchte ich Ihnen zeigen, wie Sie Delegaten benutzen. Das folgende Beispiel demonstriert, wie Sie Delegaten deklarieren, anlegen und einsetzen: Imports System Imports System.Windows.Forms Imports System.IO Class ItemSet Private items() As Object Public Sub New(ByVal numitems As Int32) ReDim items(numitems - 1) Dim i As Int32 For i = 0 To numitems - 1 items(i) = i Next Einen Typ namens Feedback definieren. HINWEIS: Dieser Typ ist in die Klasse ItemSet verschachtelt. Public Delegate Sub Feedback(ByVal value As Object, _ ByVal item As Int32, ByVal numitems As Int32) Public Sub ProcessItems(ByVal feedback As Feedback) Dim item As Int32 For item = 0 To items.length - 1 If Not feedback Is Nothing Then Falls irgendwelche Rückrufe eingetragen sind, aufrufen. feedback(items(item), item + 1, items.length) End If Next Class App Public Shared Sub Main() StaticCallbacks() InstanceCallbacks() Shared Sub StaticCallbacks() Ein ItemSet-Objekt mit fünf Elementen anlegen. Dim setofitems As New ItemSet(5) Die Elemente verarbeiten, aber keine Rückmeldung geben. setofitems.processitems(nothing) Console.WriteLine() Die Elemente verarbeiten, und Rückmeldungen auf der Konsole anzeigen. setofitems.processitems(new ItemSet.Feedback( _ AddressOf App.FeedbackToConsole)) 316 Kapitel 17

3 Console.WriteLine() Die Elemente verarbeiten, und Rückmeldungen in einem Meldungsfeld anzeigen. setofitems.processitems(new ItemSet.Feedback( _ AddressOf App.FeedbackToMsgBox)) Console.WriteLine() Die Elemente verarbeiten, und Rückmeldungen auf der Konsole UND in einem Meldungsfeld anzeigen. Dim fb As ItemSet.Feedback = Nothing fb = New ItemSet.Feedback(AddressOf App.FeedbackToConsole) fb = DirectCast( _ [Delegate].Combine(fb, _ New ItemSet.Feedback(AddressOf App.FeedbackToMsgBox)), _ ItemSet.Feedback) setofitems.processitems(fb) Console.WriteLine() Shared Sub FeedbackToConsole(ByVal value As Object, _ ByVal item As Int32, ByVal numitems As Int32) Console.WriteLine( Processing item {0} of {1}: {2}.", _ item, numitems, value) Shared Sub FeedbackToMsgBox(ByVal value As Object, _ ByVal item As Int32, ByVal numitems As Int32) MessageBox.Show(String.Format( Processing item {0} of {1}: {2}.", _ item, numitems, value)) Shared Sub InstanceCallbacks() Eine Gruppe mit fünf Elementen anlegen. Dim setofitems As New ItemSet(5) Die Elemente verarbeiten, und Rückmeldungen in eine Datei schreiben. Dim appobj As New App() setofitems.processitems( _ New ItemSet.Feedback(AddressOf appobj.feedbacktofile)) Console.WriteLine() Sub FeedbackToFile(ByVal value As Object, ByVal item As Int32, _ ByVal numitems As Int32) Dim sw As New StreamWriter( Status", True) sw.writeline( Processing item {0} of {1}: {2}.", item, numitems, value) sw.close() Am Anfang dieses Codebeispiels wird die Klasse ItemSet definiert. Nehmen wir an, diese Klasse enthält eine Gruppe von Elementen, die einzeln verarbeitet werden. Beim Anlegen eines ItemSet- Objekts übergeben Sie dem Konstruktor die Anzahl der Elemente, die dieses Objekt verwalten soll. Der Konstruktor erstellt daraufhin ein Array mit Object-Elementen und initialisiert jedes Objekt mit einem Integerwert. Die Klasse ItemSet definiert einen öffentlichen Delegaten: Feedback. Der Delegat legt die Signatur einer Rückrufmethode fest. In diesem Beispiel steht ein Feedback-Delegat für eine Sub-Methode, die drei Parameter hat (ein Object und zwei Int32). Delegaten 317

4 ItemSet definiert eine öffentliche Methode namens ProcessItems. Diese Methode hat einen Parameter, feedback, der ein Verweis auf ein Feedback-Delegatobjekt ist. ProcessItems geht in einer Schleife über alle Elemente des Arrays und ruft für jedes Element die Rückrufmethode auf, die in dem Parameter feedback definiert ist. Diese Rückrufmethode bekommt den Wert des verarbeiteten Elements, die Nummer des Elements und die Anzahl aller Elemente innerhalb des Arrays übergeben. Die Rückrufmethode kann jedes Element nach Belieben verarbeiten. Rückrufe in statische Methoden Nachdem Sie jetzt wissen, wie der Typ ItemSet aufgebaut ist und wie er funktioniert, wollen wir mit Hilfe von Delegaten statische (Shared) Methoden zurückrufen. Die Methode StaticCallbacks aus dem letzten Codestück soll uns dabei als Beispiel dienen. Die Methode StaticCallbacks legt ein ItemSet-Objekt an und lässt es ein Array mit fünf Elementen erstellen. Dann ruft sie ProcessItems auf, wobei sie der Methode für den Parameter feedback den Wert Nothing übergibt. ProcessItems ist eine Methode, die alle Elemente, die von dem ItemSet- Objekt verwaltet werden, in geeigneter Weise verarbeitet. Weil in diesem Beispiel der Parameter feedback den Wert Nothing hat, wird jedes Element verarbeitet, ohne dass irgendeine Rückrufmethode aufgerufen wird. Beim zweiten Aufruf von ProcessItems wird ein neues ItemSet.Feedback-Delegatobjekt angelegt. Dieses Delegatobjekt ist ein Wrapper um eine Methode. Es ermöglicht, dass die Methode indirekt über den Wrapper aufgerufen werden kann. Der Konstruktor des Typs Feedback bekommt den Operator AddressOf, gefolgt vom Namen einer statischen Methode übergeben, in diesem Beispiel ist das App.FeedbackToConsole; dies ist die Methode, für die der Delegat einen Wrapper bilden soll. Der vom Operator New zurückgelieferte Verweis wird an ProcessItems übergeben. Wird nun ProcessItems ausgeführt, ruft die Methode für jedes Element die statische Methode FeedbackToConsole des Typs App auf. FeedbackToConsole schreibt einfach einen String in das Konsolenfenster, der anzeigt, welches Element verarbeitet wird und welchen Wert es hat. Visual Basic unterstützt daneben eine kürzere Syntax zum Erstellen eines Delegaten: Statt explizit den Konstruktor des Delegaten aufzurufen, können Sie einfach den Operator AddressOf und den Namen der Zielmethode angeben. Der folgende Code zeigt ein Beispiel: Die beiden nächsten Anweisungen haben dasselbe Ergebnis. setofitems.processitems(new ItemSet.Feedback(AddressOf App.FeedbackToMsgBox)) setofitems.processitems(addressof App.FeedbackToConsole) Die beiden nächsten Anweisungen haben dasselbe Ergebnis. fb = DirectCast([Delegate].Combine(fb, New ItemSet.Feedback( _ AddressOf App.FeedbackToMsgBox)), ItemSet.Feedback) fb = DirectCast([Delegate].Combine(fb, _ AddressOf App.FeedbackToMsgBox), ItemSet.Feedback) Der Visual Basic-Compiler generiert immer denselben IL-Code (Intermediate Language), egal ob Sie die lange oder die abgekürzte Delegatensyntax benutzen. Der erzeugte IL-Code legt immer eine Instanz der Delegatklasse an, die einen Wrapper um die angegebene Methode bildet. Weil der generierte IL-Code in beiden Fällen identisch ist, bietet die abgekürzte Syntax keine bessere Effizienz als die lange Syntax. In diesem Buch werde ich ausschließlich die lange Syntax benutzen, weil sie deutlich wiedergibt, was in Wirklichkeit passiert. Das wird Ihnen helfen, die Common Language Runtime (CLR) besser zu verstehen. 318 Kapitel 17

5 HINWEIS: Die Methode FeedbackToConsole ist innerhalb des Typs App als Private definiert. Trotzdem kann die Methode ProcessItems des Typs ItemSet diese private Methode aufrufen. Das stellt kein Sicherheitsproblem dar, weil der Code von App explizit entschieden hat, einen Delegatwrapper für eine private Methode zurückzugeben. Der dritte Aufruf von ProcessItems läuft fast genauso ab wie der zweite. Der einzige Unterschied ist, dass diesmal das Feedback-Delegatobjekt einen Wrapper um die statische Methode App.FeedbackToMsgBox bildet. FeedbackToMsgBox erstellt einen String, der angibt, welches Element verarbeitet wird und welchen Wert es hat. Diesen String zeigt die Methode dann in einem Meldungsfeld an. Der vierte und letzte Aufruf von ProcessItems zeigt, wie Sie Delegaten zu einer Kette verbinden können. In diesem Beispiel wird die Verweisvariable fb angelegt, die auf ein Feedback-Delegatobjekt zeigt; die Variable wird mit dem Wert Nothing initialisiert. fb zeigt auf den Anfang einer verknüpften Liste mit Delegaten. Der Wert Nothing bedeutet, dass sich keine Einträge in der verknüpften Liste befinden. Anschließend wird ein Feedback-Delegatobjekt angelegt, das einen Wrapper für die Methode FeedbackToConsole des Typs App bildet. Die Variable fb zeigt jetzt auf den Anfang der verknüpften Liste. Schließlich wird ein weiteres Feedback-Delegatobjekt angelegt, das einen Wrapper für die Methode FeedbackToMsgBox des Typs App bildet. Ein neuer Delegat wird mit der statischen Methode Combine des Typs System.Delegate an die verknüpfte Liste angehängt; fb zeigt auf den neuen Anfang der verknüpften Liste. Wird nun ProcessItems aufgerufen, bekommt die Methode einen Verweis auf den Anfang der verknüpften Liste mit Feedback-Delegaten übergeben. Die Codezeile innerhalb von ProcessItems, mit der die Rückrufmethode aufgerufen wird, bewirkt diesmal, dass alle die Rückrufmethoden aufgerufen werden, für die in der verknüpften Liste Delegatobjekte gespeichert sind. Oder anders ausgedrückt: Für jedes verarbeitete Element werden erst FeedbackTo- Console und dann FeedbackToMsgBox aufgerufen. Wie eine Delegatenkette genau funktioniert, werde ich weiter unten in diesem Kapitel erklären. Alles in diesem Beispiel ist typsicher. Wenn Sie zum Beispiel ein Feedback-Delegatobjekt anlegen, stellt der Compiler sicher, dass die Methoden FeedbackToConsole und FeedbackToMsgBox des Typs App genau dem Prototyp entsprechen, den der Delegat Feedback definiert; beide Methoden müssen also drei Parameter haben (ein Object und zwei Int32), und beide müssen Sub-Methoden sein, das heißt, sie dürfen kein Ergebnis zurückliefern (in C# heißt das: Sie müssen den Rückgabewert void liefern). Was wäre passiert, wenn Sie FeedbackToConsole folgendermaßen definiert hätten? Shared Sub FeedbackToConsole(ByVal value As Object, _ ByVal item As Int32, ByVal numitems As Int32, ByVal s As String) In diesem Fall hätte der Visual Basic-Compiler den Code nicht übersetzt, sondern eine Fehlermeldung angezeigt:»error BC30408: Die Methode 'Public Shared Sub FeedbackToConsole(value As Object, item As Integer, numitems As Integer, s As String)' hat nicht die gleiche Signatur wie der Delegat 'Delegate Sub Feedback(value As Object, item As Integer, numitems As Integer)'. Delegaten 319

6 Rückrufe in Instanzmethoden In den bisherigen Codebeispielen habe ich gezeigt, wie Sie mit Hilfe von Delegaten statische Methoden zurückrufen. Sie können mit Delegaten auch Instanzmethoden eines bestimmten Objekts aufrufen. Sehen wir uns dazu die Methode InstanceCallbacks aus dem letzten Beispiel an: Shared Sub InstanceCallbacks() Eine Gruppe mit fünf Elementen anlegen. Dim setofitems As New ItemSet(5) Die Elemente verarbeiten, und Rückmeldungen in eine Datei schreiben. Dim appobj As New App() setofitems.processitems( _ New ItemSet.Feedback (AddressOf appobj.feedbacktofile)) Console.WriteLine() Beachten Sie, dass ein App-Objekt angelegt wird, nachdem das ItemSet-Objekt erstellt wurde. Dieses App-Objekt besitzt keine Felder oder Eigenschaften; ich habe es lediglich als Anschauungsobjekt entwickelt. Wenn das neue Feedback-Delegatobjekt angelegt wird, bekommt sein Konstruktor appobj.feedbacktofile übergeben. Daraufhin bildet der Delegat einen Wrapper um den Verweis auf die Methode FeedbackToFile; und FeedbackToFile ist eine Instanzmethode (keine statische Methode). Beim Aufruf dieser Instanzmethode verweist appobj auf das Objekt, mit dem die Methode arbeiten soll (über den verborgenen Parameter Me). Die Methode FeedbackToFile funktioniert ähnlich wie FeedbackToConsole und FeedbackToMsgBox, sie öffnet aber eine Datei und hängt den String mit der Verarbeitungsmeldung an das Ende dieser Datei an. Dieses Beispiel soll zeigen, dass Delegaten sowohl für Aufrufe von Instanzmethoden als auch für Aufrufe von statischen Methoden Wrapper bilden können. Für Instanzmethoden muss der Delegat wissen, mit welcher Objektinstanz die Methode arbeiten soll. Delegaten enträtselt Delegaten sind einfach zu benutzen: Sie definieren sie mit dem Visual Basic-Schlüsselwort Delegate, legen mit dem Operator New eine Instanz an und führen den Rückruf aus, indem Sie die gewohnte Syntax zum Aufruf einer Methode verwenden (Sie geben lediglich statt eines Methodennamens die Variable an, die auf das Delegatobjekt verweist). Unter der Oberfläche geht es aber deutlich komplexer zu, als die bisherigen Beispiele vermuten lassen. Compiler und Common Language Runtime (CLR) sorgen durch aufwendige Verarbeitung dafür, dass die Komplexität verborgen bleibt. In diesem Abschnitt möchte ich erklären, wie Compiler und CLR durch ihre Zusammenarbeit Delegaten implementieren. Dieses Wissen wird Ihnen helfen, Delegaten zu verstehen und sie effizient einzusetzen. Ich werde im Lauf dieses Abschnitts auch einige zusätzliche Fähigkeiten beschreiben, die Delegaten zur Verfügung stellen. Beginnen wir damit, dass wir uns die folgende Codezeile nochmals genauer ansehen: Public Delegate Sub Feedback(ByVal value As Object, _ ByVal item As Int32, ByVal numitems As Int32) Wenn der Compiler diese Zeile verarbeitet, definiert er eine vollständige Klasse, die etwa so aussieht: 320 Kapitel 17

7 Public Class Feedback Inherits System.MulticastDelegate Konstruktor Public Sub New(ByVal target As Object, ByVal methodptr As Int32) Methode mit demselben Prototyp wie im Quellcode festgelegt Public Overridable Sub Invoke(ByVal value As Object, _ ByVal item As Int32, ByVal numitems As Int32) Methoden für den asynchronen Aufruf des Rückrufs Public Overridable BeginInvoke(ByVal value As Object, _ ByVal item As Int32, ByVal numitems As Int32, _ ByVal callback As AsyncCallback, ByVal object As Object) _ As IAsyncResult Public Overridable Sub EndInvoke(result As IAsyncResult) Die vom Compiler definierte Klasse hat vier Methoden: einen Konstruktor, Invoke, BeginInvoke und EndInvoke. In diesem Kapitel werden wir uns auf den Konstruktor und die Invoke-Methoden konzentrieren. Sie können sich selbst davon überzeugen, dass der Compiler diese Klasse automatisch generiert hat. Sie brauchen das erstellte Modul nur in ILDasm.exe zu laden (Abbildung 17.1). Abbildung 17.1: ILDasm.exe zeigt die Metadaten, die der Compiler für den Delegaten generiert hat. In diesem Beispiel hat der Compiler eine Klasse namens Feedback definiert; diese Klasse ist von dem Typ System.MulticastDelegate abgeleitet, der in der.net Framework Class Library (FCL) definiert ist. (Alle Delegattypen sind von MulticastDelegate abgeleitet.) Die Klasse ist öffentlich, weil der Delegat im Quellcode als Public deklariert ist. Wäre der Delegat im Quellcode mit Private oder Protected gekennzeichnet, würde der Compiler auch die Klasse Feedback als privat beziehungsweise geschützt definieren. Sie können Delegattypen entweder innerhalb einer Klasse Delegaten 321

8 (in diesem Beispiel ist Feedback innerhalb der Klasse ItemSet definiert) oder global definieren. Da Delegaten Klassen sind, können sie überall dort definiert werden, wo auch eine Klasse definiert werden darf. Da alle Delegattypen von MulticastDelegate abgeleitet sind, erben sie die Felder, Eigenschaften und Methoden dieses Typs. Von diesen Membern sind drei private Felder besonders wichtig. Tabelle 17.1 beschreibt diese Felder. Feld Typ Beschreibung _target System.Object Verweist auf das Objekt, mit dem gearbeitet werden soll, wenn die Rückrufmethode aufgerufen wird. Dieses Feld wird für Rückrufe von Instanzmethoden verwendet. _methodptr System.Int32 Ein interner Integer, mit dem die CLR die Rückrufmethode findet, die aufgerufen werden soll. _prev System.MulticastDelegate Verweist auf ein anderes Delegatobjekt. Dieses Feld ist meist Nothing. Tabelle 17.1: Wichtige private Felder von MulticastDelegate Alle Delegaten haben einen Konstruktor mit zwei Parametern: einem Verweis auf ein Objekt und einem Integer, der die Rückrufmethode identifiziert. Wenn Sie sich den Quellcode ansehen, stellen Sie allerdings fest, dass ich Werte wie AddressOf App.FeedbackToConsole oder AddressOf appobj.feedbacktofile übergebe. Wie Sie sich vorstellen können, weiß der Compiler, dass ein Delegat angelegt wird, und ermittelt aus dem Quellcode, auf welches Objekt und auf welche Methode verwiesen wird. Im Parameter target übergibt er einen Verweis auf das Objekt und im Parameter methodptr einen speziellen Int32-Wert; dieser Int32-Wert (ermittelt aus einem Metadatentoken in MethodDef oder MethodRef) identifiziert die Methode. Bei statischen Methoden wird im Parameter target der Wert Nothing übergeben. Der Konstruktor speichert die beiden Parameter in den entsprechenden privaten Feldern. Der Konstruktor trägt außerdem den Wert Nothing in das Feld _prev ein. Dieses Feld wird verwendet, um eine verknüpfte Liste mit MulticastDelegate-Objekten zu verwalten. Ich werde das Feld vorerst ignorieren, weiter unten, im Abschnitt»Delegatenketten«, komme ich wieder darauf zurück. Jedes Delegatobjekt ist also ein Wrapper um eine Methode und ein Objekt, mit dem beim Aufruf der Methode gearbeitet wird. Die Klasse MulticastDelegate definiert zwei schreibgeschützte, öffentliche Instanzeigenschaften: Target und Method. Wenn Sie über einen Verweis auf ein Delegatobjekt verfügen, können Sie diese Eigenschaften auslesen. Die Eigenschaft Target gibt einen Verweis auf das Objekt zurück, mit dem gearbeitet wird, wenn die Methode aufgerufen wird. Falls es sich um eine statische Methode handelt, liefert Target den Wert Nothing. Die Eigenschaft Method gibt ein System.Reflection.MethodInfo-Objekt zurück, das die Rückrufmethode identifiziert. Sie können diese Informationen für diverse Zwecke auswerten. Zum Beispiel können Sie prüfen, ob ein Delegatobjekt auf die Instanzmethode eines bestimmten Typs verweist: Function DelegateRefersToInstanceMethodOfType( _ ByVal d As MulticastDelegate, ByVal type As Type) As Boolean Return Not (d.target Is Nothing) AndAlso d.target.gettype Is type End Function 322 Kapitel 17

9 Oder Sie können feststellen, ob die Rückrufmethode einen bestimmten Namen hat (zum Beispiel FeedbackToMsgBox): Function DelegateRefersToMethodOfName(ByVal d As MulticastDelegate, _ ByVal methodname As String) As Boolean Return (d.method.name = methodname) End Function Sie wissen jetzt, wie Delegatobjekte aufgebaut sind. Nun wollen wir untersuchen, auf welche Weise die Rückrufmethode aufgerufen wird. Sehen wir uns dazu nochmals die Methode Process- Items des Typs ItemSet an: Public Sub ProcessItems(ByVal feedback As Feedback) Dim item As Int32 For item = 0 To items.length - 1 If Not feedback Is Nothing Then Falls irgendwelche Rückrufe eingetragen sind, aufrufen. feedback(items(item), item + 1, items.length) End If Next Abbildung 17.2: ILDasm.exe beweist, dass der Compiler Code zum Aufrufen der Methode Invoke des Delegattyps ItemSet.Feedback generiert hat. Delegaten 323

10 Direkt unter dem Kommentar steht die Codezeile, in der die Rückrufmethode aufgerufen wird. Es sieht so aus, als würde ich eine Funktion namens feedback aufrufen und ihr drei Argumente übergeben. Es gibt allerdings keine Funktion mit dem Namen feedback. Weil der Compiler aber weiß, dass feedback eine Variable ist, die auf ein Delegatobjekt verweist, generiert er Code, um die Methode Invoke des Delegatobjekts aufzurufen. Der Compiler sieht also folgende Zeile: feedback(items(item), item + 1, items.length) Er erzeugt aber Code, als würde diese Zeile lauten: feedback.invoke(items(item), item + 1, items.length) Sie können sich überzeugen, dass der Compiler den Code zum Aufrufen der Methode Invoke des Delegattyps erzeugt, indem Sie in ILDasm.exe den Code der Methode ProcessItems untersuchen. Abbildung 17.2 zeigt die Intermediate Language (IL) für die Methode ProcessItems des Typs ItemSet. Die eingerahmten Zeilen in dieser Abbildung enthalten die Befehle, mit denen die Methode Invoke des Typs ItemSet.Feedback aufgerufen wird. Wenn Sie wollen, können Sie Ihren Code in Visual Basic sogar so schreiben, dass Sie die Methode Invoke explizit aufrufen. Wie Sie wissen, hatte der Compiler die Methode Invoke definiert, als er die Klasse Feedback erstellte. Wird Invoke aufgerufen, wertet die Methode die privaten Felder _target und _methodptr aus, um die gewünschte Methode des angegebenen Objekts aufzurufen. Die Signatur der Methode Invoke entspricht der Signatur des Delegaten. Da der Delegat Feedback eine Sub-Methode ist und drei Parameter hat, ist auch Invoke eine Sub-Methode mit denselben drei Parametern. System.Delegate und System.MulticastDelegate Die FCL definiert zwar die Klasse System.MulticastDelegate, MulticastDelegate ist aber von der Klasse System.Delegate abgeleitet (die ebenfalls in der FCL definiert ist); System.Delegate ist wiederum von System.Object abgeleitet. Als das Entwicklerteam bei Microsoft das.net Framework entwarf, hielten die Mitglieder dieses Teams es für nötig, zwei verschiedene Delegattypen zur Verfügung zu stellen: den ersten für Aufrufe einer einzelnen Rückrufmethode (Single-cast), den zweiten für Aufrufe mehrerer verketteter Methoden (Multicast). Von MulticastDelegate abgeleitete Typen sollten Delegatobjekte speichern, die miteinander verkettet werden können; von Delegate abgeleitete Typen sollten Objekte sein, die sich nicht verketten lassen. Der Typ System.Delegate wurde als Basistyp entworfen. Diese Klasse implementiert die Fähigkeiten, die zum Aufrufen einer Rückrufmethode nötig sind. Die Klasse MulticastDelegate wurde von Delegate abgeleitet; sie beherrscht zusätzlich die Fähigkeit, eine verknüpfte Liste (Kette) von MulticastDelegate-Objekten zu erstellen. Beim Übersetzen des Quellcodes sollte der Compiler die Signatur des Delegaten untersuchen und die geeignetere der beiden Klassen als Basisklasse für den neu erstellten Delegattyp auswählen. Falls Sie sich genauer für das Thema interessieren: Methoden, deren Signatur einen Rückgabewert lieferten (Function-Methoden), sollten von System.Delegate abgeleitet werden, Methoden ohne Rückgabewert (Sub-Methoden) von System.MulticastDelegate. Das ergab Sinn, weil Sie nur den Ergebniswert der letzten Methode zurückerhalten, die in einer Kette aufgerufen wird. Während der Betaphase der.net Framework-Entwicklung wurde es offensichtlich, dass die beiden unterschiedlichen Basistypen die Entwickler erheblich verwirrten. Außerdem wurden die Delegaten auf diese Weise willkürlichen Beschränkungen unterworfen. Zum Beispiel können Sie die Rückgabewerte vieler Methoden in den meisten Situationen ignorieren. Da solche Methoden 324 Kapitel 17

11 einen Rückgabewert haben, wären sie nicht von der Klasse MulticastDelegate abgeleitet worden; somit konnten sie nicht in einer verknüpften Liste kombiniert werden. Um die Verwirrung der Programmierer zu verringern, wollten die Microsoft-Entwickler die Klassen Delegate und MulticastDelegate zu einer einzigen Klasse vereinigen; diese Klasse sollte es ermöglichen, jedes Delegatobjekt in eine verknüpfte Liste einzufügen. Alle Compiler sollten Delegatklassen generieren, die von dieser einen Klasse abgeleitet waren. Diese Architektur hätte die Komplexität verringert und vielen Beteiligten die Arbeit erleichtert: dem.net Framework- Team, dem CLR-Team, dem Compilerteam und all den Entwicklern, die Delegaten benutzen. Leider kam die Idee, die Klassen Delegate und MulticastDelegate zu vereinigen, etwas spät im Entwicklungszyklus des.net Frameworks. Microsoft war besorgt, dass bei einer solchen Änderung Bugs auftauchen und sich der Testaufwand gewaltig erhöhen würde. Daher wurden die beiden Klassen in der Version 1 des.net Frameworks nicht vereinigt. In einer künftigen Version des.net Frameworks könnte das aber der Fall sein. Microsoft hat nun zwar vorerst darauf verzichtet, die beiden Klassen in der FCL zu verschmelzen, hatte aber noch Zeit, alle Compiler anzupassen. Sämtliche Microsoft-Compiler generieren immer Delegattypen, die von der Klasse MulticastDelegate abgeleitet sind. Ich habe also nicht geflunkert, als ich weiter oben behauptete, dass alle Delegattypen von MulticastDelegate abgeleitet sind. Da die Compiler geändert wurden, können Sie alle Instanzen von Delegattypen zu einer verknüpften Liste kombinieren, egal, welchen Rückgabewert die Rückrufmethode liefert. Möglicherweise fragen Sie sich jetzt, warum Sie das eigentlich alles interessieren sollte. Es gibt einen guten Grund: Wenn Sie für Ihre Anwendungen Delegaten benutzen, werden Sie in der Dokumentation des.net Framework SDKs zwangsläufig über die beiden Typen Delegate und MulticastDelegate stolpern. Ich möchte, dass Sie die Beziehung zwischen diesen beiden Klassen verstehen. Zwar haben alle Delegattypen, die Sie erstellen, die Basisklasse MulticastDelegate, gelegentlich werden Sie aber mit Methoden auf Ihre Typen zugreifen, die nicht von der Klasse MulticastDelegate, sondern von Delegate definiert werden. Zum Beispiel hat die Klasse Delegate statische Methoden namens Combine und Remove. (Was diese Methoden tun, erkläre ich weiter unten.) Die Signaturen dieser beiden Methoden verraten, dass ihre Parameter vom Typ Delegate sind. Da Ihr Delegattyp von MulticastDelegate abgeleitet ist und MulticastDelegate wiederum von Delegate, können Sie den Methoden Combine und Remove Instanzen Ihres Delegattyps übergeben. Delegaten vergleichen Die Basisklasse Delegate überschreibt die virtuelle Methode Equals des Typs Object. Der Typ MulticastDelegate erbt die Equals-Implementierung von Delegate. Diese Methode vergleicht zwei Delegatobjekte, indem sie überprüft, ob ihre _target- und _methodptr-felder auf dasselbe Objekt beziehungsweise dieselbe Methode zeigen. Stimmen die beiden Felder überein, gibt Equals den Wert True zurück; andernfalls liefert Equals das Ergebnis False. Der folgende Codeausschnitt zeigt ein Beispiel: Zwei Delegatobjekte anlegen, die auf dasselbe Ziel und dieselbe Methode verweisen. Dim fb1 As New Feedback(AddressOf FeedbackToConsole) Dim fb2 As New Feedback(AddressOf FeedbackToConsole) fb1 und fb2 verweisen zwar auf unterschiedliche Objekte, intern verweisen sie aber auf dasselbe Ziel und dieselbe Rückrufmethode. Console.WriteLine(fb1.Equals(fb2)) Zeigt True an Delegaten 325

12 Sie müssen wissen, wie Sie prüfen, ob Delegaten gleich sind, falls Sie Delegatenketten bearbeiten wollen. Das ist unser nächstes Thema. Delegatenketten Schon für sich allein gesehen sind Delegaten enorm nützlich. Was sie aber noch leistungsfähiger macht, ist die Tatsache, dass sie eine Verkettung unterstützen. Ich habe bereits erwähnt, dass jedes MulticastDelegate-Objekt ein privates Feld namens _prev hat. Dieses Feld speichert einen Verweis auf ein anderes MulticastDelegate-Objekt. Jedes Objekt vom Typ MulticastDelegate (oder einem davon abgeleiteten Typ) enthält also einen Verweis auf ein anderes von MulticastDelegate abgeleitetes Objekt. Durch dieses Feld kann ein Delegatobjekt zu einem Element in einer verknüpften Liste werden. Die Klasse Delegate definiert drei statische Methoden, mit denen Sie eine Kette von Delegatobjekten bearbeiten können: Public Class System.Delegate Kombiniert die Ketten head und tail; head wird zurückgegeben. HINWEIS: head ist der letzte Delegat, der aufgerufen wird. Public Shared Function Combine(ByVal tail As Delegate, _ ByVal head As Delegate) As Delegate Erstellt aus dem Array mit Delegaten eine Kette. HINWEIS: Element 0 wird der neue Listenkopf (head) und ist der letzte Delegat, der aufgerufen wird. Public Shared Function Combine(ByVal delegatearray() As Delegate) _ As Delegate Löscht den Delegaten mit demselben Ziel und derselben Methode wie value aus der Kette. Zurückgegeben wird der neue Listenkopf (head); dies ist der letzte Delegat, der aufgerufen wird. Public Shared Function Remove(ByVal source As Delegate, _ ByVal value As Delegate) As Delegate Wenn Sie ein neues Delegatobjekt anlegen, wird in das Feld _prev des Objekts der Wert Nothing eingetragen; das heißt, es gibt keine weiteren Objekte in der verknüpften Liste. Rufen Sie eine der statischen Combine-Methoden von Delegate auf, um zwei Delegaten zu einer verknüpften Liste zu kombinieren: Dim fb1 As New Feedback(AddressOf FeedbackToConsole) Dim fb2 As New Feedback(AddressOf FeedbackToMsgBox) Dim fbchain As Feedback = DirectCast([Delegate].Combine(fb1, fb2), Feedback) Die linke Seite in Abbildung 17.3 zeigt, wie die Kette aussieht, nachdem der Code ausgeführt wurde. Dim appobj As New App() Dim fb3 As New Feedback(appobj.FeedbackToFile) fbchain = DirectCast([Delegate].Combine(fbChain, fb3), Feedback) Die rechte Seite in Abbildung 17.3 zeigt, wie die Kette aussieht, nachdem der Code ausgeführt wurde. Abbildung 17.3 zeigt, wie die Delegatenketten intern verwaltet werden. 326 Kapitel 17

13 fbchain fbchain _target _methodptr _prev Nothing App.FeedbackToMsgBox _target _methodptr _prev appobj App.FeedbackToStream _target _methodptr _prev Nothing App.FeedbackToConsole Nothing _target _methodptr _prev Nothing App.FeedbackToMsgBox _target _methodptr _prev Nothing App.FeedbackToConsole Nothing Abbildung 17.3: Interner Aufbau von Delegatenketten Der Typ Delegate bietet eine weitere Version der Methode Combine an, der Sie ein Array mit Delegate-Verweisen übergeben können. Wenn Sie diese Version verwenden, können Sie das letzte Beispiel folgendermaßen formulieren: Dim fbarray(2) As Feedback fbarray(0) = New Feedback(AddressOf FeedbackToConsole) fbarray(1) = New Feedback(AddressOf FeedbackToMsgBox) Dim appobj As New App() fbarray(2) = New Feedback(AddressOf appobj.feedbacktofile) Dim fbchain As Feedback = DirectCast([Delegate].Combine(fbArray), Feedback) Die rechte Seite in Abbildung 17.3 zeigt, wie die Kette aussieht, nachdem der Code ausgeführt wurde. Wird ein Delegat aufgerufen, generiert der Compiler einen Aufruf der Invoke-Methode des Delegattyps. In dem Beispiel weiter oben in diesem Kapitel hatte ich einen Delegaten namens Feedback folgendermaßen deklariert: Public Delegate Sub Feedback(ByVal value As Object, _ ByVal item As Int32, ByVal numitems As Int32) Daraus erzeugt der Compiler eine Klasse mit einer Invoke-Methode, die so aussieht (in Pseudocode): Class Feedback Inherits MulticastDelegate Public Overridable Sub Invoke(ByVal value As Object, _ ByVal item As Int32, ByVal numitems As Int32) Falls die Kette Delegaten enthält, die zuerst aufgerufen werden müssen, rufen wir sie rekursiv auf. If Not (_prev Is Nothing) Then _prev.invoke(value, item, numitems) End If Delegaten 327

14 Die Rückrufmethode für das angegebene Zielobjekt aufrufen. _target.methodptr(value, item, numitems) Wie Sie sehen, wird beim Aufrufen eines Delegatobjekts zuerst der Delegat aufgerufen, der davor in der verknüpften Liste steht. Nach der Rückkehr des vorherigen Delegaten wird sein Ergebniswert verworfen (falls es sich um eine Function handelt). Danach kann der Delegat die Rückrufmethode aufrufen, für die er selbst einen Wrapper bildet. Der folgende Code zeigt ein Beispiel: Dim fb1 As New Feedback(AddressOf FeedbackToConsole) Dim fb2 As New Feedback(AddressOf FeedbackToMsgBox) Dim fbchain As Feedback = DirectCast([Delegate].Combine(fb1, fb2), Feedback) An diesem Punkt verweist fbchain auf einen Delegaten, der FeedbackToMsgBox aufruft; dieser Delegat verweist seinerseits auf einen anderen Delegaten, der FeedbackToConsole aufruft; dieser Delegat verweist schließlich auf Nothing. Jetzt den Delegaten am Kopf der verknüpften Liste aufrufen; er ruft intern den vorherigen Delegaten auf und so weiter. If Not (fbchain Is Nothing) Then fbchain(nothing, 0, 10) HINWEIS: In der letzten Zeile kann fbchain nie Nothing sein, aber Sie sollten sich trotzdem angewöhnen zu prüfen, ob ein Delegatverweis Nothing ist, bevor Sie ihn aufrufen. In den bisherigen Beispielen war mein Delegattyp immer eine Sub-Methode ohne Rückgabewert. Ich könnte den Delegat Feedback aber auch so definieren: Public Delegate Function Feedback(ByVal value As Object, _ ByVal item As Int32, ByVal numitems As Int32) As Int32 In diesem Fall sähe die Invoke-Methode des Typs intern so aus (wiederum als Pseudocode): Class Feedback Inherits MulticastDelegate Public Overridable Function Invoke(ByVal value As Object, _ ByVal item As Int32, ByVal numitems As Int32) As Int32 Falls die Kette Delegaten enthält, die zuerst aufgerufen werden müssen, rufen wir sie rekursiv auf. If Not (_prev Is Nothing) Then _prev.invoke(value, item, numitems) End If Die Rückrufmethode für das angegebene Zielobjekt aufrufen. _Return target.methodptr(value, item, numitems) Wird der Kopf der Delegatenkette aufgerufen, ruft er alle vorhergehenden Delegaten in der Kette auf. Allerdings wird der Ergebniswert der vorhergehenden Delegaten verworfen. Ihre Anwendung erhält nur den Rückgabewert des Delegaten, der im Kopf der Kette steht (das heißt das Ergebnis der zuletzt aufgerufenen Rückrufmethode). Sie wissen jetzt, wie Sie Delegatenketten aufbauen. Sehen wir uns als Nächstes an, wie Sie einen Delegaten aus einer Kette entfernen. Dazu rufen Sie die statische Methode Remove des Typs Delegate auf: Dim fb1 As New Feedback(AddressOf FeedbackToConsole) Dim fb2 As New Feedback(AddressOf FeedbackToMsgBox) 328 Kapitel 17

15 Dim fbchain As Feedback = DirectCast([Delegate].Combine(fb1, fb2), Feedback) fbchain verweist auf eine Kette mit zwei Delegaten. Die Kette aufrufen: Zwei Methoden werden aufgerufen. If Not (fbchain Is Nothing) Then fbchain(nothing, 0, 10) fbchain = DirectCast([Delegate].Remove(fbChain, _ New Feedback(AddressOf FeedbackToMsgBox)), Feedback) fbchain verweist auf eine Kette mit einem Delegaten. Die Kette aufrufen: Eine Methode wird aufgerufen. If Not (fbchain Is Nothing) Then fbchain(nothing, 0, 10) fbchain = DirectCast([Delegate].Remove(fbChain, _ New Feedback(AddressOf FeedbackToConsole)), Feedback) fbchain verweist auf eine Kette mit 0 Delegaten. (fbchain ist Nothing.) Die Kette aufrufen: 0 Methoden werden aufgerufen. If Not (fbchain Is Nothing) Then fbchain(nothing, 0, 10) Dieser Codeausschnitt erstellt zuerst zwei Delegatobjekte und verknüpft sie zu einer Kette, indem er die Methode Combine aufruft. Anschließend ruft er die Methode Remove auf. Der erste Parameter von Remove verweist auf den Kopf der Kette mit Delegatobjekten, der zweite Parameter gibt das Delegatobjekt an, das aus der Kette entfernt werden soll. Es sieht zugegebenermaßen etwas seltsam aus, wenn ein neues Delegatobjekt angelegt wird, um es aus der Kette zu entfernen. Ich will genauer erklären, warum dieser Schritt notwendig ist. Beim Aufruf von Remove lege ich ein neues Delegatobjekt an. Die Felder _target und _methodptr dieses Delegatobjekts werden entsprechend initialisiert, das Feld _prev erhält den Wert Nothing. Die Methode Remove durchsucht die Kette, auf die fbchain verweist, und prüft, ob eines der Delegatobjekte in der Kette dem neuen Delegatobjekt gleicht. Wie Sie ja wissen, vergleicht die von der Klasse Delegate überschriebene Equals-Methode nur die Felder _target und _methodptr, das Feld _prev ignoriert sie. Findet Remove eine Übereinstimmung, entfernt sie das entsprechende Delegatobjekt aus der Kette, indem sie das _prev-feld des vorhergehenden Delegatobjekts verändert. Remove gibt den Kopf der neuen Kette als Ergebnis zurück. Falls die Methode keine Übereinstimmung findet, tut sie nichts (es wird auch keine Ausnahme ausgelöst) und gibt den Wert zurück, den sie im ersten Parameter bekommen hatte. Bei jedem Aufruf von Remove wird nur ein Objekt aus der Kette gelöscht. Der folgende Codeausschnitt beweist das: Dim fb As New Feedback(AddressOf FeedbackToConsole) Dim fbchain As Feedback = DirectCast([Delegate].Combine(fb, fb), Feedback) fbchain verweist auf eine Kette mit zwei Delegaten. Die Kette aufrufen: FeedbackToConsole wird zweimal aufgerufen. If Not (fbchain is nothing) then fbchain(...) Einen der Rückrufe aus der Kette entfernen. fbchain = DirectCast([Delegate].Remove(fbChain, fb), Feedback) Die Kette aufrufen: FeedbackToConsole wird einmal aufgerufen. If Not (fbchain is nothing) then fbchain(...) Einen der Rückrufe aus der Kette entfernen. fbchain = DirectCast([Delegate].Remove(fbChain, fb), Feedback) Die Kette aufrufen: 0 Methoden werden aufgerufen. If Not (fbchain is nothing) then fbchain(...) Delegaten 329

16 Einzelne Objekte einer Delegatenkette aufrufen Sie wissen jetzt, wie Sie eine Kette aus Delegatobjekten aufbauen und wie Sie sämtliche Objekte in dieser Kette aufrufen. Es werden alle Einträge der Delegatenkette aufgerufen, weil die Methode Invoke des Delegattyps auch den vorhergehenden Delegaten in der Kette aufruft (falls einer vorhanden ist). Das ist natürlich ein sehr simpler Algorithmus. Für die meisten Fälle ist er gut genug, er weist aber viele Einschränkungen auf. Zum Beispiel werden die Ergebniswerte aller Rückrufmethoden außer der letzten verworfen. Mit diesem einfachen Algorithmus gibt es keine Möglichkeit, die Rückgabewerte aller aufgerufenen Rückrufmethoden zu untersuchen. Das ist aber bei weitem nicht die einzige Einschränkung. Was passiert, wenn einer der aufgerufenen Delegaten eine Ausnahme auslöst oder längere Zeit blockiert? Da der Algorithmus einen Delegaten nach dem anderen aufruft, verhindert ein Problem bei einem der Delegatobjekte, dass die übrigen Delegaten in der Kette aufgerufen werden. Dieser Algorithmus ist nicht sonderlich robust. Für die Fälle, in denen dieser Algorithmus nicht geeignet ist, bietet die Klasse MulticastDelegate die Instanzmethode GetInvocationList. Mit Hilfe dieser Methode können Sie jeden Delegaten in einer Kette explizit aufrufen und so einen beliebigen Algorithmus verwenden, der sich für den jeweiligen Einsatzzweck am besten eignet: Public Class System.MulticastDelegate Inherits System.Delegate Ein Array mit Delegaten anlegen; jedes Element ist ein Klon des entsprechenden Eintrags in der Kette. HINWEIS: Element 0 ist das Ende der Kette, es wird normalerweise als Erstes aufgerufen. Public Overridable Function GetInvocationList() As Delegate() Die Methode GetInvocationList arbeitet mit einem Verweis auf eine Delegatenkette. Sie gibt ein Array zurück, das Verweise auf Delegatobjekte enthält. Intern durchläuft GetInvocationList die angegebene Kette und erstellt von jedem Objekt in dieser Kette einen Klon, den sie dann in das Array einfügt. Bei jedem Klon hat das Feld _prev den Wert Nothing, daher ist jedes Objekt isoliert und verweist nicht auf ein anderes Objekt der Kette. Sie können sich ganz einfach einen Algorithmus schreiben, der jedes Objekt aus dem Array explizit aufruft. Das folgende Programm zeigt ein Beispiel: Imports System Imports System.Text Die Komponente Light (Lampe) definieren. Class Light Diese Methode gibt den Status der Lampe zurück. Public Function SwitchPosition() As String Return Die Lampe ist aus" End Function Die Komponente Fan (Ventilator) definieren. Class Fan Diese Methode gibt den Status des Ventilators zurück. Public Function Speed() As String Throw New Exception( Der Ventilator ist wegen Überhitzung defekt ) End Function 330 Kapitel 17

17 Die Komponente Speaker (Lautsprecher) definieren. Class Speaker Diese Methode gibt den Status des Lautsprechers zurück. Public Function Volume() As String Return Lautstärke ist hoch" End Function Class App Definition des Delegaten, mit dem der Status einer Komponente ermittelt werden kann. Delegate Function GetStatus() As String Shared Sub Main() Eine leere Delegatenkette erstellen. Dim delegarray(2) As GetStatus delegarray(0) = New GetStatus(AddressOf New Light().SwitchPosition) delegarray(1) = New GetStatus(AddressOf New Fan().Speed) delegarray(2) = New GetStatus(AddressOf New Speaker().Volume) Die Delegatenkette deklarieren und initialisieren. Dim getstatus As GetStatus = _ DirectCast([Delegate].Combine(delegArray), GetStatus) Zusammengefassten Statusbericht anzeigen, der den Zustand der drei Komponenten wiedergibt. Console.WriteLine(GetComponentStatusReport(getStatus)) Diese Methode fragt den Status der verschiedenen Komponenten ab und liefert einen Bericht zurück. Shared Function GetComponentStatusReport(ByVal status As GetStatus) _ As String Falls die Kette leer ist, gibt es nichts zu tun. If (status Is Nothing) Then Return Nothing Hier stellen wir den Bericht zusammen. Dim report As New StringBuilder() Ein Array holen, bei dem jedes Element ein Delegat aus der Kette ist. Dim arrayofdelegates() As [Delegate] = status.getinvocationlist() In einer Schleife über alle Delegaten des Arrays gehen. Dim getstatus As GetStatus For Each getstatus In arrayofdelegates Try Den Statusstring einer Komponente holen und an den Bericht anhängen. report.appendformat( {0}{1}{1}", getstatus(), Environment.NewLine) Catch ex As Exception Fehlermeldung für diese Komponente in den Bericht einfügen. Dim component As Object = getstatus.target Dim comptype As String = " If Not (component Is Nothing) Then comptype = component.gettype.name End If report.appendformat( _ Kein Status von {1}.{2} empfangen{0} Fehler: {3}{0}{0}", _ Environment.NewLine, comptype, _ getstatus.method.name, ex.message) Delegaten 331

18 End Try Next Den kompletten Bericht zurückliefern. Return report.tostring() End Function Wenn Sie dieses Programm kompilieren und ausführen, erhalten Sie folgenden Statusbericht: Die Lampe ist aus Kein Status von Fan.Speed empfangen Fehler: Der Ventilator ist wegen Überhitzung defekt Lautstärke ist hoch Delegaten und Reflektion In den bisherigen Beispielen in diesem Kapitel konnten Sie die Delegaten nur nutzen, wenn Sie vorher wussten, wie der Prototyp der Rückrufmethode aussah. Zum Beispiel ist feedback eine Variable, die auf einen Feedback-Delegaten verweist; dann rufen Sie diesen Delegaten folgendermaßen auf: feedback(items(item), item + 1, items.length) Der Entwickler muss beim Schreiben des Quellcodes wissen, wie viele Parameter die Rückrufmethode erwartet und welchen Typ diese Parameter haben. Glücklicherweise verfügt der Entwickler fast immer über diese Informationen, daher ist es kein Problem, solchen Code zu programmieren. In einigen wenigen Fällen liegen dem Entwickler diese Informationen aber nicht vor. Glücklicherweise stellt System.Delegate einige Methoden zur Verfügung, mit denen Sie einen Delegaten anlegen und aufrufen können, auch wenn Sie während der Programmentwicklung noch nicht alle notwendigen Informationen über den Delegaten besitzen. Der Typ Delegate definiert für diesen Zweck die folgenden Methoden: Public Class System.Delegate Legt einen deltype-delegaten an, der einen Wrapper für die angegebene methodinfo bildet. Public Shared Function CreateDelegate(ByVal deltype As Type, _ ByVal mi As MethodInfo) As Delegate Legt einen deltype-delegaten an, der einen Wrapper für die statische Methode eines Typs bildet. Public Shared Function CreateDelegate(ByVal deltype As Type, ByVal type As Type, ByVal methodname As String) As Delegate Legt einen deltype-delegaten an, der einen Wrapper für die Instanzmethode eines Objekts bildet. Public Shared Function CreateDelegate(ByVal deltype As Type, ByVal obj As Object, ByVal methodname As String) As Delegate Legt einen deltype-delegaten an, der einen Wrapper für die Instanzmethode eines Objekts bildet. Public Shared Function CreateDelegate(ByVal deltype As Type, ByVal obj As Object, ByVal methodname As String, _ ByVal ignorecase As Boolean) As Delegate Public Function DynamicInvoke(ByVal args() As Object) As Object 332 Kapitel 17

19 Alle diese CreateDelegate-Methoden legen ein neues Objekt von einem Typ an, der von Delegate abgeleitet ist; der erste Parameter, deltype, legt diesen Delegattyp fest. Die übrigen Parameter von CreateDelegate definieren die Rückrufmethode, für die das Delegatobjekt einen Wrapper bilden soll. Sie können eine MethodInfo (erklärt in Kapitel 20,»CLR-Hosting, AppDomains und Reflektion«) übergeben, die statische Methode eines Typs als String oder die Instanzmethode eines Objekts als String. Mit der Methode DynamicInvoke einer Delegate-Instanz können Sie die Rückrufmethode eines Delegatobjekts aufrufen. Sie übergeben der Methode eine Gruppe von Argumenten, die Sie während der Laufzeit zusammenstellen. DynamicInvoke überprüft, ob die übergebenen Argumente zu den Parametern der Rückrufmethode kompatibel sind. Ist das der Fall, ruft sie die Rückrufmethode auf. Andernfalls löst sie eine Ausnahme aus. DynamicInvoke gibt das Objekt zurück, das die Rückrufmethode als Ergebnis geliefert hat. Die folgende Beispielanwendung zeigt, wie Sie diese Methoden benutzen: Imports System Imports System.Reflection Imports System.IO Einige verschiedene Delegatdefinitionen. Delegate Function TwoInt32s(ByVal n1 As Int32, ByVal n2 As Int32) As Object Delegate Function OneString(ByVal s1 As String) As Object Class App Shared Sub Main() Argumente aus der Befehlszeile holen. Dim args() As String = Environment.GetCommandLineArgs If (args.length < 3) Then Dim filename As String = Path.GetFileNameWithoutExtension( _ [Assembly].GetEntryAssembly().CodeBase) Console.WriteLine( Aufruf: ) Console.WriteLine( {0} deltype methodname [Parameter1] [Parameter2]", _ filename) Console.WriteLine( dabei muss deltype entweder _ & TwoInt32s oder OneString sein") Console.WriteLine( falls deltype TwoInt32s ist, _ & muss methodname Add oder Subtract sein ) Console.WriteLine( falls deltype OneString ist, _ & muss methodname NumChars oder Reverse sein ) Console.WriteLine() Console.WriteLine( Beispiele: ) Console.WriteLine( {0} TwoInt32s Add ", filename) Console.WriteLine( {0} TwoInt32s Subtract ", filename) Console.WriteLine( {0} OneString NumChars "Halli Hallo""", _ filename) Console.WriteLine( {0} OneString Reverse "Halli Hallo""", _ filename) Exit Sub End If args(0) ist der Name der ausführbaren Datei. args(1) ist der Delegattyp. Dim deltype As Type = Type.GetType(args(1)) Delegaten 333

20 If deltype Is Nothing Then Console.WriteLine( Ungültiges Argument für deltype: {0}", args(1)) Exit Sub End If Dim d As [Delegate] Try Einen Delegaten erstellen, der auf die angegebene Methode verweist. args(2) ist der Methodenname. d = [Delegate].CreateDelegate(delType, GetType(App), args(2)) Catch ex As ArgumentException Console.WriteLine( Ungültiges Argument für methodname: {0}", args(2)) Exit Sub End Try Das Array mit den Argumenten vorbereiten. Dim callbackargs(args.length - 4) As Object If d.gettype() Is GetType(TwoInt32s) Then Falls die Methode zwei Int32s übernimmt, die Werte aus der Befehlszeile extrahieren. Try Dim a As Int32 For a = 3 To args.length - 1 callbackargs(a - 3) = Int32.Parse(args(a)) Next Catch ex As FormatException Console.WriteLine( Argumente müssen Integer sein. ) Exit Sub End Try ElseIf d.gettype() Is GetType(OneString) Then Falls die Methode Stringargumente bekommt, die Strings aus dem Array args kopieren. Array.Copy(args, 3, callbackargs, 0, callbackargs.length) End If Try Den Delegat dynamisch aufrufen und das Ergebnis ausgeben. Dim result As Object = d.dynamicinvoke(callbackargs) Console.WriteLine( Ergebnis = {0}", result) Catch ex As TargetParameterCountException Console.WriteLine( Falsche Anzahl von Argumenten übergeben. ) End Try Dies ist die Rückrufmethode, die zwei Int32-Parameter hat. Shared Function Add(ByVal n1 As Int32, ByVal n2 As Int32) As Object Return n1 + n2 End Function Shared Function Subtract(ByVal n1 As Int32, ByVal n2 As Int32) As Object Return n1 - n2 End Function Dies ist die Rückrufmethode, die einen String-Parameter hat. Shared Function NumChars(ByVal s1 As String) As Object Return s1.length End Function 334 Kapitel 17

21 Shared Function Reverse(ByVal s1 As String) As Object Dim chars() As Char = s1.tochararray() Array.Reverse(chars) Return New String(chars) End Function Delegaten 335

22

Qt-Projekte mit Visual Studio 2005

Qt-Projekte mit Visual Studio 2005 Qt-Projekte mit Visual Studio 2005 Benötigte Programme: Visual Studio 2005 Vollversion, Microsoft Qt 4 Open Source s. Qt 4-Installationsanleitung Tabelle 1: Benötigte Programme für die Qt-Programmierung

Mehr

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster Es gibt in Excel unter anderem die so genannten Suchfunktionen / Matrixfunktionen Damit können Sie Werte innerhalb eines bestimmten Bereichs suchen. Als Beispiel möchte ich die Funktion Sverweis zeigen.

Mehr

! " # $ " % & Nicki Wruck worldwidewruck 08.02.2006

!  # $  % & Nicki Wruck worldwidewruck 08.02.2006 !"# $ " %& Nicki Wruck worldwidewruck 08.02.2006 Wer kennt die Problematik nicht? Die.pst Datei von Outlook wird unübersichtlich groß, das Starten und Beenden dauert immer länger. Hat man dann noch die.pst

Mehr

.NET Code schützen. Projekt.NET. Version 1.0

.NET Code schützen. Projekt.NET. Version 1.0 .NET Code schützen Projekt.NET Informationsmaterial zum Schützen des.net Codes Version 1.0 Autor: Status: Ablage: Empfänger: Seiten: D. Hoyer 1 / 6 Verteiler : Dokument1 Seite 1 von 1 Änderungsprotokoll

Mehr

Nach der Installation kann es auch schon losgehen. Für unseren Port Scanner erstellen wir zunächst ein neues Projekt:

Nach der Installation kann es auch schon losgehen. Für unseren Port Scanner erstellen wir zunächst ein neues Projekt: Ein Port Scanner ist eine gute Möglichkeit den eigenen Server auf offene Ports zu scannen. Zu viele nicht benötigte und offene Ports können auf Ihrem Server und auf Ihrem Computer ein Sicherheitsrisiko

Mehr

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein. Schritt 1: Installation des Javacompilers JDK. Der erste Start mit Eclipse Bevor Sie den Java-Compiler installieren sollten Sie sich vergewissern, ob er eventuell schon installiert ist. Gehen sie wie folgt

Mehr

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als

Mehr

Arbeiten mit UMLed und Delphi

Arbeiten mit UMLed und Delphi Arbeiten mit UMLed und Delphi Diese Anleitung soll zeigen, wie man Klassen mit dem UML ( Unified Modeling Language ) Editor UMLed erstellt, in Delphi exportiert und dort so einbindet, dass diese (bis auf

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum

Mehr

Java: Vererbung. Teil 3: super() www.informatikzentrale.de

Java: Vererbung. Teil 3: super() www.informatikzentrale.de Java: Vererbung Teil 3: super() Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und IMMER zuerst den Konstruktor der Elternklasse auf! Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und

Mehr

Einführung in die Java- Programmierung

Einführung in die Java- Programmierung Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1 Wichtig... Mittags keine Pommes... Praktikum A 230 C 207 (Madeleine + Esma) F 112 F 113

Mehr

Java Kurs für Anfänger Einheit 5 Methoden

Java Kurs für Anfänger Einheit 5 Methoden Java Kurs für Anfänger Einheit 5 Methoden Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 22. Juni 2009 Inhaltsverzeichnis Methoden

Mehr

Einführung in die Programmierung

Einführung in die Programmierung Technische Universität München WS 2003/2004 Institut für Informatik Prof. Dr. Christoph Zenger Testklausur Einführung in die Programmierung Probeklausur Java (Lösungsvorschlag) 1 Die Klasse ArrayList In

Mehr

Visual Basic Express Debugging

Visual Basic Express Debugging Inhalt Dokument Beschreibung... 1 Projekt vorbereiten... 1 Verknüpfung zu Autocad/ProStructures einstellen... 2 Debugging... 4 Autocad/ProSteel Beispiel... 5 Dokument Beschreibung Debuggen nennt man das

Mehr

Objektorientierte Programmierung. Kapitel 12: Interfaces

Objektorientierte Programmierung. Kapitel 12: Interfaces 12. Interfaces 1/14 Objektorientierte Programmierung Kapitel 12: Interfaces Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester 2012/13 http://www.informatik.uni-halle.de/ brass/oop12/

Mehr

Handbuch zur Anlage von Turnieren auf der NÖEV-Homepage

Handbuch zur Anlage von Turnieren auf der NÖEV-Homepage Handbuch zur Anlage von Turnieren auf der NÖEV-Homepage Inhaltsverzeichnis 1. Anmeldung... 2 1.1 Startbildschirm... 3 2. Die PDF-Dateien hochladen... 4 2.1 Neue PDF-Datei erstellen... 5 3. Obelix-Datei

Mehr

Software Engineering Klassendiagramme Assoziationen

Software Engineering Klassendiagramme Assoziationen Software Engineering Klassendiagramme Assoziationen Prof. Adrian A. Müller, PMP, PSM 1, CSM Fachbereich Informatik und Mikrosystemtechnik 1 Lesen von Multiplizitäten (1) Multiplizitäten werden folgendermaßen

Mehr

Wie halte ich Ordnung auf meiner Festplatte?

Wie halte ich Ordnung auf meiner Festplatte? Wie halte ich Ordnung auf meiner Festplatte? Was hältst du von folgender Ordnung? Du hast zu Hause einen Schrank. Alles was dir im Wege ist, Zeitungen, Briefe, schmutzige Wäsche, Essensreste, Küchenabfälle,

Mehr

5.2 Neue Projekte erstellen

5.2 Neue Projekte erstellen 5.2 Neue Projekte erstellen Das Bearbeiten von bestehenden Projekten und Objekten ist ja nicht schlecht wie aber können Sie neue Objekte hinzufügen oder gar völlig neue Projekte erstellen? Die Antwort

Mehr

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER Inhalt 1 Einleitung... 1 2 Einrichtung der Aufgabe für die automatische Sicherung... 2 2.1 Die Aufgabenplanung... 2 2.2 Der erste Testlauf... 9 3 Problembehebung...

Mehr

Visual Basic Express erstes Projekt anlegen

Visual Basic Express erstes Projekt anlegen Inhalt Dokument Beschreibung... 1 Erstes Projekt anlegen... 1 Verweise hinzufügen... 2 Imports setzen... 5 Public Class vorbereiten... 6 Mehrere Tools programmieren... 7 Dokument Beschreibung Nach der

Mehr

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen: VBA Programmierung mit Excel Schleifen 1/6 Erweiterung der Aufgabe Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen: Es müssen also 11 (B L) x 35 = 385 Zellen berücksichtigt

Mehr

Zählen von Objekten einer bestimmten Klasse

Zählen von Objekten einer bestimmten Klasse Zählen von Objekten einer bestimmten Klasse Ziel, Inhalt Zur Übung versuchen wir eine Klasse zu schreiben, mit der es möglich ist Objekte einer bestimmten Klasse zu zählen. Wir werden den ++ und den --

Mehr

Die Beschreibung bezieht sich auf die Version Dreamweaver 4.0. In der Version MX ist die Sitedefinition leicht geändert worden.

Die Beschreibung bezieht sich auf die Version Dreamweaver 4.0. In der Version MX ist die Sitedefinition leicht geändert worden. In einer Website haben Seiten oft das gleiche Layout. Speziell beim Einsatz von Tabellen, in denen die Navigation auf der linken oder rechten Seite, oben oder unten eingesetzt wird. Diese Anteile der Website

Mehr

Lieber SPAMRobin -Kunde!

Lieber SPAMRobin -Kunde! Lieber SPAMRobin -Kunde! Wir freuen uns, dass Sie sich für SPAMRobin entschieden haben. Mit diesem Leitfaden möchten wir Ihnen die Kontoeinrichtung erleichtern und die Funktionen näher bringen. Bitte führen

Mehr

Die Dateiablage Der Weg zur Dateiablage

Die Dateiablage Der Weg zur Dateiablage Die Dateiablage In Ihrem Privatbereich haben Sie die Möglichkeit, Dateien verschiedener Formate abzulegen, zu sortieren, zu archivieren und in andere Dateiablagen der Plattform zu kopieren. In den Gruppen

Mehr

Verschlüsseln Sie Ihre Dateien lückenlos Verwenden Sie TrueCrypt, um Ihre Daten zu schützen.

Verschlüsseln Sie Ihre Dateien lückenlos Verwenden Sie TrueCrypt, um Ihre Daten zu schützen. HACK #39 Hack Verschlüsseln Sie Ihre Dateien lückenlos Verwenden Sie TrueCrypt, um Ihre Daten zu schützen.»verschlüsseln Sie Ihren Temp-Ordner«[Hack #33] hat Ihnen gezeigt, wie Sie Ihre Dateien mithilfe

Mehr

4D Server v12 64-bit Version BETA VERSION

4D Server v12 64-bit Version BETA VERSION 4D Server v12 64-bit Version BETA VERSION 4D Server v12 unterstützt jetzt das Windows 64-bit Betriebssystem. Hauptvorteil der 64-bit Technologie ist die rundum verbesserte Performance der Anwendungen und

Mehr

Folge 18 - Vererbung

Folge 18 - Vererbung Workshop Folge 18 - Vererbung 18.1 Ein einfacher Fall der Vererbung Schritt 1 - Vorbereitungen Besorgen Sie sich - vielleicht aus einer der Übungen der Folge 17 - ein fertiges und lauffähiges Listenprojekt,

Mehr

Anbindung an easybill.de

Anbindung an easybill.de Anbindung an easybill.de Stand: 14. Dezember 2011 2011 Virthos Systems GmbH www.pixtacy.de Einleitung Pixtacy verfügt ab Version 2.3 über eine Schnittstelle zu dem Online-Fakturierungsprogramm easybill.de.

Mehr

Datenbank-Verschlüsselung mit DbDefence und Webanwendungen.

Datenbank-Verschlüsselung mit DbDefence und Webanwendungen. Datenbank-Verschlüsselung mit DbDefence und Webanwendungen. In diesem Artikel werden wir Ihnen zeigen, wie Sie eine Datenbank verschlüsseln können, um den Zugriff einzuschränken, aber trotzdem noch eine

Mehr

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang sysplus.ch outlook - mail-grundlagen Seite 1/8 Outlook Mail-Grundlagen Posteingang Es gibt verschiedene Möglichkeiten, um zum Posteingang zu gelangen. Man kann links im Outlook-Fenster auf die Schaltfläche

Mehr

Eigene Seiten erstellen

Eigene Seiten erstellen PhPepperShop Anleitung Datum: 3. Oktober 2013 Version: 2.1 Eigene Seiten erstellen Eigene Inhalte / CMS Glarotech GmbH Inhaltsverzeichnis Anleitung zur Erstellung von eigenen Inhalten/Links...3 1. Anmeldung

Mehr

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = 0.51129 Euro ergeben.

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = 0.51129 Euro ergeben. Aufgabe 1.30 : Schreibe ein Programm DM_in_Euro.java zur Umrechnung eines DM-Betrags in Euro unter Verwendung einer Konstanten für den Umrechnungsfaktor. Das Programm soll den DM-Betrag als Parameter verarbeiten.

Mehr

Speichern. Speichern unter

Speichern. Speichern unter Speichern Speichern unter Speichern Auf einem PC wird ständig gespeichert. Von der Festplatte in den Arbeitspeicher und zurück Beim Download Beim Kopieren Beim Aufruf eines Programms Beim Löschen Beim

Mehr

Delegatesund Ereignisse

Delegatesund Ereignisse Delegatesund Ereignisse «Delegierter» Methoden Schablone Funktionszeiger Dr. Beatrice Amrhein Überblick Definition eines Delegat Einfache Delegate Beispiele von Delegat-Anwendungen Definition eines Ereignisses

Mehr

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu Daten Makro + VBA effektiv 5 DATEN 5.1. Variablen Variablen können beliebige Werte zugewiesen und im Gegensatz zu Konstanten jederzeit im Programm verändert werden. Als Variablen können beliebige Zeichenketten

Mehr

OP-LOG www.op-log.de

OP-LOG www.op-log.de Verwendung von Microsoft SQL Server, Seite 1/18 OP-LOG www.op-log.de Anleitung: Verwendung von Microsoft SQL Server 2005 Stand Mai 2010 1 Ich-lese-keine-Anleitungen 'Verwendung von Microsoft SQL Server

Mehr

Anleitung zur Daten zur Datensicherung und Datenrücksicherung. Datensicherung

Anleitung zur Daten zur Datensicherung und Datenrücksicherung. Datensicherung Anleitung zur Daten zur Datensicherung und Datenrücksicherung Datensicherung Es gibt drei Möglichkeiten der Datensicherung. Zwei davon sind in Ges eingebaut, die dritte ist eine manuelle Möglichkeit. In

Mehr

Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert

Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert Beamen in EEP Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert Zuerst musst du dir 2 Programme besorgen und zwar: Albert, das

Mehr

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016 L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016 Referentin: Dr. Kelly Neudorfer Universität Hohenheim Was wir jetzt besprechen werden ist eine Frage, mit denen viele

Mehr

Kapiteltests zum Leitprogramm Binäre Suchbäume

Kapiteltests zum Leitprogramm Binäre Suchbäume Kapiteltests zum Leitprogramm Binäre Suchbäume Björn Steffen Timur Erdag überarbeitet von Christina Class Binäre Suchbäume Kapiteltests für das ETH-Leitprogramm Adressaten und Institutionen Das Leitprogramm

Mehr

Programmieren in Java

Programmieren in Java Programmieren in Java objektorientierte Programmierung 2 2 Zusammenhang Klasse-Datei In jeder *.java Datei kann es genau eine public-klasse geben wobei Klassen- und Dateiname übereinstimmen. Es können

Mehr

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet C++ Grundlagen ++ bedeutet Erweiterung zum Ansi C Standard Hier wird eine Funktion eingeleitet Aufbau: In dieser Datei stehen die Befehle, die gestartet werden, wenn das Programm gestartet wird Int main()

Mehr

Ihre Interessentendatensätze bei inobroker. 1. Interessentendatensätze

Ihre Interessentendatensätze bei inobroker. 1. Interessentendatensätze Ihre Interessentendatensätze bei inobroker Wenn Sie oder Ihre Kunden die Prozesse von inobroker nutzen, werden Interessentendatensätze erzeugt. Diese können Sie direkt über inobroker bearbeiten oder mit

Mehr

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java: Technische Informatik für Ingenieure (TIfI) WS 2005/2006, Vorlesung 9 II. Grundlagen der Programmierung Ekkart Kindler Funktionen und Prozeduren Datenstrukturen 9. Datenstrukturen Daten zusammenfassen

Mehr

1 Vom Problem zum Programm

1 Vom Problem zum Programm Hintergrundinformationen zur Vorlesung GRUNDLAGEN DER INFORMATIK I Studiengang Elektrotechnik WS 02/03 AG Betriebssysteme FB3 Kirsten Berkenkötter 1 Vom Problem zum Programm Aufgabenstellung analysieren

Mehr

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders

Mehr

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3 Handbuch Fischertechnik-Einzelteiltabelle V3.7.3 von Markus Mack Stand: Samstag, 17. April 2004 Inhaltsverzeichnis 1. Systemvorraussetzungen...3 2. Installation und Start...3 3. Anpassen der Tabelle...3

Mehr

icloud nicht neu, aber doch irgendwie anders

icloud nicht neu, aber doch irgendwie anders Kapitel 6 In diesem Kapitel zeigen wir Ihnen, welche Dienste die icloud beim Abgleich von Dateien und Informationen anbietet. Sie lernen icloud Drive kennen, den Fotostream, den icloud-schlüsselbund und

Mehr

Was meinen die Leute eigentlich mit: Grexit?

Was meinen die Leute eigentlich mit: Grexit? Was meinen die Leute eigentlich mit: Grexit? Grexit sind eigentlich 2 Wörter. 1. Griechenland 2. Exit Exit ist ein englisches Wort. Es bedeutet: Ausgang. Aber was haben diese 2 Sachen mit-einander zu tun?

Mehr

Professionelle Seminare im Bereich MS-Office

Professionelle Seminare im Bereich MS-Office Der Name BEREICH.VERSCHIEBEN() ist etwas unglücklich gewählt. Man kann mit der Funktion Bereiche zwar verschieben, man kann Bereiche aber auch verkleinern oder vergrößern. Besser wäre es, die Funktion

Mehr

Anleitung für die Registrierung und das Einstellen von Angeboten

Anleitung für die Registrierung und das Einstellen von Angeboten Anleitung für die Registrierung und das Einstellen von Angeboten Das FRROOTS Logo zeigt Ihnen in den Abbildungen die wichtigsten Tipps und Klicks. 1. Aufrufen der Seite Rufen Sie zunächst in Ihrem Browser

Mehr

Folge 19 - Bäume. 19.1 Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Folge 19 - Bäume. 19.1 Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12 Grundlagen: Folge 19 - Bäume 19.1 Binärbäume - Allgemeines Unter Bäumen versteht man in der Informatik Datenstrukturen, bei denen jedes Element mindestens zwei Nachfolger hat. Bereits in der Folge 17 haben

Mehr

Adobe Photoshop. Lightroom 5 für Einsteiger Bilder verwalten und entwickeln. Sam Jost

Adobe Photoshop. Lightroom 5 für Einsteiger Bilder verwalten und entwickeln. Sam Jost Adobe Photoshop Lightroom 5 für Einsteiger Bilder verwalten und entwickeln Sam Jost Kapitel 2 Der erste Start 2.1 Mitmachen beim Lesen....................... 22 2.2 Für Apple-Anwender.........................

Mehr

Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress.

Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress. Anmeldung http://www.ihredomain.de/wp-admin Dashboard Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress. Das Dashboard gibt Ihnen eine kurze Übersicht, z.b. Anzahl der Beiträge,

Mehr

SEP 114. Design by Contract

SEP 114. Design by Contract Design by Contract SEP 114 Design by Contract Teile das zu entwickelnde Programm in kleine Einheiten (Klassen, Methoden), die unabhängig voneinander entwickelt und überprüft werden können. Einheiten mit

Mehr

Anwendungsbeispiele Buchhaltung

Anwendungsbeispiele Buchhaltung Rechnungen erstellen mit Webling Webling ist ein Produkt der Firma: Inhaltsverzeichnis 1 Rechnungen erstellen mit Webling 1.1 Rechnung erstellen und ausdrucken 1.2 Rechnung mit Einzahlungsschein erstellen

Mehr

Diese Anleitung wurde erstellt von Niclas Lüchau und Daniel Scherer. Erste Anmeldung. Schritt 1: Anmeldung..2. Schritt 2: Passwort setzen 3

Diese Anleitung wurde erstellt von Niclas Lüchau und Daniel Scherer. Erste Anmeldung. Schritt 1: Anmeldung..2. Schritt 2: Passwort setzen 3 Diese Anleitung wurde erstellt von Niclas Lüchau und Daniel Scherer Inhalt Erste Anmeldung. Schritt 1: Anmeldung..2 Schritt 2: Passwort setzen 3 Schritt 3: Nachträgliches Ändern des Passworts..4 Schreiben

Mehr

HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG

HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG it4sport GmbH HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG Stand 10.07.2014 Version 2.0 1. INHALTSVERZEICHNIS 2. Abbildungsverzeichnis... 3 3. Dokumentenumfang... 4 4. Dokumente anzeigen... 5 4.1 Dokumente

Mehr

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala Das Typsystem von Scala 1 Eigenschaften Das Typsystem von Scala ist statisch, implizit und sicher 2 Nichts Primitives Alles ist ein Objekt, es gibt keine primitiven Datentypen scala> 42.hashCode() res0:

Mehr

Kapitel 3 Frames Seite 1

Kapitel 3 Frames Seite 1 Kapitel 3 Frames Seite 1 3 Frames 3.1 Allgemeines Mit Frames teilt man eine HTML-Seite in mehrere Bereiche ein. Eine Seite, die mit Frames aufgeteilt ist, besteht aus mehreren Einzelseiten, die sich den

Mehr

Fachbericht zum Thema: Anforderungen an ein Datenbanksystem

Fachbericht zum Thema: Anforderungen an ein Datenbanksystem Fachbericht zum Thema: Anforderungen an ein Datenbanksystem von André Franken 1 Inhaltsverzeichnis 1 Inhaltsverzeichnis 1 2 Einführung 2 2.1 Gründe für den Einsatz von DB-Systemen 2 2.2 Definition: Datenbank

Mehr

Der Kalender im ipad

Der Kalender im ipad Der Kalender im ipad Wir haben im ipad, dem ipod Touch und dem iphone, sowie auf dem PC in der Cloud einen Kalender. Die App ist voreingestellt, man braucht sie nicht laden. So macht es das ipad leicht,

Mehr

Web-Kürzel. Krishna Tateneni Yves Arrouye Deutsche Übersetzung: Stefan Winter

Web-Kürzel. Krishna Tateneni Yves Arrouye Deutsche Übersetzung: Stefan Winter Krishna Tateneni Yves Arrouye Deutsche Übersetzung: Stefan Winter 2 Inhaltsverzeichnis 1 Web-Kürzel 4 1.1 Einführung.......................................... 4 1.2 Web-Kürzel.........................................

Mehr

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken. Seite erstellen Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken. Es öffnet sich die Eingabe Seite um eine neue Seite zu erstellen. Seiten Titel festlegen Den neuen

Mehr

Programmierkurs Java

Programmierkurs Java Programmierkurs Java Dr. Dietrich Boles Aufgaben zu UE16-Rekursion (Stand 09.12.2011) Aufgabe 1: Implementieren Sie in Java ein Programm, das solange einzelne Zeichen vom Terminal einliest, bis ein #-Zeichen

Mehr

Kommunikations-Management

Kommunikations-Management Tutorial: Wie importiere und exportiere ich Daten zwischen myfactory und Outlook? Im vorliegenden Tutorial lernen Sie, wie Sie in myfactory Daten aus Outlook importieren Daten aus myfactory nach Outlook

Mehr

Kurzanleitung. MEYTON Aufbau einer Internetverbindung. 1 Von 11

Kurzanleitung. MEYTON Aufbau einer Internetverbindung. 1 Von 11 Kurzanleitung MEYTON Aufbau einer Internetverbindung 1 Von 11 Inhaltsverzeichnis Installation eines Internetzugangs...3 Ist mein Router bereits im MEYTON Netzwerk?...3 Start des YAST Programms...4 Auswahl

Mehr

Anlegen eines DLRG Accounts

Anlegen eines DLRG Accounts Anlegen eines DLRG Accounts Seite 1 von 6 Auf der Startseite des Internet Service Centers (https:\\dlrg.de) führt der Link DLRG-Account anlegen zu einer Eingabemaske, mit der sich jedes DLRG-Mitglied genau

Mehr

Anleitung über den Umgang mit Schildern

Anleitung über den Umgang mit Schildern Anleitung über den Umgang mit Schildern -Vorwort -Wo bekommt man Schilder? -Wo und wie speichert man die Schilder? -Wie füge ich die Schilder in meinen Track ein? -Welche Bauteile kann man noch für Schilder

Mehr

Excel Pivot-Tabellen 2010 effektiv

Excel Pivot-Tabellen 2010 effektiv 7.2 Berechnete Felder Falls in der Datenquelle die Zahlen nicht in der Form vorliegen wie Sie diese benötigen, können Sie die gewünschten Ergebnisse mit Formeln berechnen. Dazu erzeugen Sie ein berechnetes

Mehr

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Objektorientierte Programmierung für Anfänger am Beispiel PHP Objektorientierte Programmierung für Anfänger am Beispiel PHP Johannes Mittendorfer http://jmittendorfer.hostingsociety.com 19. August 2012 Abstract Dieses Dokument soll die Vorteile der objektorientierten

Mehr

Sich einen eigenen Blog anzulegen, ist gar nicht so schwer. Es gibt verschiedene Anbieter. www.blogger.com ist einer davon.

Sich einen eigenen Blog anzulegen, ist gar nicht so schwer. Es gibt verschiedene Anbieter. www.blogger.com ist einer davon. www.blogger.com Sich einen eigenen Blog anzulegen, ist gar nicht so schwer. Es gibt verschiedene Anbieter. www.blogger.com ist einer davon. Sie müssen sich dort nur ein Konto anlegen. Dafür gehen Sie auf

Mehr

Bauteilattribute als Sachdaten anzeigen

Bauteilattribute als Sachdaten anzeigen Mit den speedikon Attributfiltern können Sie die speedikon Attribute eines Bauteils als MicroStation Sachdaten an die Elemente anhängen Inhalte Was ist ein speedikon Attribut?... 3 Eigene Attribute vergeben...

Mehr

Wo möchten Sie die MIZ-Dokumente (aufbereitete Medikamentenlisten) einsehen?

Wo möchten Sie die MIZ-Dokumente (aufbereitete Medikamentenlisten) einsehen? Anleitung für Evident Seite 1 Anleitung für Evident-Anwender: Einbinden der MIZ-Dokumente in Evident. Wo möchten Sie die MIZ-Dokumente (aufbereitete Medikamentenlisten) einsehen? Zunächst müssen Sie entscheiden,

Mehr

Access und die andern (Office) Programme. Armin Hess

Access und die andern (Office) Programme. Armin Hess Access und die andern (Office) Programme Armin Hess Was wir wollen Excel, Word, Powerpoint und andere Programme von Access aus fernsteuern Grundlagen Excel, Word, Powerpoint und andere Programme präsentieren

Mehr

Einkaufslisten verwalten. Tipps & Tricks

Einkaufslisten verwalten. Tipps & Tricks Tipps & Tricks INHALT SEITE 1.1 Grundlegende Informationen 3 1.2 Einkaufslisten erstellen 4 1.3 Artikel zu einer bestehenden Einkaufsliste hinzufügen 9 1.4 Mit einer Einkaufslisten einkaufen 12 1.4.1 Alle

Mehr

Zur drittletzten Zeile scrollen

Zur drittletzten Zeile scrollen 1 Fragen und Antworten zur Computerbedienung Thema : Zur drittletzten Zeile scrollen Thema Stichwort Programm Letzte Anpassung Zur drittletzten Zeile scrollen Scrollen VBA Excel 1.02.2014 Kurzbeschreibung:

Mehr

FlowFact Alle Versionen

FlowFact Alle Versionen Training FlowFact Alle Versionen Stand: 29.09.2005 Rechnung schreiben Einführung Wie Sie inzwischen wissen, können die unterschiedlichsten Daten über verknüpfte Fenster miteinander verbunden werden. Für

Mehr

Outlook Vorlagen/Templates

Outlook Vorlagen/Templates Joachim Meyn Outlook Vorlagen/Templates Erstellen Sie Vorlagen bzw. Templates in Outlook Joachim Meyn 27.03.2013 Inhaltsverzeichnis Outlook Vorlagen (.oft Dateien)... 2 Vorbereitung... 2 Anlegen einer

Mehr

1. Zuerst muss der Artikel angelegt werden, damit später die Produktvarianten hinzugefügt werden können.

1. Zuerst muss der Artikel angelegt werden, damit später die Produktvarianten hinzugefügt werden können. Produktvarianten und Downloads erstellen Produktvarianten eignen sich um Artikel mit verschiedenen Optionen wie bspw. ein Herrenhemd in den Farben blau, grün und rot sowie in den Größen S, M und L zu verkaufen.

Mehr

Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken

Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken Dateiname: ecdl5_01_00_documentation_standard.doc Speicherdatum: 14.02.2005 ECDL 2003 Basic Modul 5 Datenbank - Grundlagen

Mehr

Abwesenheitsnotiz im Exchangeserver 2010

Abwesenheitsnotiz im Exchangeserver 2010 Abwesenheitsnotiz im Exchangeserver 2010 Richten sie die Abwesenheitsnotiz in Outlook 2010 ein und definieren sie, dass nur Absender eine Nachricht bekommen, die ihnen direkt eine Mail gesendet haben.

Mehr

Nach der Anmeldung im Backend Bereich landen Sie im Kontrollzentrum, welches so aussieht:

Nach der Anmeldung im Backend Bereich landen Sie im Kontrollzentrum, welches so aussieht: Beiträge erstellen in Joomla Nach der Anmeldung im Backend Bereich landen Sie im Kontrollzentrum, welches so aussieht: Abbildung 1 - Kontrollzentrum Von hier aus kann man zu verschiedene Einstellungen

Mehr

Kostenstellen verwalten. Tipps & Tricks

Kostenstellen verwalten. Tipps & Tricks Tipps & Tricks INHALT SEITE 1.1 Kostenstellen erstellen 3 13 1.3 Zugriffsberechtigungen überprüfen 30 2 1.1 Kostenstellen erstellen Mein Profil 3 1.1 Kostenstellen erstellen Kostenstelle(n) verwalten 4

Mehr

E-Mails zu Hause lesen

E-Mails zu Hause lesen E-Mails zu Hause lesen Einrichten eines neuen Kontos mit der E-Mail-Client-Software Microsoft Outlook Express Outlook ist standardmäßig auf jedem Windows-PC installiert. Alle Schritte, die wir jetzt machen,

Mehr

ARCO Software - Anleitung zur Umstellung der MWSt

ARCO Software - Anleitung zur Umstellung der MWSt ARCO Software - Anleitung zur Umstellung der MWSt Wieder einmal beschert uns die Bundesverwaltung auf Ende Jahr mit zusätzlicher Arbeit, statt mit den immer wieder versprochenen Erleichterungen für KMU.

Mehr

Was man mit dem Computer alles machen kann

Was man mit dem Computer alles machen kann Was man mit dem Computer alles machen kann Wie komme ich ins Internet? Wenn Sie einen Computer zu Hause haben. Wenn Sie das Internet benutzen möchten, dann brauchen Sie ein eigenes Programm dafür. Dieses

Mehr

40-Tage-Wunder- Kurs. Umarme, was Du nicht ändern kannst.

40-Tage-Wunder- Kurs. Umarme, was Du nicht ändern kannst. 40-Tage-Wunder- Kurs Umarme, was Du nicht ändern kannst. Das sagt Wikipedia: Als Wunder (griechisch thauma) gilt umgangssprachlich ein Ereignis, dessen Zustandekommen man sich nicht erklären kann, so dass

Mehr

TeamSpeak3 Einrichten

TeamSpeak3 Einrichten TeamSpeak3 Einrichten Version 1.0.3 24. April 2012 StreamPlus UG Es ist untersagt dieses Dokument ohne eine schriftliche Genehmigung der StreamPlus UG vollständig oder auszugsweise zu reproduzieren, vervielfältigen

Mehr

Urlaubsregel in David

Urlaubsregel in David Urlaubsregel in David Inhaltsverzeichnis KlickDown Beitrag von Tobit...3 Präambel...3 Benachrichtigung externer Absender...3 Erstellen oder Anpassen des Anworttextes...3 Erstellen oder Anpassen der Auto-Reply-Regel...5

Mehr

Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0)

Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0) Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0) Peter Koos 03. Dezember 2015 0 Inhaltsverzeichnis 1 Voraussetzung... 3 2 Hintergrundinformationen... 3 2.1 Installationsarten...

Mehr

Roundcube Webmail Kurzanleitung

Roundcube Webmail Kurzanleitung Roundcube Webmail Kurzanleitung Roundcube Webmail ist ein IMAP Client, der als Schnittstelle zu unserem E-Mail-Server dient. Er hat eine Oberfläche, die E-Mail-Programmen für den Desktop ähnelt. Öffnen

Mehr

esms - sms senden & empfangen mit Outlook

esms - sms senden & empfangen mit Outlook esms - sms senden & empfangen mit Outlook Einrichten der SMS Terminerinnerung für Microsoft Outlook 2007/10 Inhalt Einleitung... 1 1 SMS Terminerinnerung einrichten... 2 1.1 Beim Service esms anmelden...

Mehr

Installationsanleitung

Installationsanleitung Idee und Umsetzung Lars Lakomski Version 4.0 Installationsanleitung Um Bistro-Cash benutzen zu können, muss auf dem PC-System (Windows 2000 oder Windows XP), wo die Kassensoftware zum Einsatz kommen soll,

Mehr

Individuelle Formulare

Individuelle Formulare Individuelle Formulare Die Vorlagen ermöglichen die Definition von Schnellerfassungen für die Kontenanlage sowie für den Im- und Export von Stammdaten. Dabei kann frei entschieden werden, welche Felder

Mehr

Aufklappelemente anlegen

Aufklappelemente anlegen Aufklappelemente anlegen Dieses Dokument beschreibt die grundsätzliche Erstellung der Aufklappelemente in der mittleren und rechten Spalte. Login Melden Sie sich an der jeweiligen Website an, in dem Sie

Mehr

Bedienungsanleitung. Matthias Haasler. Version 0.4. für die Arbeit mit der Gemeinde-Homepage der Paulus-Kirchengemeinde Tempelhof

Bedienungsanleitung. Matthias Haasler. Version 0.4. für die Arbeit mit der Gemeinde-Homepage der Paulus-Kirchengemeinde Tempelhof Bedienungsanleitung für die Arbeit mit der Gemeinde-Homepage der Paulus-Kirchengemeinde Tempelhof Matthias Haasler Version 0.4 Webadministrator, email: webadmin@rundkirche.de Inhaltsverzeichnis 1 Einführung

Mehr

Zwischenablage (Bilder, Texte,...)

Zwischenablage (Bilder, Texte,...) Zwischenablage was ist das? Informationen über. die Bedeutung der Windows-Zwischenablage Kopieren und Einfügen mit der Zwischenablage Vermeiden von Fehlern beim Arbeiten mit der Zwischenablage Bei diesen

Mehr