Przekazywanie parametru z Form2() do Form1()

0

Witam
Mam problem w napisaniu programu. W pierwszej formie mam richtextbox. Klikam przycisk i wyświetla mi się druga forma.
Uzupełniam dane w drugiej formie i chcę, żeby po kliknięciu przycisku druga forma się zamykała i dane pojawiały się w pierwszej formie.

2

Potrzebujesz referencji formy 1 na formie 2. Utwórz pole typu formy 1 i w konstruktorze formy 2 przekaż tę pierwszą. Dalej to tylko w evencie przycisku na formie drugiej (kiedy zamykasz) wklepujesz kod tak aby pozmieniać dane w formie 1.

// w formie 2
Form1 form1;

Form2(Form1 form)
{
    this.form1 = form;
}

// w evencie
form1.[...]; // itd.
0

Tak jak mówi @xeo545x39 + nie zapomnij oznaczyć tych pól które chcesz zmieniać poprzez form 2 jako publiczne.

2
mr_jaro napisał(a):

Tak jak mówi @xeo545x39 + nie zapomnij oznaczyć tych pól które chcesz zmieniać poprzez form 2 jako publiczne.

Nie upubliczniaj pól, lepiej napisz publiczne metody, które na tych polach zrobią to, co potrzebujesz.

http://pl.wikipedia.org/wiki/Hermetyzacja_%28informatyka%29

0

Zastosowałem rozwiązanie xeo545x39, bo mam taki sam problem, ale cały czas wartości z pierwszej formy nie są przekazywane do drugiej.
Sory za uciążliwe nazwy zmiennych i bałagan w kodzie.
Chodzi o to, że w zmiennej "przeciwdziedzina..." przy debugowaniu cały czas mam wartosc 0.0. Pomocy!

public partial class GranicaFunkcjiLiniowej : Form
    {
        
        
        public calosc cal;
       
        public GranicaFunkcjiLiniowej()
        {
            InitializeComponent();
            this.SetAutoSizeMode(System.Windows.Forms.AutoSizeMode.GrowAndShrink);
            this.MinimizeBox = false;
            this.MaximizeBox = false;
            
        }
        public GranicaFunkcjiLiniowej(calosc c)
        {
            this.cal = c;
        }
        private void granica_w_punkcie_wybor_btn_Click(object sender, EventArgs e)
        {

            cal = new calosc();
            
            cal.wykres_funkcja_liniowa.Series["wykres"].Points.Clear();
            cal.wykres_funkcja_liniowa.Series["granica"].Points.Clear();
            for (cal.dziedzina_funkcji_liniowej = cal.zmienna_x_funkcji_liniowej - 20; cal.dziedzina_funkcji_liniowej < cal.zmienna_x_funkcji_liniowej + 20; cal.dziedzina_funkcji_liniowej++)
            {
                cal.przeciwdziedzina_funkcji_liniowej = cal.wspolczynnik_a_funkcji_liniowej * cal.dziedzina_funkcji_liniowej + cal.wspolczynnik_b_funkcji_liniowej;
                cal.wykres_funkcja_liniowa.Series["wykres"].Points.AddXY(cal.dziedzina_funkcji_liniowej, cal.przeciwdziedzina_funkcji_liniowej);
            }
            cal.wartosc_granicy_funkcji_liniowej = cal.wspolczynnik_a_funkcji_liniowej * cal.zmienna_x_funkcji_liniowej + cal.wspolczynnik_b_funkcji_liniowej;
            cal.wykres_funkcja_liniowa.Series["granica"].Points.AddXY(cal.zmienna_x_funkcji_liniowej,cal.wartosc_granicy_funkcji_liniowej);
            cal.wykres_funkcja_liniowa.Series["granica"].Points[0].Color = Color.Red;
            cal.wykres_funkcja_liniowa.Series["granica"].Points[0].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
            cal.panel_funkcji_liniowej.Enabled = true;
            this.Close();

        }
    }
 
1

No przecież w konstruktorze przekazujesz instancje calosc to po co później w metodzie robisz cal = new calosc?

0
some_ONE napisał(a):

No przecież w konstruktorze przekazujesz instancje calosc to po co później w metodzie robisz cal = new calosc?

Jak nie robię new calosc, to vs wyrzuca taki wyjątek:
"Object reference not set to an instance of an object."

0

Dziwna sprawa. Jak na górze w partialu daję public calosc cal = new calosc();, to mnie nie wypluwa. Ponadto wartosc panel.enabled mogę zmienić na true (i to jest okej), ale już zwykłe zmienne z klasy głównej formy Uwaga!! w drugiej klasie są wszystkie na 0.0, choć w klasie głównej formy wszystkie zmienne wartości mają taką wartośc, jakią mieć powinny.

Tzn. chodzi mi już o zwykłe zmienne typu double, które są zadeklarowane w partialu w głównej formie. W klasie głównej formy wszystke mają zadaną wartość. Jednak te same zmienne w tej drugiej klasie, są już na 0.0

Dlaczego? Nie wiem.

0

Ja wiem dlaczego.
W klasie GranicaFunkcjiLiniowej tworzysz nową instancję klasy calosc, więc jakim cudem ma ona zawierać wartości z głównej formy? -.-

Pokaż więcej kodu, musisz mieć coś mocno namieszane, albo nieprawdą jest, że jak dasz calosc cal = new calosc(); to później możesz na głównej formie zmienić panel.Enabled.

0

W rzeczy samej panel_funkcji_liniowej.enabled zmienia się z false na true.Serio. To akurat działa. Poza tym gdy w evencie drugiej formy daję calosc.[...], widzieć widzimi mi wszystkie zmienne double. Tylko przy debagowaniu zauważyłem, że te same zmienne w drugiej klasie mają wartość 0.0 Jaja że hej;-)
W partial głównej formy:

 
public static double wspolczynnik_a_funkcji_liniowej { get; set; }
        public static double zmienna_x_funkcji_liniowej {get;set;}
        public static double wspolczynnik_b_funkcji_liniowej { get; set; }

        public static double przeciwdziedzina_funkcji_liniowej { get; set; }
        public static double wartosc_granicy_funkcji_liniowej { get; set; }
        public static double dziedzina_funkcji_liniowej {get;set;}

private void oblicz_granice_funkcji_liniowej_Click(object sender, EventArgs e)
        {
            granica_funkcji_liniowej = new GranicaFunkcjiLiniowej();
            panel_funkcji_liniowej.Enabled = false;
            granica_funkcji_liniowej.Show();
            granica_funkcji_liniowej.FormClosed += (o, args) => panel_funkcji_liniowej.Enabled = true;
            
            
        }
 

Klasa partial drugiej formy:

 
public partial class GranicaFunkcjiLiniowej : Form
    {
        

        public calosc calosc;
        
        
        public GranicaFunkcjiLiniowej()
        {
            InitializeComponent();
            this.SetAutoSizeMode(System.Windows.Forms.AutoSizeMode.GrowAndShrink);
            this.MinimizeBox = false;
            this.MaximizeBox = false;
            
        }
        public GranicaFunkcjiLiniowej(calosc c)
        {
            this.calosc = c;
        }
        private void granica_w_punkcie_wybor_btn_Click(object sender, EventArgs e)
        {

            
            
            calosc.wykres_funkcja_liniowa.Series["wykres"].Points.Clear();
            caloscwykres_funkcja_liniowa.Series["granica"].Points.Clear();
            for (calosc.dziedzina_funkcji_liniowej = calosc.zmienna_x_funkcji_liniowej - 20; calosc.dziedzina_funkcji_liniowej < calosc.zmienna_x_funkcji_liniowej + 20; calosc.dziedzina_funkcji_liniowej++)
            {
                calosc.przeciwdziedzina_funkcji_liniowej = calosc.wspolczynnik_a_funkcji_liniowej * calosc.dziedzina_funkcji_liniowej + calosc.wspolczynnik_b_funkcji_liniowej;
                calosc.wykres_funkcja_liniowa.Series["wykres"].Points.AddXY(calosc.dziedzina_funkcji_liniowej, calosc.przeciwdziedzina_funkcji_liniowej);
            }
            calosc.wartosc_granicy_funkcji_liniowej = calosc.wspolczynnik_a_funkcji_liniowej * calosc.zmienna_x_funkcji_liniowej + calosc.wspolczynnik_b_funkcji_liniowej;
            calosc.wykres_funkcja_liniowa.Series["granica"].Points.AddXY(calosc.zmienna_x_funkcji_liniowej, calosc.wartosc_granicy_funkcji_liniowej);
            calosc.wykres_funkcja_liniowa.Series["granica"].Points[0].Color = Color.Red;
            calosc.wykres_funkcja_liniowa.Series["granica"].Points[0].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
            calosc.panel_funkcji_liniowej.Enabled = true;
            this.Close();

        }
    }
0

To gdzie mam dać "public calosc cal", żeby mieć w drugiej formie sensowny dostęp do zmiennych z formy głównej? Jak daję go w drugiej formie, to vs widzi w klasie drugiej formy zmienne double z formy głównej, ale wartości ma już że tak powiem gdzieś.

0

Some_One, poza tym ja to chciałem zrobić na podstawie właśnie tego, co ma tu:
Z tą różnicą, że jak nie daję "= new calosc()", to mnie wypluwa, a jak daję, to nie wypluwa i widzi te wszystkie zmienne, ale nie ich wartości.

xeo545x39 napisał(a):

Potrzebujesz referencji formy 1 na formie 2. Utwórz pole typu formy 1 i w konstruktorze formy 2 przekaż tę pierwszą. Dalej to tylko w evencie przycisku na formie drugiej (kiedy zamykasz) wklepujesz kod tak aby pozmieniać dane w formie 1.

// w formie 2
Form1 form1;

Form2(Form1 form)
{
    this.form1 = form;
}

// w evencie
form1.[...]; // itd.
0
finito napisał(a):

W rzeczy samej panel_funkcji_liniowej.enabled zmienia się z false na true.Serio. To akurat działa.

Działa, ale dlatego, że przecież masz:

granica_funkcji_liniowej.FormClosed += (o, args) => panel_funkcji_liniowej.Enabled = true;
finito napisał(a):

zauważyłem, że te same zmienne w drugiej klasie mają wartość 0.0 Jaja że hej;-)

Jakie jaja? Co w tym dziwnego?
Tworzysz nową instancję klasy to chyba logiczne, że zawiera te same właściwości(które są domyślnie inicjalizowane 0 dla typów liczbowych).

W pierwszej chwili nie zauważyłem, że to są zmienne statyczne. Nie powinny się zerować, ale tam jest taki bajzel, że nie chce mi się tego analizować.

granica_funkcji_liniowej = new GranicaFunkcjiLiniowej(); 

Tutaj korzystasz z konstruktora bezparametrowego, więc pole calosc będzie nullem.

Jak tak bardzo chcesz przekazywać do nowej formy tą główną to popraw konstruktor na:

public GranicaFunkcjiLiniowej(calosc c) : this()
{
    this.calosc = c;
} 

I twórz tę formę z okna głównego w ten sposób:

granica_funkcji_liniowej = new GranicaFunkcjiLiniowej(this); 

Ale jak dla mnie to przy tym co chcesz robić przekazywanie całej formy nie ma sensu. Możesz po prostu do konstuktora przekazać te kilka wartości, które są potrzebne.
Zresztą, wszystkie twoje pola w klasie Form1 są statyczne więc możesz się do nich odwołać bez przekazywania instancji tej klasy poprzez normalne Form1.wspolczynnik_a_funkcji_liniowej.

No i lepiej siądź do jakiegoś kursu, bo widać, że nie wiesz za bardzo co robisz.

0

Wiesz, ja to wszystko rozumiem, ale nadal nie wiem w jaki sposób mam zrobić przekazanie zmiennej z jednej formy na drugą. Przecież w tej drugiej formie muszę zadeklarować instancję głównej klasy, bo inaczej nie mam czego przekazać do konstruktora.

Niby jak mam zrobić coś takiego?

public DrugaForma(calosc c):this()
{
     this.cal = c; 
}
 

bez tego:

 
private calosc cal;

???
Poza tym chyba coś nie tak zrobiłem, bo przecież w DrugaForma jak dam ":this()", to tak jakbym ustawił dziedziczenie "krzesła w krześle"- zupełnie bez sensu przecież. Słuchaj, jeśli wiesz jak to zrobić, to pokaż mi to skrótem - ja będę wiedział na przyszłość jak to zrobić, a ty będziesz miał ze mną święty spokój.

0

Zrób sobie publiczne property i ustaw jej co chcesz, a potem z drugiej formy po prostu odczytaj wartość.

0
xeo545x39 napisał(a):

Zrób sobie publiczne property i ustaw jej co chcesz, a potem z drugiej formy po prostu odczytaj wartość.

Tzn. już mi się udało zrobić tak, żeby w drugiej formie widać było wartości. To już jest! Teraz jednak nie rozumiem dlaczego gdy daję polecenia rysujące chart w pętli w evencie w form2, wykres na pierwszej formie nie rysuje się. Sory, potem dam kod, bo teraz matmę robię i nie chcę się za bardzo odrywać.

Jeśli jednak możesz, to napisz w jaki sposób można przy pomocy eventu w form2 (button click) narysować wykres chart, ale żeby rysował się na głównej formie. Tzn. najpierw zadaję wartości w głównej, potem przesyłam te wartości do Form2, a potem przy pomocy button z Form2, rysuję ten chart w głównej. Ja w form2 po prostu zrobiłem:

 
class Form2{
var f = new  GlownaForma();
f.chart....
}

W skrócie. Ale to mi nie działa. Tzn. chart jest cały biały i tyle.

1

Nie prościej udostępnić publiczną metodę w Form1 odpowiedzialną za rysowaniu chart'u? Np.

 public void DrawChart() 

która używając publicznych właściwości z Form2 narysuje chart?

2

Proponuję przyjrzeć się jak są zrobione eventy w Windows Forms (choćby takie OnClick) i zrobić własne zdarzenie według tej samej konwencji.

0
Aventus napisał(a):

Nie prościej udostępnić publiczną metodę w Form1 odpowiedzialną za rysowaniu chart'u? Np.

 public void DrawChart() 

która używając publicznych właściwości z Form2 narysuje chart?

Stworzyłem taką metodę, ale ona działa tylko wtedy gdy odpalę ją w klasie GłównejFormy. Natomiast gdy w form2 dam:
var cal = new GlownaForma();
cal.DrawChart();
to już się nie rysuje. Podajrzewam, że po prostu cal jest pustą instancją i dlatego wykres się nie rysuje. Nie wiem, myślicie że to o to chodzi?

0

Bo zapomniałeś: cal.Show();

0
_13th_Dragon napisał(a):

Bo zapomniałeś: cal.Show();

Okej, zauważyłem, rzeczywiście teraz mi już rysuje, ale pierwsze że odpala mi główną formę na nowo i nie zamyka starej, a drugie, że wyświetla mi główny stan formy, a nie ten konkretny tab w tabcontrol. Bo ja mam ten chart w jednym z tabów controlki tabcontrol.

0

Skoro tworzysz główną formę na nowo za pomocą new to czego się spodziewałeś? new - oznacza z angielskiego nowy - UWAGA! nie mylić z: - sięgnij telepatycznie do umysłu autora i sprawdź czego on chce po czym to wykonaj

0

Okej, więc na głównej formie w jednej z zakładek tabcontrol mam gui z chartem. Nie mogę kilku buttonów zmieścić w gui głównej formy, więc wpadłem na pomysł, żeby te button umieścić na drugiej formie. Na drugiej formie klikam w jeden z przycisków np. narysuj_wykres_btn i wtedy druga forma się zamyka a na głównej pojawia się w owej zakładce na charcie wykres.

ps. przed chwilą też do mnie dotarło, że tworzy się nowa forma z powodu new.

0

Odpowiedź na to pytanie udzielił ci @xeo545x39 w pierwszym poście tego tematu: http://4programmers.net/Forum/970821

0
_13th_Dragon napisał(a):

Odpowiedź na to pytanie udzielił ci @xeo545x39 w pierwszym poście tego tematu: http://4programmers.net/Forum/970821

Jak robie w ten sposób, to mnie wypluwa i pojawia się informacja o tym, że obiekt form1 jest pusty. Natomiast gdy robie:
Form1 form1 = new Form1();
to wszystko działa, ale forma główna tworzy się na nowo. Nie drążyłbym tego tematu, gdyby w odpowiedzi @xeo545x39 wszystko grało.

0
finito napisał(a):

Jak robie w ten sposób, to mnie wypluwa i pojawia się informacja o tym, że obiekt form1 jest pusty.
Ponieważ nie przekazałeś form1 do konstruktora.

0

Przekazałem...

 
public partial class ObliczGranice : Form
    {
        public static double wspol_a,zmienna_x,wspol_b,przeciwd,wartosc_gr,dziedzina;
        private calosc cal
        public ObliczGranice(double wspa,double zm_x,double wspb,double przec,double wartgr,double dziedz, **calosc c**)
        {
            InitializeComponent();
            wspol_a = wspa;
            zmienna_x = zm_x;
            wspol_b = wspb;
            przeciwd = przec;
            wartosc_gr = wartgr;
            dziedzina = dziedz;
           ** this.cal = c;**
            this.SetAutoSizeMode(System.Windows.Forms.AutoSizeMode.GrowAndShrink);
        }
        
        private void granica_w_punkcie_wybor_btn_Click(object sender, EventArgs e)
        {
           
            
           
            cal.DrawCh();

            cal.Show();
            
            this.Close();
        }
    }
0

Chyba, że chodzi wam o WYWOŁANIE konstruktora. Tylko, że to jest bez sensu, bo skoro daje instancję głównej formy w Form2, to skąd mam wziąć tę instancję w głównej formie, gdy wywołuje w niej konstruktor Form2.

0
finito napisał(a):

Przekazałem...

        ...
        private calosc cal
...

To się nawet nie skompiluje, poza tym jak doprowadzisz do stanu kompilacji to jest przyjmowanie parametru, zaś jak przekazujesz nadal nie podałeś.

0

Rozumiem, że to jest przekazanie:

Form2 f2 = new Form2(cal);
 

Skąd jednak mam wyczarować instancję cal (czyli instancję głównej formy) w głównej formie? Bo właśnie dopiero to mi się nie kompiluje tzn. gdy przed konstruktorem głównej formy daję calosc cal = new calosc(); Ewentualnie gdy w evencie głównej formy (tym, ktory odpala form2) daję var cal = new calosc();, to wtedy znowu tworzy się nowa forma główna.

A przecież żeby odpalić konstruktor Form2, muszę posiadać instancję formy głównej, czy nie tak?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.