[ arsa x @ 10.08.2003. 12:41 ] @
Imam formu u koju instanciram user control dinamicki.
Kako da pristupim parametrima tako instancirane kontrole, iz forme?.
VB.NET
[ Dragi Tata @ 10.08.2003. 20:20 ] @
Ne kapiram baš najbolje. Zašto ne pošalješ neki kod, da vidimo šta tačno hoćeš i gde je problem?
[ arsa x @ 10.08.2003. 22:41 ] @
Code:

 For Each m_Chanal In m_Chanals
        Dim objTabPage As New TabPage(m_Chanal.strChanalName)
        Dim objControl As New ChanalsWindowsControlLibrary.UserControlChanals()
        objTabPage.Controls.Add(objControl)
        Me.tabControlChanals.TabPages.Add(objTabPage)
        With objControl
            .Dock = DockStyle.Fill
            .Chanal = m_Chanal
        End With
    Next


Evo koda sa kojim na tabcontrol dodajem tabpage sa user control
e sad kako cu da pristupim properties na toj kontroli.
Na toj kontroli imam konkretno richtextbox kome trebam da pristupim
Nadam se da je jasno
[ Dragi Tata @ 10.08.2003. 23:03 ] @
I dalje mi nije jasno. Ovim kodom:

Code:

With objControl
            .Dock = DockStyle.Fill
            .Chanal = m_Chanal
        End With


ti već pristupaš property-ima na toj kontroli. Izgleda da želiš nešto drugo, ali ne kapiram šta.
[ arsa x @ 11.08.2003. 00:04 ] @
Izvinjavam se nisam naveo tacno bas...
For ... Next mi se nalazi u FormLoad Sub
Kako u sledecoj funkciji da pristupim?
Npr ako imam dugme i za to dugme funkciju na ButtonClick Handler, e u toj funkciju kako da pristupim?
[ -zombie- @ 11.08.2003. 01:19 ] @
onda treba promenjive koje će da drže reference ka tim kontrolama da deklarišeš u klasi a ne u metodi, ali ipak kreiraš u FormLoad metodi, ovako nekako: (možda sam pogrešio u sintaxi -- ne pričam po vb, ali shvatićeš..)

Code:

Public Class Form1
    Dim objTabPage As TabPage
    Dim objControl As ChanalsWindowsControlLibrary.UserControlChanals
        
    Public Sub FormLoad(bla...)
        Me.objTabPage = New TabPage(m_Chanal.strChanalName)
        Me.objControl =  New ChanalsWindowsControlLibrary.UserControlChanals()
        ...
    End Sub

    Public Sub ButtonClick(bla)
        Me.objControl.Nešto=NeštoDrugo...
    End Sub

End Class


sav ostali kod bi trebao da bude isti.. naročito ovo u When bloku. (btw, .Property je najlepša sintaxa za ovu funkciju među programskim jezicima.. kratko i jasno, i bez mogućih konflikata.. ako nekad budem sklepao svoj jezik, biće to najlepši programski jezik na svetu ;))
[ arsa x @ 11.08.2003. 11:46 ] @
Nije mi bas jasno, jer postoji for ... next petlja i na svaki tabpage mi treba instanca:
Dim objControl As ChanalsWindowsControlLibrary.UserControlChanals
[ -zombie- @ 11.08.2003. 14:41 ] @
da, stvarno nisam video da je deklaracija unutar for petlje.. u tom slučaju samo napraviš niz.. elem, ja stvarno ne znam vb sintaxu toliko da bi ovo bilo ispravno, ali pogledaj malo help.. treba da izgleda ovako nekako..
Code:

Public Class Form1
    Dim objTabPage(50) As TabPage
    Dim objControl(50) As ChanalsWindowsControlLibrary.UserControlChanals
        
    Public Sub FormLoad(bla...)
        Dim i As Integer = 0
        For Each m_Chanal In m_Chanals
            i=i+1
            Me.objTabPage(i) = New TabPage(m_Chanal.strChanalName)
            Me.objControl(i) =  New ChanalsWindowsControlLibrary.UserControlChanals()
            Me.objTabPage(i).Controls.Add(Me.objControl(i))
            Me.tabControlChanals.TabPages.Add(Me.objTabPage(i))
            With Me.objControl(i)
                .Dock = DockStyle.Fill
                .Chanal = m_Chanal
            End With
        Next
    End Sub

    Public Sub ButtonClick(bla)
        Me.objControl(i).Nešto=NeštoDrugo...
    End Sub

End Class

(koristio niz sa određenim brojem članova pošto za neodređeni ne znam sintaxu)
[ Dragi Tata @ 11.08.2003. 16:00 ] @
Zombie je lepo objasnio, samo da dodam da umesto niza u ovakvom slučaju treba koristiti ArrayList, jer tako ne moraš unapred da znaš broj članova niza.
[ arsa x @ 11.08.2003. 17:33 ] @
E radi ovo super hvala.
Samo sad si me malo zbunio Dragi Tata :)
U vezi niza i ArrayList.
Zar nije dovoljno samo da se skloni broj u zagradi?
[ Dragi Tata @ 11.08.2003. 18:21 ] @
Koliko znam (a ni ja nisam neki ekspert za VB.NET),

Code:

Dim objTabPage() As TabPage


će samo da deklariše promenljivu objTabPage, ali neće da kreira objekat.

degojs?
[ degojs @ 11.08.2003. 18:52 ] @
Jašta, u pravu je Dragi Tata - ne kreira se objekt.

E sad, u VB.NET može da se koristi ReDim (Preserve) kasnije, na šta je Srđan verovatno mislio, ali takođe bih, kako već predloži Tata, koristio ArrayList. Razlog je prost: iako VB.NET ima mogućnost promene veličine niza pomoću ReDim Preserve to se svodi na kreiranje novog objekta.

Takođe, svaki VB.NET projekt automatski uveze (Import) Microsoft.VisualBasic namespace, što je meni obično prva stvar koju uklonim, kao i postavljanje Option Strict na On. Jednostavno, ako se radi novi projekt, trebalo bi se više oslanjati na .NET i tako olakšati život i programerima koji koriste druge jezike, a manje koristiti stvari koje su tu ionako samo zbog lakšeg prelaska sa VB6.


[Ovu poruku je menjao degojs dana 11.08.2003. u 15:57 GMT]
[ degojs @ 11.08.2003. 19:56 ] @
Mala demonstracija:
Code:

Dim i(5) As Integer ' pravimo niz od 6 emelenata
Dim j() As Integer

j=i ' sad i i j pokazuju na isti objekt

ReDim Preserve i(10) ' "menjamo" veličinu niza i, ali posle ovog i i j više ne pokazuju na isti objekt!


Suprotno tome, ArrayList:
Code:

Dim al As ArrayList = New ArrayList()
Dim bl As ArrayList

bl=al ' sada bl i al pokazuju na isti objekt

al.Add(102) ' al sada sadrži 1 element, kao i bl! al i bl i dalje pokazuju na isti objekt
[ Dragi Tata @ 11.08.2003. 20:44 ] @
Citat:
degojs:
Takođe, svaki VB.NET projekt automatski uveze (Import) Microsoft.VisualBasic namespace, što je meni obično prva stvar koju uklonim, kao i postavljanje Option Strict na On. Jednostavno, ako se radi novi projekt, trebalo bi se više oslanjati na .NET i tako olakšati život i programerima koji koriste druge jezike, a manje koristiti stvari koje su tu ionako samo zbog lakšeg prelaska sa VB6.

[Ovu poruku je menjao degojs dana 11.08.2003. u 15:57 GMT]


Koliko znam, Microsoft.VisualBasic namespace koristi VB runtime, pa to znači i dodatne komplikacije kod instaliranja.
[ arsa x @ 17.08.2003. 17:17 ] @
Tako sam i uradio sa arraylist.

DA neotvaram novu temu imam pitanje kako da na neki dogadjaj npr buttonclick vratim podatke iz kontrole u glavnu formu(nekoj funkciju)?
Znaci da mi jedna funkcija u glavnoj formi obradjuje podatke iz instanciranih user control-a
[ Dragi Tata @ 17.08.2003. 22:34 ] @
Citat:
vratim podatke iz kontrole u glavnu formu(nekoj funkciju)?


Ne razumem.
[ arsa x @ 17.08.2003. 23:29 ] @
Znaci u user control imam text polje i hocu da na button dogadjaj buttonclick koje se takodje nalazi u user control, da pozovem funkciju koja se nalazi u glavnoj formi .
Posto dinamicki instanciram user control moram ujedno proslediti podatak o kojoj se instanci radi.
nadam se da je jasnije
[ Dragi Tata @ 18.08.2003. 00:02 ] @
Možda je najbolje da u tvoju kontrolu ubaciš jedan delegate koji će da pokazuje na tu funkciju u glavnoj formi koja treba da se izvrši.
[ arsa x @ 18.08.2003. 17:02 ] @
Eh ti delegati...
Ono nezmam na koju foru nemogu da provalim kako sa njima....
Nadjoh i par linkova tutoriala o njima zatim imam knjigu Profesional VB .NET al opet nikako da se snadjem sa njima, aj pojasni ako nije problem.
[ Dragi Tata @ 18.08.2003. 17:34 ] @
http://www.15seconds.com/issue/020815.htm
[ degojs @ 18.08.2003. 18:28 ] @
Takođe, pogledaj i http://www.oreilly.com/catalog/progcsharp3/chapter/ch12.pdf

Jeste da nije VB.NET nego C#, ali mnogo je opširnije (čitavo poglavlje) i uz ovaj članak na koji te je uputio Dragi Tata, ne bi trebalo biti problema.
[ arsa x @ 18.08.2003. 22:29 ] @
Pogledao sam i opet nikako da razumem delegate do kraja. Ili je mozda kod mene drugcili slucaj.
Evo konkretno
U solution-u imam dva projekta u
1.jednom mi se nalazi Forma (class form1) - glavna forma
2.u drugom user control (class usercontrolChanels)

i Glavnu formu instanciram n user control (class usercontrolChanels)

u user control (class usercontrolChanels) imam textbox i hocu da pozovem metod (funkciju)iz glavne gorme na buttoncluck u user control, koja ce da obradi text iz textpolja
Kako da u ovom slucaju upotrebim delegate.
[ degojs @ 18.08.2003. 23:19 ] @
E kako si lenj..
Ako sam razumeo dobro imaš jednu Control Library koja ima Button i TextBox.

1. U korisničkoj kontroli dodaj sledeći kod: Public Event clickme()
2. Takođe dodaj sledaći kod:
Code:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        RaiseEvent clickme()
End Sub


E sad lepo dodaj referencu u glavni projekt na ovu control library i onda dodaj kontrolu na glavnu formu. U glavnoj formi dodaj kod:
Code:
Private Sub UserControl11_clickme() Handles UserControl11.clickme
        MsgBox("CLICKED!")
End Sub


Dakle,
1. dajemo na znanje da kontrola ima događaj "clickme"
2. Kad se klikne na Button1 u kontroli, mi podižemo događaj (RaiseEvent clickme)

I na kraju u glavnoj formi hvatamo taj događaj.

Ima tu još nekih detalja, ali evo ovako samo grubo da pojasnimo..
[ arsa x @ 19.08.2003. 01:36 ] @
Da to je to otprilike
jedino sa morao da stavim
Shared Event clickme()