2009-04-07 21 views
0

zugreifen Siehe auch: How to enable a timer from a different thread/classWie ein Timer von einer anderen Klasse in C#

Der Timer zu einem Formular zugeordnet ist, und ich möchte es an einem bestimmten Ort aktivieren, sondern von einer anderen Klasse. Ich will nicht, um es

Dies ist der Code, den ich für den Zugriff Memo

public string TextValue 
    { 
     set 
     { 
      if (this.Memo.InvokeRequired) 
      { 
       this.Invoke((MethodInvoker)delegate 
       { 
        this.Memo.Text += value + "\n"; 
       }); 
      } 
      else 
      { 
       this.Memo.Text += value + "\n"; 
      } 
     } 
    } 

    public static void addtxt(string txt) 
    { 
     var form = Form.ActiveForm as Form1; 
     if(form != null) 
      form.TextValue = txt; 
    } 

Antwort

2

Wie möchten Sie den Timer aktivieren? Welche Maßnahmen werden unternommen, um dies zu ermöglichen?

Ist es möglich, der Klasse, von der Sie den Timer aktivieren möchten, ein Ereignis hinzuzufügen, und auf dem Formular, das den Timer enthält, dieses Ereignis zu abonnieren? Im Event-Handler für dieses Ereignis können Sie dann den Timer aktivieren.

Wenn die andere Klasse das Ereignis auslöst, aktiviert der Eventhandler den Timer.

public class SomeOtherClassThatDoesStuff 
{ 
    public event EventHandler SomethingHappened; 

    public void DoStuff() 
    { 
     ... 
     if(SomethingHappened != null) 
     SomethingHappened; 
     ... 
    } 
} 

public class Form1 
{ 

    private void Button1_Click(object sender, EventArgs e) 
    { 

     SomeOtherClassThatDoesStuff o = new SomeOtherClassThatDoesStuff(); 
     o.SomethingHappened += new EventHandler(EnableTimer); 

     o.DoStuff(); 
    } 

    private void EnableTimer(object sender, EventArgs e) 
    { 
     myTimer.Enabled = true; 
    } 
} 

So etwas wie das. (Ich habe es nicht getestet, noch habe ich es selbst kompiliert, aber ich denke, du wirst die Abweichung abfangen :)).

+0

"Etwas geschah"; ist falsch. Es tut mir leid, dass ich nie Ereignisse von Hand schrieb. Die Linie muss zwei Parameter haben (Gegenstandsabsender und EventArgs e). Welche Parameter sollte ich führen? –

+0

Problem 2, DoStuff() ist nicht nur öffentlich, sondern in meinem Code statisch. Ich kann nicht auf SomethingHappened zugreifen, wenn die Methode statisch ist. –

+0

Wie gesagt, ich habe nicht kompiliert :) Sie können dies und EventArgs.Empty einfach übergeben, wenn das Ereignis ausgelöst wird. Vielleicht können Sie das Ereignis auch statisch machen (ich weiß nicht, ob das möglich ist), aber ich sollte prüfen, ob "DoStuff" statisch sein muss. –

1

Machen Sie den Timer „intern“ dann ist es auch für andere Klassen in der Versammlung zugänglich verwenden öffentlich machen.

+0

Ja, es könnte für andere Klassen zugänglich sein, aber wenn die anderen Klassen die Enable-Eigenschaft auf true setzen, tickt der Timer immer noch nicht Tick(). –

3

Wenn Sie den Zeitgeber selbst nicht verfügbar machen möchten, legen Sie eine public-Methode oder -Eigenschaft offen, die Sie aufrufen können, um den Zeitgeber zu aktivieren. Offensichtlich benötigt die Form, die den Timer aktiviert, einen Verweis auf die Form, die die Timer besitzt.

+0

Dies bedeutet immer noch, dass die andere Klasse einen Verweis auf das Formular haben muss, das den Timer enthält. –

+0

Und? Das ist nicht das Problem. Das Problem besteht darin, den Timer zu aktivieren, ohne den Timer selbst zu belichten. –

0

Sie könnten eine Accessormethode hinzufügen, um den Timer zu aktivieren, dies würde es Ihnen ermöglichen, den Timer privat zu halten, aber die Methode öffentlich zu machen, würde das funktionieren?

Auch können Sie den Accessor protected oder internal machen, je nachdem, wer es anruft, muss es nicht öffentlich sein.

Verwandte Themen