Jak zjistit jestli je objekt vytvořen?   zodpovězená otázka

VB.NET, WinForms

Přeji dobrý den všem,

prosím poradil by mi někdo zkušenější jak se dá ve VB.Net obecně zjistit zda je určitý objekt již vytvořen? (mám na mysli že již existuje jeho instance) Zní to asi hloupě ale nemůžu na to pořád přijít. Potřeboval bych vytvořit podmínku ve smyslu :

if "existuje objekt Form2" then udělej něco.... a nevím jak se na ten objekt Form2 odkázat nebo resp. kde hledat.

Předem mockrát děkuji za jakoukoliv pomoc.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Instanci objektu vytvoříte pomocí klíčového slova New. Tím se vytvoří instance daného objektu a přiřadí do příslušné instanční proměnné (respektive uloží se tam jenom odkaz na instanci objektu). Pokud má instanční proměnná hodnotu Nothing, pak v ní není přiřazena žádná instance.

Dim f1 As Form1
If f1 Is Nothing Then
  'V proměnné f1 neexistuje žádná instance Form1
  'Přiřadit odkaz na instanci Form1 do f1
  f1 = New Form1
End If

If f1 IsNot Nothing Then
  'V proměnné f1 existuje instance Form1
  f1.Show()
End If
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Mockrát děkuji za Vaši odpověď a vysvětlení!

Tohle je přesně ono co jsem potřeboval.

Jen jsem ještě zjistil, že je tam problém když se okno f1 zavře.

Když se potom znovu klikne na button který je má znovu vytvořit nastane chyba. Radši pro názornost přiložím kousek kódu nejsem si jistý jestli jsem to celé správně popsal:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        ' --- takto bych chtěl aby to fungovalo = při každém kliku se vytvoří nové okno ---
        ' --- problém ale je, že když je Dim f2 As New Form tady v těle Button2_Click ---
        ' --- potom se už do f2 nemůžu dostat z jiné metody viz. ShowMessage --- 

        Dim f2 As New Form
        f2.Show()
    End Sub

    Private Sub ShowMessage(ByVal text As String)
        f2.Label1.Text = text ' --- tohle je ten problém ---
    End Sub

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nastudujte si seriál o programování ve VB.NET, ať máte všeobecný přehled o jazyku. Pokud si proměnnou nadeklarujete uvnitř procedury, pak ji nemůžete použít v jiných procedurách. Jedinou možností je v tomto případě deklaraci proměnné f2 přesunout nad proceduru Button2_Click.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji za Vaši reakci pane Herceg. Ano, přesně jak to píšete tak jsem to již předtím zkoušel a vše funguje jak má až do momentu než právě to okno f2 zavřu přes ikonu [x] v jeho pravém horním rohu. Tím jak jej zavřu tak se celý objekt odstraní, což je samozřejmě v pořádku. Jen když potom opět kliknu na button který by znovu měl okno vytvořit nastane chyba, protože když proměnnou nadeklaruji nad procedurou Button2_Click tak kliknutím na [x] se právě odstraní a za běhu aplikace se již znovu nenadeklaruje. A právě s tímto si nevím rady jak se s tím vypořádat. Zřejmě k tomu přistupuji špatně ale nevím co mám vlastně hledat.

Vaše seriály o VB.NET jsou opravdu skvělé, několikrát jsem je studoval ale tohle mi pořád nějak uniká.

Když to zjednoduším jde mi o to, že bych potřeboval docílit stavu že bude Form1 (f1) na kterém je button1 a při každém kliknutí na něj se vytvoří Form2 (f2). Pokud ale za běhu aplikace f2 zavřu přes její [x] a následně opět se klikne na tento button opět bych chtěl vytvořit Form2 tak jako tomu je při prvním spuštění aplikace kdy to vše funguje ok. Rád bych pochopil co dělám špatně ale jak říkám, už jsem vyzkoušel kde co ale tohle mi pořád uniká.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Celý váš problém spočívá v tom, že nemáte proměnnou f2 nadeklarovanou na úrovni třídy. Potom k této proměnné nemá přístup nic kromě metody ve které je nadeklarovaná.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

opět díky moc za vaši reakci. Testoval jsem oba způsoby, problém je že když deklaruji proměnnou uvnitř metoty Button2_Click vše funguje jak má, mám na mysli především to, že když f2 zavřu a znovu kliknu na Button2 opět se f2 vytvoří. Nevýhoda ale je, že se do f2 nedostanu odjinud tak jak jsem to popsal výše. Když to udělám opačně, že f2 deklaruji hned v záhlaví aplikace, potom se sice do f2 dostanu odkudkoliv jen jakmile f2 zavřu za běhu aplikace a potom chci f2 vytvořit znovu klikem na Button2 nastane ten problém - objekt není deklarován. Otázka zní jak ale mám tyto 2 způsoby "sloučit" aby to fungovalo? Původně mě napadlo vždy při kliku na Button2 testovat zda je instance již deklarovaná a pokud ne tak ji nadeklarovat. Došlo mi ale následně že to sice jde ale problém s přístupem to neřeší.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Když zavřete okno metodou Close nebo v uživatelském rozhraní, nastane automaticky proces likvidace (uvolnění Unmanaged zdrojů a paměti). Tím pádem instance f2 na globální úrovni je sice platná (nemá hodnotu Nothing), ale při pokusu o přístup na její členy nastane vyjímka "Cannot access disposed object" z výše uvedeného důvodu (jestli je okno v průběhu likvidace nebo už zlikvidováno se dá zjistit pomocí vlastností Disposing a IsDisposed). Proto například já to řeším tak, že u oken která potřebuji v průběhu celé činnosti aplikace je na událost FormClosing pouze schovám - zabráním jejich zavření a tím pádem likvidaci a u oken která potřebuji jen na chvíli vždy vytvořím novou instanci a o zbytek se postará Garbage Collector.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tak tohle je přesně to co jsem hledal. Mockrát děkuji za Vaši odpověď. Teď už je to jasné a dokonce to i funguje :-)

Ještě jednou díky !!!

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback