objektbenachrichtigung Delegat event

23/03/2008 - 14:44 von khchrist | Report spam
Guten Tag
ich habe folgendes Problem.
Ich habe ein Fenster für eine Logdatei, welches zu Beginn ein Logfile von
der Platte einliest.
Im Programm verstreut ( insbesondere innerhalb einer komplexen Import Klasse
von Excel files ) sind Aurufe einer Logfile methode addText, die Meldungen
an das Logfile anhàngen. ( Diese Klasse ist getrennt von dem LogfileWindow
welche das File anzeigt )

Wie erreiche ich, dass das Logfile-Fenster immer dann und nur dann
aktualisiert wird wenn die Methode addText aufgerufen wird. Ich habe es
schon über delegates und Events versucht. Obgleich ich nicht sehr versiert
darin bin, denke ich, dass es nicht damit geht, da die Objekte ja
voneinander keine Kenntnis haben.

Alle Beispiele, die ich bislang gelesen habe gehen davon aus, dass innerhalb
eines Objektes ein anderes definiert wird welches dann mittels callback oder
event in Kenntnis gesetzt wird. Hier liegt allesdings der Fall vor, das die
beiden Objekte eben nicht in dieser Weise verbunden sind. Ich möchte das
Logfenster separat öffen, jedoch trotzdem erreichen, das es auf
Logfileverànderungen reagiert, die von der AddText methode verursacht
werden.

herzlichen Dank für jede Hilfe. Sollte es sich um eine typische FAQ handeln
bitte ich mich auf eine selbige zu verweisen.

Karl-heinz Christ
 

Lesen sie die antworten

#1 Gilles Kohl [MVP]
23/03/2008 - 18:23 | Warnen spam
On Sun, 23 Mar 2008 14:44:14 +0100, "khchrist" wrote:

Guten Tag
ich habe folgendes Problem.
Ich habe ein Fenster für eine Logdatei, welches zu Beginn ein Logfile von
der Platte einliest.
Im Programm verstreut ( insbesondere innerhalb einer komplexen Import Klasse
von Excel files ) sind Aurufe einer Logfile methode addText, die Meldungen
an das Logfile anhàngen. ( Diese Klasse ist getrennt von dem LogfileWindow
welche das File anzeigt )

Wie erreiche ich, dass das Logfile-Fenster immer dann und nur dann
aktualisiert wird wenn die Methode addText aufgerufen wird. Ich habe es
schon über delegates und Events versucht. Obgleich ich nicht sehr versiert
darin bin, denke ich, dass es nicht damit geht, da die Objekte ja
voneinander keine Kenntnis haben.

Alle Beispiele, die ich bislang gelesen habe gehen davon aus, dass innerhalb
eines Objektes ein anderes definiert wird welches dann mittels callback oder
event in Kenntnis gesetzt wird. Hier liegt allesdings der Fall vor, das die
beiden Objekte eben nicht in dieser Weise verbunden sind. Ich möchte das
Logfenster separat öffen, jedoch trotzdem erreichen, das es auf
Logfileverànderungen reagiert, die von der AddText methode verursacht
werden.



So könnte es mit Events klappen:

- Spendiere eine von EventArgs abgeleitete Klasse LogInfoEventArgs, welche die
Informationen enthàlt die das LogfileWindow interessieren (z.B. der
hinzugefügte Text). Beispiel s.u.

- Unterscheide zwischen Produzenten von "LogInfo" und Konsumenten. Die Klasse
"LogFile" mit der Methode "AddText" ist der Produzent. Dieser bietet - über
das event - allen Interessierten die Möglichkeit sich zu "abonnieren". (oder
"abonniert zu werden", der Traum der Drückerbrigagen :-)

Spendiere ein event

public event EventHandler<LogInfoAddedEventArgs> LogInfoAdded;

über welches Interessenten über neue Eintràge informiert werden.

- Der Konsument (das Logfile-Fenster) braucht eine Methode

public void LogInfoAdded(object sender, LogInfoAddedEventArgs args)

(Signatur entsprechend dem Event-Muster)

Jetzt fehlt nur noch die Verdrahtung - die muss aber nicht zwangsweise
_innerhalb_ des Logfile-Fensters passieren, die kann auch jemand "obendrüber"
übernehmen, der beide kennt.

(zugegebenermassen simples) Beispiel für so einen "Kuppler":

LogInfoPublisher publisher = new LogInfoPublisher();
LogInfoConsumer consumer = new LogInfoConsumer();

publisher.LogInfoAdded += consumer.LogInfoAdded;

Hier nochmal das Ganze als eigenstàndige Konsolapplikation im Überblick:

using System;

namespace SomeNamespace
{
class LogInfoAddedEventArgs : EventArgs
{
public string LogInfo { get; private set; }

public LogInfoAddedEventArgs(string newLogInfo)
{
LogInfo = newLogInfo;
}
}

class LogInfoPublisher
{
public event EventHandler<LogInfoAddedEventArgs> LogInfoAdded;

protected virtual void OnLogInfoAdded(LogInfoAddedEventArgs
logInfoAddedArgs)
{
EventHandler<LogInfoAddedEventArgs> handler = LogInfoAdded;
if(handler != null)
{
handler(this, logInfoAddedArgs);
}
}

public void AddText(string text)
{
// hier Text z.B. in Datei schreiben
// Abonnenten informieren
OnLogInfoAdded(new LogInfoAddedEventArgs(text));
}
}

class LogInfoConsumer
{
public void LogInfoAdded(object sender, LogInfoAddedEventArgs args)
{
Console.WriteLine("Log info got added: {0}", args.LogInfo);
}
}

class Program
{
static void Main()
{
LogInfoPublisher publisher = new LogInfoPublisher();
LogInfoConsumer consumer = new LogInfoConsumer();

publisher.LogInfoAdded += consumer.LogInfoAdded;

publisher.AddText("Hallo Welt");
Console.ReadKey();
}
}
}

Viele Grüße,
Gilles.

Ähnliche fragen