Obiekt nie jest widoczny w innej metodzie

0

Witam, mam problem, jestem zielony w tym języku i możliwe ze taka operacja jest niemożliwa do zrobienia, wiec z góry przepraszam za głupie pytanie :/

Utworzyłem instancje w metodzie 'wykonaj' i chce aby ten obiekt był do wykorzystania w innej metodzie, czyli chodzi mi o to ze ta metoda wprowadza dane, zapisuje je a druga ma odczytywać dane z tych obiektów. Wiem ze bardzo chaotycznie napisane, dołączam zdj dzięki któremu wszystko powinno się wyjaśnić :)

p.s chodzi mi o to zeby np w metodzie 'wypisz' mozna bylo zapisać: textBox1.Text = test[0].a

0

Robisz to jako pole/właściwość w klasie i wtedy każda metoda ma dostęp. To nie problem znajomości C# a raczej ogólnie programowania. Łatwiej Ci będzie, jeśli zapoznasz się ogólnie z koncepcją programowania obiektowego bo im dalej tym będzie bardziej skomplikowanie.

0

Tylko,że w nowej klasie nie mogę używać textBox :( jak to rozwiązać ?

0

Jak zadeklarujesz obiekt w metodzie to będzie widoczny w metodzie, w której go zadeklarowałeś. Jeśli zadeklarujesz go w klasie "na górze" to znaczy przy inicjowaniu innych pól to będzie widoczny.
Nie widzisz textboxa bo textbox jest widoczny w kodzie klasy Form.
Jeśli chcesz przejąć wartość textboxa musisz np. zrobić metodę, która go przejmie i wywołać ją w odpowiednim miejscu.

0

Tylko w jaki sposób to zrobić ? Wiem, że nie można tworzyć instancji w klasie

0

Robisz to tak:

internal class Dupa
{
     private Test[] test = new Test[10];

     public void wykonaj()

}
0

No w taki sposób to rozumiem tylko, że jak stworze obiekt tej metodzie 'wykonaj' to znowu nie będzie on widoczny do innych metod poza klasą. Czy źle myśle ?

Przepraszam,że zadaje takie pytania

0

Zgadza się, do takich rzeczy służą wskaźniki. Zatem Test[] możesz przekazać np.

 
public void JakasMetoda(Test[] test)
{
]
class Dupa
{
      private Test[] _test;

      public Dupa(Test[] test)
      {
           _test = test;
      }
}
0
dotnerd napisał(a):

Robisz to tak:

internal class Dupa
{
     private Test[] test = new Test[10];

     public void wykonaj()

}

A jakbym stworzył wszystko w tej klasie w tej metodzie 'wykonaj' a potem chciał użyć jej w tej głównej klasie to starczy zmienic ją na statyczną ?

1

Wrzuć cały kod, napisz co chcesz osiągnąć to Ci pomogę i zobaczysz na przykładzie o co chodzi.

0
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Text;
using System.Windows.Forms;

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

        private void button1_Click(object sender, EventArgs e)
        {
            Test.wykonaj();

        }
        private void test_Click(object sender, EventArgs e)
        {
            Test.wypisz();
        }


        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            
        }

        private void textBox1_TextChanged_1(object sender, EventArgs e)
        {

        }

        private void textBox3_TextChanged(object sender, EventArgs e)
        {

        }

        private void a_TextChanged(object sender, EventArgs e)
        {

        }

        private void znacznik_CheckedChanged(object sender, EventArgs e)
        {

        }

    }
    class Test
    {
        public  string a;
        public  string b;
        public  string c;
        public static int z = 0;
        public static string dodaj = "a";
        public static string kod = "C:\\Nowyfolder\\foo.txt";
        public void wykonaj ()
        {
            Test[] test = new Test[10];
            test[Test.z] = new Test();
            test[Test.z].a = textBox1.Text;
            test[Test.z].b = textBox2.Text;
            test[Test.z].c = textBox3.Text;
            if (znacznik.Checked)
            {
                if (!File.Exists("C:\\foo.txt"))
                {
                    StreamWriter b = File.CreateText(Test.kod);

                    b.WriteLine(test[Test.z].a);
                    b.WriteLine(test[Test.z].b);
                    b.WriteLine(test[Test.z].c);
                    b.Close();
                }
            }
            Test.z++;
            Test.kod = "C:\\Nowyfolder\\" + Test.dodaj + "foo.txt";
            Test.dodaj = Test.dodaj + "a";
        }
        public void wypisz()
        {
            Test.test[0].a = textBox1.Text;
        }

    }
}

I teraz tak, wiem, że aby użyć 'wypisz' albo ' wykonaj' w głównej klasie to musze zmienić te metody na statyczne. Tylko ciągle jest tern problem, że obiekt z 'wykonaj' nie jest widoczny w ' wypisz' + nie można używać textbox-ow

0

Twój kod jest bardzo skomplikowany jak na to, co ma robić.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Text;
using System.Windows.Forms;

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

        private void button1_Click(object sender, EventArgs e)
        {
            Test.wykonaj(textBox1, textBox2, textBox3);

        }
        private void test_Click(object sender, EventArgs e)
        {
            Test.wypisz(textBox1);
        }


        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            
        }

        private void textBox1_TextChanged_1(object sender, EventArgs e)
        {

        }

        private void textBox3_TextChanged(object sender, EventArgs e)
        {

        }

        private void a_TextChanged(object sender, EventArgs e)
        {

        }

        private void znacznik_CheckedChanged(object sender, EventArgs e)
        {

        }

    }
    class Test
    {
        public  string a;
        public  string b;
        public  string c;
        public static int z = 0;
        public static string dodaj = "a";
        public static string kod = "C:\\Nowyfolder\\foo.txt";
        public static void wykonaj (TextBox textBox1, TextBox textBox2, TextBox textBox3)
        {
            Test[] test = new Test[10];
            test[Test.z] = new Test();
            test[Test.z].a = textBox1.Text;
            test[Test.z].b = textBox2.Text;
            test[Test.z].c = textBox3.Text;
            if (znacznik.Checked)
            {
                if (!File.Exists("C:\\foo.txt"))
                {
                    StreamWriter b = File.CreateText(Test.kod);

                    b.WriteLine(test[Test.z].a);
                    b.WriteLine(test[Test.z].b);
                    b.WriteLine(test[Test.z].c);
                    b.Close();
                }
            }
            Test.z++;
            Test.kod = "C:\\Nowyfolder\\" + Test.dodaj + "foo.txt";
            Test.dodaj = Test.dodaj + "a";
        }
        public static void wypisz(TextBox textBox1)
        {
            Test.test[0].a = textBox1.Text;
        }

    }
}
0
        public static void wypisz(TextBox textBox1)
        {
            Test.test[0].a = textBox1.Text;
        }


W tym miejscu wyskakuje błąd

1

To co robisz, to programowanie przez zgadywanie. Może warto by wziąć jakąś książkę lub tutorial i pouczyć się programowania obiektowego?

0

Oglądałem tutoriale itp ale żeby całkowicie to zrozumieć to robie to metodą prób i błędów. Mógłbyś zerknąć dlaczego w tym miejscu wyskakuje błąd ?

Dlatego, że odwołujesz się do test jako do statycznego pola klasy, a tymczasem test jest zmienną lokalną w statycznej metodzie wykonaj.

0

No na to juz właśnie wpadłem tylko jak to rozwiązać ? Chyba całkowicie inaczej trzeba będzie ten program napisać nie ?

0

olej kursy z youtuba jak nie wiesz co robisz, przeczytaj książki jakieś

0

Zaraz kto odpowie na Twoje pytanie, a Ty zadasz kolejne i tak ta mielarka się nie zatrzyma. Jeśli musisz mieć ten program na już, dogadaj się z kimś, niech Ci napisze. Jeśli nie, zacznij od początku, bo bez wiedzy, na zasadzie zgadywania da się czasem zrobić jakąś jedną rzecz, element, ale nie cały program.

0
kipa99 napisał(a):

No na to juz właśnie wpadłem tylko jak to rozwiązać ? Chyba całkowicie inaczej trzeba będzie ten program napisać nie ?

Tak. To co robisz jest zupełnie nie tak. Żeby to naprawić musiałbym wyłożyć Ci programowanie obiektowe od podstaw. Nie ma to sensu ze względu na ilość gotowych materiałów dostępnych w internecie. Idź poczytaj, potem zaoraj ten program i napisz od nowa.

0
kipa99 napisał(a):

No na to juz właśnie wpadłem tylko jak to rozwiązać ? Chyba całkowicie inaczej trzeba będzie ten program napisać nie ?

Pewnie tak :) napisz co właściwie ten program ma robić ?

0
Zwrob napisał(a):
kipa99 napisał(a):

No na to juz właśnie wpadłem tylko jak to rozwiązać ? Chyba całkowicie inaczej trzeba będzie ten program napisać nie ?

Pewnie tak :) napisz co właściwie ten program ma robić ?

Kurcze, najogólniej mówiąc chcę tworzyć obiekty do których będą przypisywane dane, które komputer będzie pamiętał i będzie można je w każdej chwili odczytać

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