classes imbriquées et protection
Bonjour à tous.
J'essaie de réaliser une boite de texte de "Debug" (classique je pense): c'est une richTextBox dans laquelle je souhaite pouvoir envoyer
1. ce qui sort normalement sur la console (Console.Writeline(string)),
2. ce que j'y envoie avec Trace.WriteLine(string)
3. d'autres trucs que je pourrais rajouter...
Pour 1. j'ai un champ TextWriter sur lequel je dirige la sortie console (Console.SetOut(TextWriter) je crois)
Pour 2. j'ai un Listener que j'hérite de TraceListener...
Tout ça marche bien mais là j'essaie de mettre tout ça dans un seul composant comme ça j'aurai pas à me fatiguer à tout refaire le prochain coup :king:
voici le code (sous VS2008):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
|
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
namespace myHandyControls
{
public partial class DebugWindow : UserControl
{
public TextListener Listener;
public FeedBackWriter ConsoleRedirect;
private class TextListener : TraceListener
{
private DebugWindow enclosingClass;
public TextListener(DebugWindow enclosingClass)
{
this.enclosingClass = enclosingClass;
}
public override void Write(string message)
{
enclosingClass.Write(message);
}
public override void WriteLine(string message)
{
enclosingClass.WriteLine(message);
}
}
private class FeedBackWriter : TextWriter
{
private DebugWindow enclosingClass;
public FeedBackWriter(DebugWindow enclosingClass)
{
this.enclosingClass = enclosingClass;
}
public override Encoding Encoding
{
get { return Encoding.Default; }
}
public override void Write(string message)
{
enclosingClass.Write(message);
}
public override void WriteLine(string message)
{
enclosingClass.WriteLine(message);
}
}
public DebugWindow()
{
InitializeComponent();
Listener = new TextListener(this);
ConsoleRedirect = new FeedBackWriter(this);
}
private void Write(string message)
{
if (outputBox.InvokeRequired)
{
outputBox.BeginInvoke(new Invoker(Write), message);
return;
}
else
{
outputBox.ScrollToCaret();
outputBox.AppendText(message);
}
}
private void WriteLine(string message)
{
if (outputBox.InvokeRequired)
{
outputBox.InvokeRequired(new Invoker(WriteLine), message);
return;
}
else
{
Write(message);
outputBox.AppendText("\n");
}
}
private delegate void Invoker(string aString);
}
} |
tel quel ça compile pas.
En fait j'aimerai qu'un client de DebugWindow ne puisse pas instancier TextListener ni FeedBackWriter donc c'est "private".
Sauf que le compilo en veut pas :bug: :
Code:
Erreur 1 Accessibilité incohérente*: le type de champ 'myHandyControls.DebugWindow.TextListener' est moins accessible que le champ 'myHandyControls.DebugWindow.Listener'
et idem pour l'autre classe "private".
Comment faire pour que mes classes imbriquées soient cachées au client mais que des instances de ces classes puissent être utilisables de l'extérieur ?
Merci.