Niektóre programy maja wbudowana taka konsole, która rejestruje działanie programu np. wykonanie jakiegoś zadania, pobranie aktualizacji itp. Wiecie jak zrobić takie coś? Wstawiał bym w kodzie programu np. debugconsole.write("wykonano funkcje xyz") i wtedy w konsoli byłoby widoczne ze wykonała się funkcja xyz. Najważniejsze żeby ta konsola sama rejestrowała zdarzenia automatycznie.
Co prawda nie wiem jak zrobić taką konsolę, ale jeśli potrzebne ci to tylko do debuggowania, to możesz użyć System.Diagnostics.WriteLine("text"); i będziesz widział to w oknie "Output" w VS.
Wlasnie mi chodzi o to zeby utworzyc jakas nowa forme i dac uzytkownikowi mozliwosc podgladu tego co wyswietla sie w oknie "Output" gdy wstawie System.Diagnostics.WriteLine("text") w kodzie.
Nie jestem biegły w C#, ale chyba sam już sobie odpowiedziałeś: dać nową formę, na nią jakiegoś listbox czy co tam jest w C# i dodawać do niej wpisy w odpowiednich miejscach twojego kodu ...
No wlasnie tez myslalem o nowej formie a w niej o statycznej metodzie. Tylko teraz jak odwolywac sie do tej nowej formy w glownej? Za kazdym razem przed dodaniem nowej lini to konsoli wywolywac konstruktor (Debug debug = new Debug)? Co jesli w glownej formie otworze druga forme i ona tez ma cos zapisywac do konsoli, czy w takim wypadku w niej tez tworzyc obiekt tej konsoli?
- W formie z "konsolą" (np.
ConsoleForm
) zrób sobie publiczną metodęWrite(string s
albo coś w tym stylu. - W formie głównej zadeklaruj pole typu
ConsoleForm
(o nazwie np.console
). - Przy uruchomieniu (czy kiedy tam chcesz) formy głównej utwórz i wyświetl (
Show()
) okno "konsoli". - Potem wystarczy w odpowiednim miejscu wywołać
this.console.Write("komunikat")
.
Czemu ludzie nie używają System.Diagnostics.Trace? To taka fajna klasa, dopisujesz sobie odpowiedniego listenera i masz niezależne api do zapisu jakiś informacji/logów. Zamiast tworzyć autorskie koło, które w najlepszym wypadku przypomina elipsę. Lub użyj z EntLib Logging Application Block, który pod spodem używa i tak trace etc.
Albo log4net. Zasada podobna do trace i listenerów, tylko inaczej to nazwali.
Używałem rozwiązań opartych o to w kilku projektach i kiedy było to z głową zrobione, było rewelacyjnym rozwiązaniem.
Główna forma:
namespace TestApp
{
public partial class Main : Form
{
DebugForm debugForm = new DebugForm();
public Main()
{
InitializeComponent();
}
private void Method1()
{
//jakis kod
debugForm.Write_Line("Test123");
}
private void Method2()
{
//jakis kod
debugForm.Write_Line("Test123");
}
}
}
Forma konsoli:
namespace TestApp
{
public partial class DebugForm : Form
{
public DebugForm()
{
InitializeComponent();
}
public void Write_Line(string line)
{
richTextBox1.Text += DateTime.Now.ToString("HH:mm:ss") + " ::: " + line + "\n";
}
}
}
Czy o takie rozwiązanie chodziło?
massther napisał(a)
Czemu ludzie nie używają System.Diagnostics.Trace? To taka fajna klasa, dopisujesz sobie odpowiedniego listenera i masz niezależne api do zapisu jakiś informacji/logów. Zamiast tworzyć autorskie koło, które w najlepszym wypadku przypomina elipsę. Lub użyj z EntLib Logging Application Block, który pod spodem używa i tak trace etc.
Albo log4net. Zasada podobna do trace i listenerów, tylko inaczej to nazwali.Używałem rozwiązań opartych o to w kilku projektach i kiedy było to z głową zrobione, było rewelacyjnym rozwiązaniem.
Jak zrobić żeby zapisywało te informacje do np. richtextboxa na innej formie?
Mi nie o takie. Napisałem aby napisać własnego listenera.
public class FormListener : System.Diagnostics.TraceListener
{
static FormListenerWindow f = null;
public FormListener()
: base()
{
Init();
}
public FormListener(string name)
: base(name)
{
Init();
}
private void Init()
{
f = new FormListenerWindow();
f.Show();
}
public override void Write(string message)
{ }
public override void WriteLine(string message)
{
f.WriteLine(message); // moj formularz ma metodę puliczną - public void WriteLine(string message) { listBox1.Items.Insert(0, message); }
}
}
a w configu np. tak
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.diagnostics>
<trace>
<listeners>
<add name="fl" type="WinForm_Listener.FormListener, WinForm_Listener, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" initializeData="false" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
Oczywiście to najprostsza wersja i optymistyczna. Należy zabezpieczyć się przed modyfikacją gui z innych wątków oraz pomyśleć nad sensowym pokazywaniem tej formy, która wyświetla "konsole".
Aby lepiej sterować tym co i jak się wyświetla użyj TraceSource i/lub TraceSwitch.