using System; using System.Windows.Forms; // Beispielaufruf: // // new DelayedCall(new DelayedCall.Function(EineFunktion), 500); // // In .NET 2.0 funktioniert auch das: // // new DelayedCall(EineFunktion, 500); // // Funktion mit einem Parameter (muss vom Typ object sein): // // new DelayedCall(FunktionMitParameter, 500, argument1); namespace Unclassified { public class DelayedCall { public delegate void Function(); public delegate void Function1(object data1); public event Function myEvent = null; public event Function1 myEvent1 = null; private Timer timer; private object _data1; private ushort paramCount = 0; /// /// Ruft eine Funktion einmalig zu einem späteren Zeitpunkt auf /// /// Aufzurufende Funktion public DelayedCall(Function function) { myEvent = function; paramCount = 0; timer = new Timer(); timer.Tick += new EventHandler(this.Event); } /// /// Ruft eine Funktion einmalig zu einem späteren Zeitpunkt auf /// /// Aufzurufende Funktion /// Verzögerung in Millisekunden public DelayedCall(Function function, int delay) { myEvent = function; paramCount = 0; timer = new Timer(); timer.Tick += new EventHandler(this.Event); if (delay > 0) { timer.Interval = delay; timer.Start(); } } /// /// Ruft eine Funktion einmalig zu einem späteren Zeitpunkt auf /// /// Aufzurufende Funktion /// Der Parameter der Funktion public DelayedCall(Function1 function, object data) { myEvent1 = function; paramCount = 1; _data1 = data; timer = new Timer(); timer.Tick += new EventHandler(this.Event1); } /// /// Ruft eine Funktion einmalig zu einem späteren Zeitpunkt auf /// /// Aufzurufende Funktion /// Verzögerung in Millisekunden /// Der Parameter der Funktion public DelayedCall(Function1 function, int delay, object data) { myEvent1 = function; paramCount = 1; _data1 = data; timer = new Timer(); timer.Tick += new EventHandler(this.Event1); if (delay > 0) { timer.Interval = delay; timer.Start(); } } /// /// Ermittelt, ob der Timer noch läuft. /// public bool IsWaiting { get { return timer.Enabled; } } /// /// Bricht den DelayedCall ab. /// public void Cancel() { timer.Stop(); } /// /// Bricht den Timer ab und führt den DelayedCall sofort aus. /// public void Fire() { if (paramCount == 0) Event(null, null); else if (paramCount == 1) Event1(null, null); } /// /// Startet den Timer erneut. /// public void Reset() { timer.Stop(); timer.Start(); } /// /// Startet den Timer erneut mit einem neuen Zeitwert. /// /// Verzögerung in Millisekunden public void Reset(int delay) { timer.Stop(); if (delay > 0) { timer.Interval = delay; timer.Start(); } } /// /// Startet den Timer erneut mit einem neuen Parameter. /// public void Reset(object data) { timer.Stop(); _data1 = data; timer.Start(); } /// /// Startet den Timer erneut mit einem neuen Zeitwert und einem neuen Parameter. /// public void Reset(int delay, object data) { timer.Stop(); _data1 = data; if (delay > 0) { timer.Interval = delay; timer.Start(); } } /// /// Setzt einen neuen Zeitwert, ohne den Timer zu starten. /// public void SetTimeout(int delay) { timer.Interval = delay; } private void Event(object o, System.EventArgs e) { // If the timer was already stopped a very short time ago (but the WM_TIMER was // still in the window's message queue), don't fire the event. We can definitely // check this here. if (!timer.Enabled) return; timer.Stop(); // TODO: Test what happens if this call throws an exception - is it passed on or dropped? //try //{ myEvent(); //} //catch (Exception ex) //{ // MessageBox.Show(ex.ToString(), "DelayedCall Exception", MessageBoxButtons.OK, MessageBoxIcon.Error); //} } private void Event1(object o, System.EventArgs e) { // If the timer was already stopped a very short time ago (but the WM_TIMER was // still in the window's message queue), don't fire the event. We can definitely // check this here. if (!timer.Enabled) return; timer.Stop(); //try //{ myEvent1(_data1); //} //catch (Exception ex) //{ // MessageBox.Show(ex.ToString(), "DelayedCall Exception", MessageBoxButtons.OK, MessageBoxIcon.Error); //} } } }