wywołanie funkcji w innym pliku

0

Witam,
mam form z backgroundworkerem, miał on problem z pracą z formą więc napisałem sobie coś takiego

public delegate void KonsolaDelegate(string text);
        public void Konsola(string text)
        {
            if (InvokeRequired)
            {
                BeginInvoke(new KonsolaDelegate(Konsola), new object[] { text });
                return;
            }
            listBox1.Items.Add(text);
        }

Wszystko działa świetnie, z jednym wyjątkiem. Gdy próbuje w innym pliku wywołać tą funkcje nie działa (wywala że nie jest zdefiniowana). Nie wiem jak się do niej odwołać, próbowałem przez WindowsFormsApplication1.Test. ale mam dostep tylko do delegata. Da się coś na to poradzić ?

0

Możesz zadeklarować funkcję jako static.

0

Jeżeli funkcja jest statyczna dostaje:

Error	1	An object reference is required for the non-static field, method, or property 'System.Windows.Forms.Control.InvokeRequired.get'	C:\Users\a\Desktop\qwe v3\WindowsFormsApplication1\Form1.cs	35	17	WindowsFormsApplication1
0

No, ale do tej metody "Konsola" trzeba się chyba odwoływać z obiektu, nie?
I co to jest "inny plik"? Programy nie składają się z plików.

0

No to może zadam inaczej pytanie. Mam na formie progressbar o nazwie postep. Jak ustawić jego wartość w innym pliku niż Form.cs (projekt jest podzielony na pliki) ?

0

Czy w Twoim języku z innego pliku, znaczy z innej klasy?

Bo jeśli tak, to można np. przekazać do niej ten ProgressBar w konstruktorze i dalej operować jak na polu klasy. Tylko to jest raczej bez sensu.

Co Ty właściwie próbujesz osiągnąć?

0

Nie po mojemu ;p przecież w 1 pliku może być kilka klas. Chodzi o to że jest mała aplikacja WindowsForm podzielona na pliki (klasy). Wstawiłem backgroundworkera, otrzymałem błąd o problemie z wątkami więc dodałem:

public delegate void KonsolaDelegate(string text);
public void Konsola(string text)
{
       if (InvokeRequired)
       {
                BeginInvoke(new KonsolaDelegate(Konsola), new object[] { text });
                return;
        }
        listBox1.Items.Add(text);
}

I teraz jeżeli w pliku Form1.cs wywołam funkcje Konsola nie otrzymuje błędu z wątkami. Jednak jeżeli próbuje ją wywolać w pliku update.cs, otrzymuje błąd że taka funkcja nie istnieje. Moje pytanie brzmi jak to zrobić żeby działało :)

0

Ale jedna klasa może też być w kilku plikach. Na dodatek plik wcale nie musi się nazywać tak, jak klasa w nim znajdująca. Więc nie pisz, że coś robisz w jakimś pliku, bo nie ma to żadnej wartości i tylko utrudnia dyskusję.
Kod źródłowy składa się z klas, program w trakcie działania z obiektów. Nie wiem, jak można tego nie rozumieć.

Na podstawie Twoich dotychczasowych filozofii udało mi się wywróżyć, że w backgroundworkerze uruchamiasz metodę z innej KLASY, która nie ma dostępu do elementów GUI, bo jest w innym wątku. Aby to rozwiązać można np. przekazać obiekt formatki do innej klasy aby tam uzyskać dostęp do jej metod:

using System;
using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;

namespace ProgressBarTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.backgroundWorker1.RunWorkerAsync();
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            Calculation calc = new Calculation(this);
            calc.Start();
        }

        public delegate void KonsolaDelegate(string text);

        public void Konsola(string text)
        {
            if (InvokeRequired)
            {
                BeginInvoke(new KonsolaDelegate(Konsola), new object[] { text });
                return;
            }
            listBox1.Items.Add(text);
        }
    }

    class Calculation
    {
        Form1 form;

        public Calculation(Form1 form)
        {
            this.form = form;
        }

        public void Start()
        {
            for (int i = 0; i < 100; i++)
            {
                Thread.Sleep(10);
                this.form.Konsola(i.ToString());
            }
        }

    }
}

P.S. Można to do Newbie przenieść? Chwilami czuję się jak nauczyciel w szkole specjalnej :/

0

Ale ja wszystko rozumiem co Ty piszesz, nie jestem aż tak tępy :) co prawda nie do końca się dogadaliśmy ale dzięki Tobie zrozumiałem rzecz której nie rozumiałem i dałem rade to skończyć, dzięki :)

0

Nie o to chodzi, że jesteś tępy, ale wyrażając się nieprecyzyjnie naprawdę utrudniasz innym pomoc.
Jakbym nie musiał zgadywać o co Ci chodzi, napisałbym to już wczoraj.

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