ObjectDisposedException na WM   otázka

VB.NET, Compact Framework

Zdravím, mám program, který hlásí z ničeho nic chybu o které nic nevím, i když jsem se ji snažil vygooglit tak jsem nenašel nic co by se vztahovalo k té mé.

Jde o to, že program spustím jednou, funguje. Vypnu ho a spustim znovu, funguje a třeba po třetím spuštění se objeví chyba. Doslova nezávisle na počtu spuštění.

Ještě jestli vám pomůžou poslední řádky chyby:

v

Microsoft.AGL.Common.MISC.HandleAr()

v

System.Drawing.Graphics.DrawImage()

Díky za pomoc

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

Není to tím, že nemáte ošetřeno spuštění pouze jedné instance aplikace a ty zůstávají běžet v procesech?

nahlásit spamnahlásit spam -6 / 6 odpovědětodpovědět

Je to celkem možné, jenže nevím JAK to ošetřit. Ale když si program představím jako diagram, kde základem je Menu a z toho pokračují další formuláře, tak menu vypnout nemůžu. A každý z těch formulářů zavírám příkazem Me.Close(), tak pravě nevím kam co napsat, aby mi to pořád nevyhazovalo tuto chybu.

A ještě jedna věc, tato chyba se objevuje nezávisle na formulářích. Jednou se spustí při chodu jednoho formuláře podruhé u druhého občas vyskočí i u spouštění jednoho z formulářů, takže nedokážu pokaždé přesně zjistit v čem je problém. Ale u Debugu na Emulatoru mi občas vyskočí chyba a označí se řádek, který spouští formulář ("Form2.ShowDialog()")

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

To je totiž to vaše idiotské volání normálně instančních metod staticky, jako to bylo ve VB6. Nechápu, proč to ve VB.NET nezakázali.

Form2.ShowDialog()

Potom nevíte, kde se drží nebo zůstává jaká instance čeho, co se již uvolnilo a co ne.

Správně by mělo být:

Using f2 As New Form2
  f2.ShowDialog(Me)
End Using

U všech modálních formulářů.

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

To máte tak, když se někdo učí a neví skoro nic. Ono jde všechno od začátečníka nazvat "idiotské", ale jak mám vědět, že to jde jinak? Každý snad jednou začínal ne.

Děkuju za objasnění problému. Teď už jak na to.....

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

Stejnou věc již kritizoval p. Herceg ve vašem předchozím dotazu "posílání hodnot mezi formuláři ve Win Mobile". Evidentně jste se z toho nepoučil a děláte to pořád stejně debilně, protože to je jednodušší než explicitně deklarovat instanci třídy. Jak na to jsem vám ukázal v mém předchozím příspěvku (konstrukce Using).

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

asi vám neudělám radost, ale celé using nějak nebere toto f2.ShowDialog(Me)

Too many arguments to 'Public Function ShowDialog() As System.Windows.Forms.DialogResult'

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

Tento kod pracuje bez problemu funguje na Windows ale na Win Mobile to nepojede

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     Using f2 As New Form2
         f2.ShowDialog(Me)
     End Using
End Sub

Jakmile ho dám do platformy Win Mobile, označí se Me v závorce a vypíše chyba. Takže nevim, zase tam bude nějaká změna v kodu jak tomu bylo u textových akcí (pro odřádkování používat vbCrLf a ne Environment.NewLine)

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

Proboha člověče, vy skutečně nevíte nic. Ano spletl jsem se, v Compact Frameworku neexistuje overload metody ShowDialog s parametrem pro mateřské okno. Předpokládal jsem ale, že s takovou pitomostí si poradíte (prostě použít metodu bez parametrů). Chybějící NewLine je jen jedno z mnoha omezení Compact Frameworku.

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

Víte Pán Linhart, když je člověk začátečník snaží se od někoho KDO TO UMÍ odpovědi na své otázky dostat, jenže pokud mu odpovídající pořád říká, že dělá idiotské a debilní věci, tak ho jaksi totálně přestává bavit se vůbec ptát a řešit všechny problémy, i banální, tím, že se na ně vykašle! Řekněte mi kolikrát jste se VY na něco vykašlal? Když se chci něco naučit tak se zeptám, nebudu mlčet jak pěna, abych ve výsledku stejně nic nevěděl.

S tou Vaší "pitomostí" jsem si poradil, nechal jsem tam pouze ShowDialog(), a dokonce i s Vaším Using! I tak to hlásí stejnou chybu a označuje řádek se ShowDialog(), takže asi bude někde problém v kódu.

A byl bych velice rád, kdybyste mi aspoň poradil jak tu chybu hledat, čeho se mám držet a už vás otravovat nebudu! Děkuji

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

Pane Marko, možná by p.Herzeg mohl vytvořil pro Ondřeje Linharta speciální filtr do diskuzního textboxu, který by odkanalizoval pojmy jako

pitomost, idiot, debil, shit, proboha, zhovadile, katastrofické, 
zvratky ... 

ale to by tu nebyla žádná psina :-)

(mě taky rasí...)

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

Byla by to poměrně zajímavá statistika, nechce ji někdo udělat? Zařídíil bych mu readonly přístup do tabulky textů diskusních příspěvků. Zvlášť číslo, kolik % příspěvků neobsahuje projev osvěžujícího druhu taktu páně Linharta, by bylo velmi zajímavé.

Ale k věci - pan Linhart má pravdu, výše uvedené chyby spočívají především v tom, že voláte Show na třídě Form2 a nevytvoříte si od ní proměnnou. Pak nemáte kontrolu nad tím, kolik instancí se vytváří.

Takže - typické modální okno (zobrazím, čekám než uživatel něco vyplní, a pak jedu dál) se dělá takhle:

Dim f2 As New Form2()

'předvyplnit hodnoty (buď přes komponenty, lépe na to mít nějaké vlastnosti)
f2.TextBox1.Text = "blabla"
'...

'zobrazit okno a počkat, než ho uživatel zavře (případně v ifu testovat DialogResult, jestli kliknul na OK nebo na Cancel atd.)
f2.ShowDialog()

'zpracovat výsledky (někam si je přiřadit například)
Me.Settings = f2.TextBox1.Text

'korektně zrušit okno (místo toho se dá celý tenhle 
'kód obalit do usingu, jak ukazoval pan Linhart;
'mimo ten blok ale okno neexistuje a nesmíte se na něj odkazovat)
f2.Dispose()

Máte přesnou kontrolu nad tím, kdy se okno vytvoří, a kdy zanikne.

Ideálně nikdy nesahejte na proměnné uvnitř okna, dělejte na to vlastnosti.

Místo f2.TextBox1.Text dejte do třídy Form2 tohle:

Public Property Jmeno As String
    Get
        Return TextBox1.Text
    End Get
    Set (ByVal value As String)
        TextBox1.Text = value
    End Set
End Property

Pak na f2 nebudete šahat na TextBox, ale na vlastnost f2.Jmeno. Má to mimo jiné tu výhodu, že když budete chtít při nastavení jména udělat něco jiného, nebo to jméno najednou nebude v textboxu, ale třeba v listboxu, změníte to na jednom místě (ve Form2 a nikde jinde) a ne na padesáti jiných místech, odkud se na ten TextBox odkazujete. Stejně tak můžete chtít přidávat kontroly, jestli jméno je správné, jestli začíná velkým písmenem atd.

Pokud potřebujete okno, které má být vidět déle než vykonání jedné metody (celá předchozí ukázka musí být v jedné funkci, jinak to postrádá smysl), pak si do okna, které to nové vyvolává, udělejte proměnnou a přiřaďte do ní New OteviraneOkno(). A jakmile ho nebudete potřebovat, zavolejte na něj Dispose (pak už s ním nejde nic dělat a musíte si vytvořit novou instanci - zase zavolat New OteviraneOkno()).

Pokud to děláte jinak, zaděláváte si na problémy, které se dříve či později objeví. Jste začátečník a takhle to dělají všichni. Nadávek pana Linharta si nevšímejte.

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

Pokud máte nutkavou potřebu moralizovat a k věci nic, vypadněte prosím co nejrychleji někam pryč a nevracejte se. Nehledě na to, že jste si polovinu těch výrazů vymyslel.

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

Náhodou, já se musím p. Linharta zastat. Měl jsem pár příspěvků, na které mi odpověděl tak, že mi to zvedlo ze židle, ale když si na to člověk zvykne, tak se s tím dá žít. Na druhou stranu je to člověk, který o tomto oboru opravdu ví hodně a mi všichni můžeme být rádi za to, že sem píše odpovědi na naše dotazy. To by přece nemusel.

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

Já také netvrdím, že nedokáže pomoct, jenže když vám někdo napíše, že děláte debilní nebo idiotské věci, tak vás přestává bavit se vůbec na něco pokoušet zeptat. A zrovna když jste začátečník tak se potřebujete ptát skoro na každou věc a snažíte se ji pochopit.

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

Na druhou stranu většina lidí se ptá na věci, které zde máme popsané v článcích. A najít si to sám bývá většinou rychlejší než čekat, než si někdo všimne příspěvku na fóru.

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

Všechny použité výrazy jsem si vypůjčil z vašich příspěvků na tomto webu :)

A nerozčilujte se pořád, NEJTĚŽŠÍ JE ODPOVÍDAT NA MLČENÍ!

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

Aby bylo jasno, posílat uživatele do háje tady budu já nebo Tomáš Jecha, ne nikdo jiný.

Klidně používejte slova idiotský, pitomost atd., a to na místech, kde se dají tolerovat. Jediný důvod, proč nemáte ban, je ten, že často poradíte k věci, a tak se dá leccos jiného přehlédnout.

Ale fóra jsou tady pro začátečníky, kteří se často neumí zeptat, protože neví přesně na co. Je správné je přiměřenou formou upozornit na to, že něco dělají špatně a hlavně co dělají špatně. Rozhodně je na místě jim vysvětlit, že to, co funguje, nemusí být správně. Ale rozhodovat o tom, kdo tady bude a nebude diskutovat, budeme my.

Pokud je tazatel debil, pošleme ho do háje (nebo jinam) sami, pokud naznáme, že není, anebo nenaznáme, že je, nebude ho tam posílat nikdo.

A nevztekejte se, když do vás někdo rýpne. Nikdo vám neříká, že nemáte pravdu.

nahlásit spamnahlásit spam 4 / 4 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