2009-04-07 7 views
0

Voir aussi: How to enable a timer from a different thread/classComment accéder à une minuterie d'une autre classe en C#

La minuterie est affectée à une forme et je voudrais Permettre à un endroit précis, mais d'une autre classe. Je ne veux pas le rendre public

Voici le code que j'utilise pour l'accès mémo

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; 
    } 

Répondre

2

Comment aimeriez-vous activer la minuterie? Quelle action est entreprise pour l'activer?

Est-il possible d'ajouter un événement à la classe à partir de laquelle vous voulez activer le temporisateur, et, sur le formulaire qui contient le temporisateur, vous abonner à cet événement? Dans le gestionnaire d'événements de cet événement, vous pouvez activer le temporisateur.

Lorsque l'autre classe déclenche l'événement, le gestionnaire d'événements active le temporisateur.

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; 
    } 
} 

Quelque chose comme ça. (Je n'ai pas testé, et je ne l'ai même pas compilé, mais je pense que vous allez attraper la dérive :)).

+0

"SomethingHappened;" est faux.Je suis désolé, je n'ai jamais écrit les événements à la main.La ligne doit avoir deux paramètres (expéditeur d'objet et EventArgs e) .Quels paramètres dois-je passer? –

+0

Problème 2, DoStuff() est non seulement public, mais statique dans mon code. Je ne peux pas accéder à SomethingHappened si la méthode est statique. –

+0

Comme dit, je n'ai pas compilé :) Vous pouvez simplement passer cela et EventArgs.Empty lorsque vous augmentez l'événement. Peut-être que vous pouvez aussi rendre l'événement statique (si ce n'est pas possible), mais je devrais vérifier s'il est nécessaire d'avoir une 'DoStuff' statique. –

1

Faire la minuterie « interne », alors il est accessible à d'autres classes dans l'assemblée.

+0

Oui, il peut être accessible à d'autres classes, mais si les autres classes modifient la propriété Enable à true, le temporisateur n'est toujours pas Tick(). –

3

Si vous ne souhaitez pas exposer la minuterie elle-même, exposez une méthode public ou une propriété que vous pouvez appeler pour activer la minuterie. Évidemment, le Form qui active le Timer aura besoin d'une référence au Form qui possède le Timer.

+0

Cela signifie toujours que l'autre classe doit avoir une référence au formulaire qui contient le temporisateur. –

+0

Et? Ce n'est pas le problème. Le problème est un désir d'activer la minuterie sans exposer la minuterie elle-même. –

0

Vous pouvez ajouter une méthode d'accesseur à Enable the timer, cela vous permettrait de garder le timer privé mais de rendre la méthode publique, cela fonctionnerait-il?

En outre, vous pourriez regarder à faire l'accesseur protected ou internal, selon qui l'appelle il peut ne pas avoir besoin d'être public.

Questions connexes