Przekazanie komunikatów z metody w innej klasie do formularza

0

Sama nie wiem jaki nadać tytuł. Lepiej wytłumaczę o co mi chodzi:
Mam program, który w zależności od argumentu (tutaj za argument programu robi zmienna visible) uruchomi się albo konsolowo albo z formą.

static class Program
{
   
    [STAThread]
    static void Main()
    {
        bool visible = false;

        if (visible)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
        else
        {
            MyHardWorker();
        }          
    }

    public static void MyHardWorker()
    {
        Console.WriteLine("Początek");
        Thread.Sleep(2000);
        Console.WriteLine("Środek");
        Thread.Sleep(2000);
        Console.WriteLine("Koniec");
    }
}

Na formie mam button i np richtextbox. Chiałabym wywołać metodę MyHardWorker z formy, ale tak, żeby przekazać komunikaty, które tutaj są wyświetlane w konsoli były wyświetlane w moim richtextboxie.

0

Zakładam, że używasz edytora a nie piszesz to z palca.
Dodaj Click EventHandler dla Buttona. W tym handlerze możesz wywołać dowolną funkcję, w tym Twój MyHardWorker
Dostęp do RichTextBoxa w najprostszej wersji możesz mieć przez odwołanie się do niego po nazwie i edytować propertisa Text

Jeżeli chcesz jakoś sprytnie rozdzielić pisanie do kontrolki od konsoli to możesz przekazywać interfejs do swojej metody a implementację wstrzykiwać zależnie od miejsca wywołania: w event handlerze piszącą do kontrolki, z maina piszącą do konsoli.

Jeżeli to co opisałem wydaje Ci się to zbyt skomplikowane, możesz to po prostu wrzucić to w ify, jednak będzie to brzydki kod i dobrze by było w przyszłości zapoznać się z bardziej poprawnymi technikami pisania kodu.

0

Teraz jak na to patrzę to oczywiście jest banalne :)
Najpierw przekazałam całą formę

class WorkerClass
{
    private  Form1 _form;
   
    public void MyHardWorker(Form1 form)
    {
        _form = form;
        DoLog("Początek");
        Thread.Sleep(2000);
        DoLog("Środek");
        Thread.Sleep(2000);
        DoLog("Koniec");
    }

    private void DoLog(string v)
    {
        if (_form == null)
        {
            Console.WriteLine(v);
        }
        else
        {
            _form.richTextBox1.Text += v + Environment.NewLine;
        }
    }
}

ale później spróbowałam z samym richTextBoxem i tak w zasadzie też jest OK

class WorkerClass
{             
    public void MyHardWorker(RichTextBox rTxtBox)
    {
        DoLog("Początek",rTxtBox);
        Thread.Sleep(2000);
        DoLog("Środek",rTxtBox);
        Thread.Sleep(2000);
        DoLog("Koniec",rTxtBox);
    }

    private void DoLog(string v, RichTextBox r)
    {
        if (r == null)
        {
            Console.WriteLine(v);
        }
        else
        {
            r.Text += v + Environment.NewLine;       
        }
    }
}

Miałam jeszcze próbę z property na Form1 i też działało.
Są jakieś znaczące różnice pomiędzy tymi sposobami?
Jak to można lepiej napisać, aby było zgodne z "bardziej poprawnymi technikami pisania kodu."?

0

@AnetaZ: różnica między dostarczeniem Form a bezpośrednio RichTextBox jest taka, że masz dostęp do wszystkich komponentów na formularzu albo do konkretnej kontrolki. Gdybyś w swojej funkcji chciała operować na większej ilości kontrolek wtedy musisz mieć coś co je agreguje np. formularz. Generalnie dobrze jest minimalizować ilość rzeczy jakie trafiają do funkcji aby minimalizować odpowiedzialności i połączenia w kodzie.

Nie wiem na jakim etapie nauki jesteś, ale możesz pomyśleć nad dwiema rzeczami: czy wywoływanie tego wszystkiego w konstruktorze powinno być zadaniem konstruktora, a jeżeli nie, to jak inaczej to rozwiązać. Oraz również nad tym czy można jakoś wykorzystać interfejsy aby klasa miała jedną odpowiedzialność.

0

Jednym ze sposobów zrobienia tego zdrowiej jest oparcie się na Modelu. WIdgety WinForm można zbindować z Modelem, tak się skupia aktywność danych, a formatka "tylko" wyświetla
Nie używałem RichTextBoxa, ale tez pewnie ma coś takiego

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