Návratová hodnota formuláře   zodpovězená otázka

VB.NET, WinForms

Ahoj, opět bych potřeboval popostrčit. Mám vytvořený formulář na kterém mám umístěný MonthCalendar,tlačítko OK a tlačítko STORNO. Tento formulář otevírám z různých míst hlavního formuláře pomocí ShowDialog(). Formulář má za úkol pouze vrátit datum vybrané uživatelem, nic jiného nedělá. Dakážu detekovat zda bylo stisknuto OK nebo STORNO, ale ještě bych potřeboval aby mi vrátil vybranou hodnotu z kalendáře. Samozřejmě by to šlo udělat přes veřejnou proměnnou do které bych tuto hodnotu nacpal, ale chtěl bych vědět jestli to nejde udělat elegantněji, například že při uzavírání tohoto formuláře by mi to do bloku kódu ze kterého jsem dialog otevřel vrátilo hodnotu v podobě nějákého parametru.

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

Aha, takže ona ta lze vyvolat přes form2.MonthCalendar1.SelectionStart. Já předpokládal že když je formulář zavřený že tato hodnota nebude k dispozici. Ale každopádně to s tím předáním parametru zpět do procedury která formulář otevřela by se mohlo hodit i v jiných případech.

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

Můžete například napojit metodu na událost Form2.Closing a v této metodě kontrolovat hodnoty příslušných ovládacích prvků. Když použijete událost Closing tak bude zajištěno, že v okamžiku vyvolání této události bude stále ještě platná instance Form2. Je třeba si také uvědomit, že ve výchozím stavu jsou všechny ovládací prvky na formuláři Friend, takže k nim je přístup pouze ze stejné Assembly.

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

No, nestačilo by něco takového?

Public Function SelectDate() As Nullable(Of Date)
    Using f As New FormSelectDate()
        If f.ShowDialog() = DialogResult.Cancel Then 
            Return Nothing
        Else
            Return f.MonthCalendar1.SelectedDate
        End If
    End Using
End Function

Ke komponentám můžete přistupovat i po uzavření formuláře.

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

Také by to šlo, ovšem moje řešení je univerzálnější v tom, že jej lze použít i na okno, které není modální, tudíž u něj není způsob jak počkat na výsledek DialogResult...

(bavím se o klasickém přístupu k oknům pomocí instanční proměnné a ne pomocí zhovadělého VB6 statického přístupu k oknům, který doufám nikdo nepoužívá)

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

Děkuji, vyzkouším to. Snad se posunou zase o kousíček dál při tvorbě aplikací:)

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

To nikdo nepopírá, vaše řešení funguje i pro nemodální okna. V dotazu ale stejně zaznělo, že okno se otevírá přes ShowDialog, takže myslím, že modální okno bude vyhovovat.

Moje ukázka nepoužívá starý statický přístup, ale právě ten instanční, který je v mnoha ohledech lepší.

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

Ale jo, jenže ono jde o to, že za řádkem If f.ShowDialog() = DialogResult.Cancel Then už může probíhat likvidační proces okna (Disposing), takže přesto že instanční proměnná f je stále platná (není Nothing) tak při přístupu na ovládací prvky může dojít k vyjímce "Cannot access disposed object.". To že je to uvnitř Using...End Using na to podle mě nemá vliv.

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