Diskuze: .FormClosed event v hlavním okně a v a okně close na exception... vyhodi exception: K uvolněnému objektu nelze přistupovat.
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 9 zpráv z 9.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
To na to nemá vliv... Může tam být jen metoda...
Zjistil jsem, že na to nemá vůbec vliv ten event, ale samotné close v tom
exceptionu v konstruktoru...
//konstruktor
public A()
{
InitializeComponent();
try
{
using (StreamReader reader = new StreamReader(@"settings.grh"))
{
string[] file = File.ReadAllLines(@"settings.grh");
List<string> list = new List<string>();
list.AddRange(file);
foreach (string line in list)
{
if (line.Contains("[GROUP="))
{
string[] temp = line.Split('=');
listGroups.Items.Add(temp[1].Replace("]", ""));
}
}
}
}
catch
{
MessageBox.Show("There is missing file settings.grh,\nGRH will not work correctly.", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
Close(); //TOHLE ZPUSOBUJE CHYBU
}
foreach (Control objekt in Controls)
{
if (objekt is ComboBox)
((ComboBox)objekt).SelectedIndexChanged += new EventHandler(EventComboChanged);
}
textAddGroup.Text = "Group Name";
textAddGroup.ForeColor = Color.Gray;
textAddPlayer.Text = "Player Name";
textAddPlayer.ForeColor = Color.Gray;
}
Chyba:
Neošetřená výjimka typu System.ObjectDisposedException vznikla v System.Windows.Forms.dll.
Další informace: K uvolněnému objektu nelze přistupovat.
Zavírat form hned v konstruktoru je poměrně "nestandartní"
postup. A ani to nepotřebuješ -
když ti konstruktor form nevytvoří, tak ho ani nemusíš zavírat.
Navíc se pokoušíš přistupovat k objektu, který jsi vlastně ani
nevytvořil.
Co se týče neošetřené vyjímky - ty ji musíš poslat dál a někde zpracovat.
Něco si o vyjímkách nastuduj - třeba tady
mělo by to vypadat zhruba takto:
public A()
{
InitializeComponent();
try
{
using (StreamReader reader = new StreamReader(@"settings.grh"))
{
string[] file = File.ReadAllLines(@"settings.grh");
List<string> list = new List<string>();
list.AddRange(file);
foreach (string line in list)
{
if (line.Contains("[GROUP="))
{
string[] temp = line.Split('=');
listGroups.Items.Add(temp[1].Replace("]", ""));
}
}
}
}
catch
{
if (MessageBox.Show("There is missing file settings.grh,\nGRH will not work correctly.", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1) == DialogResult.OK)
throw new Exception("nejaky problem :(");
}
foreach (Control objekt in Controls)
{
if (objekt is ComboBox)
((ComboBox)objekt).SelectedIndexChanged += new EventHandler(EventComboChanged);
}
textAddGroup.Text = "Group Name";
textAddGroup.ForeColor = Color.Gray;
textAddPlayer.Text = "Player Name";
textAddPlayer.ForeColor = Color.Gray;
}
private void btnGroupClick(object sender, EventArgs e)
{
if (!isOpenedEditGroups)
{
try
{
A a = new A();
a.Show();
isOpenedEditGroups = true;
a.FormClosed += GroupEditClosedEvent;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "pozor", MessageBoxButtons.OK);
}
;
}
}
K a.FormClosed musíš přiřadit event handler FormClosedEventHandler a ne jenom metodu:
to bylo dřív - ve VS2015 (možná i VS2013, nevím) už to být nemusí
Problém bude zřejmě v tom, že se pokoušíš form zavřít už v konstruktoru, kde ale ještě není úplně vytvořený. V konstruktoru bys měl maximálně nastavovat nějaké property které si vytvoříš, ale ne sahat na UI nebo form zavírat.
Místo kde to můžeš bezpečně udělat, protože už je všechno vytvořeno, je při vyvolání eventu Loaded (týká se jenom WPF) nebo Shown (týká se winformů). U winformů je ještě event Load, ale tam bych byl taky opatrný, nejsem si úplně jistý co všechno je při jeho zavolání už vytvořeno a co ještě ne.
Myslím, že když dojde k vyjímce v konstruktoru,tak to Garbage Collector všechno uklidí.(ale jistě to nevím)
ale to že má v konstruktoru věci, které by tam být neměly je pravda
Já vím, samozřejmě bych to mohl vyřešit takhle:
try
{
Options options = new Options();
options.Show();
isOpenedEditGroups = true;
options.FormClosed += new FormClosedEventHandler(GroupEditClosedEvent);
}
catch
{
MessageBox.Show("////", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
}
Ale zajímalo mě, jak to vyřešit takhle
Díky
Honza má pravdu - dej to radši do obsluhy události Load, nebo Shown
private void A_Load(object sender, EventArgs e)
{
try
{
using (StreamReader reader = new StreamReader(@"settings.grh"))
{
string[] file = File.ReadAllLines(@"settings.grh");
List<string> list = new List<string>();
list.AddRange(file);
foreach (string line in list)
{
if (line.Contains("[GROUP="))
{
string[] temp = line.Split('=');
listGroups.Items.Add(temp[1].Replace("]", ""));
}
}
}
}
catch (Exception ex)
{
if (MessageBox.Show(ex.Message, "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1) == DialogResult.OK)
{
Close();
}
throw new Exception(ex.Message);
}
}
tohle ti přímo hodí hlášku do MessageBoxu, že "soubor settings.grh nebyl nalezen"
Zobrazeno 9 zpráv z 9.
