Konsola dzialania programu

0

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.

0

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.

0

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.

0

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 ...

0

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?

0
  1. W formie z "konsolą" (np. ConsoleForm) zrób sobie publiczną metodę Write(string s albo coś w tym stylu.
  2. W formie głównej zadeklaruj pole typu ConsoleForm (o nazwie np. console).
  3. Przy uruchomieniu (czy kiedy tam chcesz) formy głównej utwórz i wyświetl (Show()) okno "konsoli".
  4. Potem wystarczy w odpowiednim miejscu wywołać this.console.Write("komunikat").
0

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.

0

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?

1

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1