Diskuze: Passovani promennych mezi bezicimi Formy
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 19 zpráv z 19.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Ty data co si přepíšeš a pošleš zpátky, jsou uložená v Listu? nebo to máš data jen jako private proměnné v prvním formu?
Tak můžeš to udělat třeba tak, že si ve Formu2 uděláš metodu, která
bude vracet string popřípadě int té nové hodnoty.
Potom ve Form1 budeš jen volat onu metodu, co ti vrátí hodnotu z Form2
matchWindow duel = new matchWindow();
charName = duel.MetodaVracejiciNovyCharName();
health = dual.MetodaVracejiciNovyHealrt();
duel.ShowDialog();
Přičemž ony metody ve Form2 mohou vypadat třeba takto:
public int duel_hp()
{
duel_hp += 5; //nějaká změna
return duel_hp;
}
A hodnoty co si posíláš do Form2, tak si to pošli spíš takto:
matchWindow duel = new matchWindow(charName, health);
Přičemž ve form2 budeš takto brát parametry:
private string duel_charname;
private int passed_duel_hp;
public matchWindow(string charName, int health)
{
InitializeComponent();
this.duel_charname = charName;
this.passed_duel_hp = health;
}
Snad je to zrozumitelné.
Tímto způsobem se dá zeptat na jakýkoliv parametr ve form2, který se ti následně uloží do proměnné health
health = dual.MetodaVracejiciNovyHealrt();
Jinak jsem tam měl překlep, ten název metody by měl být:
public int MetodaVracejiciNovyHealrt()
{
duel_hp += 5; //nějaká změna
return duel_hp;
}
Aby název odpovídal volající metodě.
Tak teoreticky bys to mohl udělat obráceně. Před zavřením Form2 se zavolá metoda, která data z Form2 pošle do metody z Form1 a ta si je nastaví pro celý Form1.
Udělej si metodu ve Form1, která přepíše ony parametry ve Form1. Tahle
metoda, by se zavolala před zavřením Form2 a měla by v sobě parametry,
které chceš přepsat ve Form1.
Zkus si možná pročíst nějaké tutoriály zde na stránkách. Metody jsou
úplný základ programování.
Tak jsem to zkusil takhle, bohuzel bez vysledku, data ve Form1 se porad nemeni... Jdu na to spravne?
Form1
public int health_rewrite()
{
health = duel.hp_method();
return health;
}
Form2
public int hp_method()
{
output_charHp = char_hp;
return output_charHp;
}
public bool result_method()
{
output_result = result;
return output_result;
}
private void duel_backToGame_Click(object sender, EventArgs e)
{
this.Close();
}
private void matchWindow_FormClosing(object sender, FormClosingEventArgs e)
{
Form1 Form1 = new Form1();
Form1.health_rewrite();
}
Do konstruktoru Form2 si dej vstupni promenou typu Form a tou pak inicializuj deklarovany form1, pak můžeš pracovat s proměnýma z Form1
Nejak takto:
Form1 form1; // deklarace promene ve tride Form2
public Form2(Form form) //konstruktor Form2
{
form1 = form;
}
//form closing
private void matchWindow_FormClosing(object sender, FormClosingEventArgs e)
{
form1.health_rewrite();
}
no a kdyz si ve Form1 vztváříš proměnou
Form2 form2 = new Form2(this) // promena ve Form1
, dáš mu do konstruktoru vstupní hodnotu formulář Form1
Doufám, že je to pochopitelné
Co takhle:
Form1
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
Form2 form2; // deklaruju promenou form2
public Form1() // konstruktor form1
{
InitializeComponent();
label1.Text = "Text"; // mam ve formu1 label s textem> "Text"
}
private void button1_Click(object sender, EventArgs e) // kdyz kliknu na tlacitko, inicializuju promenou form2 a zobrazim form2
{
form2 = new Form2(this);
form2.Show();
}
public void PrepisLabel(string text) // metoda pro prepsani textu v label1
{
label1.Text = text;
}
}
}
Form2
namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
Form1 form1;// deklaruju promenou form1
public Form2(Form1 form) // konstruktor Form2
{
InitializeComponent();
form1 = form; // inicializace form1
}
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
form1.PrepisLabel("Zavrel jsem form 2 a pracuju s promenou formu1"); //kdyz zaviram form2 volam metodu pro prepis labelu
}
}
}
Jesstli chces poslu ti tu ukazku
Takze jsem to prozkousel a dopadl jsem takto: u eventu FormClosing volam metodu, ale chce to po me parametry. Zkusim jsem Form1.health_rewrite(char_hp);, podari se spustit ale ve vysledku spadne, protoze: "Odkaz na objekt není nastaven na instanci objektu."...
Musis mit deklarovany Form1 v konstruktoru Form2,
Zobrazeno 19 zpráv z 19.