Vícenásobné otevření stejného "formu"   otázka

VB.NET

Dobrý den, můj problém, se kterým se nějakou chvíli trápím, je snaha otevřít stejný form několikrát + aby se zobrazil jako samostatné okno v liště (ale byl vázaný na puvodní aplikací). Když to zkouším přes

form2.Show()

pokud kliknu na tlačítko, tak se form otevře ale jen jednou, opakové pokusy další nevyvolají.

Děkuji předem ztajakékoli rady.

(i když to bude určitě nějáká hlupost na kterou nemůžu přijít :D)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
Public Class ClassClone
    Private Shared mFormCreate As Integer = 0
    Private Shared mForm As New Collection()
    Public Shared Sub Clone()
        Dim frm As New Form1()
        ClassClone.mFormCreate += 1
        mForm.Add(frm, frm.GetHashCode.ToString)
        frm.Visible = True
    End Sub
End Class

Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
ClassClone.Clone()
End Sub

Mohl by tento návrh prosím posvětit někdo kompetentní a zkušený? Nejsem si tímto řešením jist. Pokud je to blbost,omlouvám se.

P.S.: Chce to vyzkoušet. Vytvořit třídu a s její pomocí pak "klonovat" Form 1.

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

Toto je zcela nevhodné řešení z několika důvodů. Jednak toto není žádné klonování, ale vytváření nových instancí, na což by postačil jediný řádek kódu (Dim frm As New Form). Dále nechápu k čemu má sloužit proměnná mFormCreate a proč jsou všechny členy třídy ClassClone statické. Tento kód bych rozhodně nedoporučoval nikomu používat.

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

A já měl pocit, že OOP je o popisu tříd,vytváření instancí a posílání zpráv mezi nimi. Ale třeba se to od těch zhruba 60-tých let změnilo.

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

O tom co je OOP máte skutečně zcela mylnou představu...

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

Plus causa mFormCreate: odpověď je v kódu:

ClassClone.mFormCreate += 1

Toto řešení zabezpečuje, že můžete na Form1 kliknout kolikrát chcete a vždy se vytvoří nový formulář s objekty, které jsou ve Form1. Nic víc. Stačí to vyzkoušet.

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

To snad nemyslíte vážně. Toto řešení nezabezpečuje vůbec nic, je to pouhé inkrementování vnitřní statické proměnné které postrádá jakýkoliv smysl...

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

Jak už naznačil pan Linhart. Formulář není nic jiného než třída (Class). A pokud chcete vytvořit formulář stáčí vytvořit objekt na základě téhle třídy.

Přesně jak psal pan Linhart" Dim mujform as form = new ClassMujFormular

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

Pokud za každým stiskem tlačítka pouze

vytvořit nový formulář Form2,tak potom

asi opravdu bude stačit:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim frm As New Form2
        frm.Show()
End Sub

Pro přehled o instancích Form2

vytvořených tlačítkem Button1

na Form1 je ukládat do pole?

Návrh zde nabízí, pro pozdější přístup

k jednotlivým formulářům, jejich ukládání

formulářů do pole. Číslování za titulkem

formu v záhlaví pouze pro příklad, nechť

se později jmenují dle chuti a potřeby.

Public Class Form1
    Dim f() As Form2 = New Form2() {}
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ReDim Preserve f(f.GetLength(0))
        f(f.GetLength(0) - 1) = New Form2
        f(f.GetLength(0) - 1).Text = f(f.GetLength(0) - 1).Text & " [" & f.GetLength(0) & "]"
        f(f.GetLength(0) - 1).Show()

    End Sub
End Class

Dá se předpokládat, že bude žádáno zjištovat

minimálně počet vytvořených formulářů a snad

je při ukončení zavřít... Potom by se nějaká

třída s kolekcí viz. návrh výše hodila a do

ní přidat přístup k jednotlivým formulářům,

vlastnost Items, Name, jejich počet Count...

Nezatracuji to a popřemýšlet doporučuji :-)

(a 60léta si přece zaslouží trochu zastání).

Pole by snad mohlo posloužit, uvidíme...

Snad se dočkáme rad zkušenějších a uvedou

naše začátečnické pokusy na správnou cestu...

Mnoho zdaru!

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

Udržovat vlastní pole formulářů je věc zcela zbytečná, protože tuto funkčnost pokrývá vlastnost My.Application.OpenForms, což je seznam všech otevřených oken v aplikaci, na který se dá přistupovat buď pomocí indexu, nebo pomocí názvu okna... Jakmile kdekoliv v aplikaci vytvoříte novou instanci okna, tato se automaticky přidá do tohoto seznamu...

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

Díky za tip na My.Application.OpenForms,

ale jak poznám mezi nimi jen formuláře

vytvořené právě tlačítkem z formu1...

Napadá mě použít vlastnost Tag a nápad

s polem tedy zcela zavrhuji.

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

Ano, šlo by to udělat například použitím vlastnosti Tag, ale otázka je, k čemu potřebujete vědět že to bylo vytvořeno pomocí tlačítka z formu1?

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

Nemusí to být právě to naše tlačítko1 z form1.

Pro otevření nového nebo aktivaci již otevřeného

formu rozkliknutím listviewitem procházím již

otevřené formuláře.

...

Ypsilon v titulku,upoutá pozornost.Chytré,okoukám!

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

Na tuhle šílenost s Redim Preserve radím rychle zapomeňte, je to pomalé, neefektivní a ošklivé. Ve VB.NET máme generické kolekce, například List.

'deklarace mimo proceduru ve Form1
Dim formulare As New List(Of Form)

'přidání formuláře do kolekce (v proceduře vytváření formuláře)
Dim frm2 As New Form2()
formulare.Add(frm2)

Jinak doporučuji Vám přečíst si poslední dva díly našeho seriálu VB.NET pro začátečníky, tam je vysvětlen základní princip OOP tak, jak je implementován v .NET Frameworku. Ať v tom máte jasno.

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

Děkuji za Vaše odpovědi, tipy a doporučení.

Budu se do toho muset ponořit, ale je fajn

mít se kam obrátit a ušetřit si tápání...

Mnoho zdaru!

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