[ Sija @ 26.03.2014. 20:55 ] @
Početnik sam i ne mogu da nadjem resenje za ovaj problem:

Sa jedne forme, neka bude Forma1, otvaram neku drugu, sa te druge trecu itd.itd.
Na kraju sa neke n-te forme treba da vratim neki podatak na Forma1.

Kako pratiti kroz forme tu prvu formu na koju trebam nešto vratiti? Da li postoji ID svake nove forme koji se dodjeluje u runtime-u(ne mogu po nazivu pratiti jer mogu imati više otvorenih formi sa istim imenom)?

Jednostavno nemam ideju kako ovo odraditi. :-(

Hvala unaprijed.
[ AMD guy @ 26.03.2014. 21:04 ] @
http://www.dreamincode.net/for...53-passing-data-between-forms/

Svaka forma treba da bude nezavisna, uopste ne treba da znaju da druga postoji, samo da salju podatke izmedju sebe. Procitaj ovaj tutorial mozda ce ti biti jasnije.
[ S A J A @ 27.03.2014. 07:36 ] @
U osnovnoj formi napravi promenljivu koja će biti vidljiva u celom programu.

Public Shared nesto As String



Dalje možeš tu promenljivu da koristiš svuda u programu, samo što moraš da navedeš ime forme na kojoj se nalazi, na primer:

Forma1.nesto = "abc"

[ Shadowed @ 27.03.2014. 09:56 ] @
Zasto Shared?
[ S A J A @ 27.03.2014. 10:39 ] @
Citat:
Shadowed: Zasto Shared?


Vidi, mnogo pitaš :)

Meni tako radi, a kad radi onda se ne dira.
Mislim radiće i bez toga ali ovako je sigurnije kad se želi globalna promenljiva, bez toga se odnosi samo na instancu klase.
[ AMD guy @ 27.03.2014. 10:44 ] @
To sto radi ne znaci da dobro radi. Ja bas i ne radim puno u VB.NET-u ali kada ne moram, ne koristim shared. Ne mora bas svaki objekat da zna sta moja instanca ima.
Ako nesto radi barem znaj zasto radi i kakve su moguce posledice.
[ S A J A @ 27.03.2014. 12:56 ] @
Ne znam za druge situacije ali ovo što sam naveo je jednostavno rešenje za globalnu promenljivu, a to je odgovor na postavljeno pitanje. Tako radim već godinama i nisam primetio nikakve posledice. Verujem da postoje i druga rešenja ali nisam za eksperimentisanje kad imam jednostavnu stvar koja odlično radi to što treba. Na svakoj aplikaciji koju sam pravio, na startup formu koja je uglavnom MDI, stavim nekoliko "Public Shared" promenljivih koje će mi kasnije trebati na raznim mestima.

Kad hoću da "pošaljem" neki podatak u novu formu, onda koristim TAG. Prostije i jednostanije rešenje nisam našao.

Dim n As New FormNaloziDetalji
n.Tag = GridViewNalozi.CurrentRow.Cells("id").Value
n.ShowDialog()

Po otvaranju te forme dalje lako koristim ono što sam smestio u TAG i povezujem sa kontrolama i šta mi sve već treba...
Opet ponavljam, verujem da ima i drugih rešenja, ja koristim ovo jer je prosto i jednostavno a VB koristim upravo zato da bi bio "basic" a ne da komplikujem.

[ Marko_L @ 27.03.2014. 13:55 ] @
Ne radi se o tome da li se komplikuje ili ne, već o nerazumevanju čemu koji keyword služi, što vodi ka korišćenju loših praksi, a to opet dovodi do bagova koje je teško uočiti kada se ne razume suština problema. Shared ne služi da učini promenljivu globalnom, za to služi Public keyword, dok je shared keyword čini statičnom što znači da će biti deljena između svih instanci klase. Ti nisi imao problema sa tim zato što si očigledno uvek koristio samo jednu instancu klase, ali da si ih imao više, verovatno bi naleteo na probleme za koje ti ne bi bilo jasno otkud se stvoriše. Recimo, zamisli da imaš u klasi property ID koji ima za cilj da identifikuje konkretnu instancu. I ti sad otvoriš 10 instanci i svakoj dodeliš inkrementalnu vrednost 1-10 kao ID. Baš bi se iznenadio kada bi shvatio da sve instance imaju ID 10 :)

Dakle, ako je potrebna globalna promenljiva, dovoljan je Public keyword. Takođe, da bi ta promenljiva zaista bila globalno dostupna, valjalo bi je deklarisati u modulu i onda možeš da joj pristupaš bez navođenja naziva klase. Na isti način treba pisati globalne funkcije i procedure.

Inače to sa tagom nije loš način za prosleđivanje vrednosti novoj formi, ali bih ja predložio da se to ipak uradi na drugačiji način koji je malo više OOP. Dakle, napraviš klasu koja nasleđuje od klase forme kojoj se pristupa, i onda umesto da kreiraš instancu forme, kreiraš instancu klase koja nasleđuje od te forme, a u derived klasi napraviš property-je koji predstavljaju podatke koji trebaju da se koriste u novoj formi. Na taj način dobijaš na skalabilnosti, jer ako ti ikada treba da proslediš neke nove vrednosti, koje su možda drugačijeg tipa, samo dodaš nove property-je. Ako ti treba drugačije ponašanje forme u odnosu na neku odabranu opciju, možeš to da odradiš kroz konstruktore u svojoj klasi. Takođe, izbegavaš potrebu za konverzijom između različitih tipova podataka, jer Tag je svojstvo tipa Object i primiće šta god mu pošalješ, ali kada to treba da iskoristiš, može doći do raznih grešaka, jer sistem ne zna sa kojim tipom podatka radi. Sa takvim načinom programiranja, kladim se da bi kad bi uključio Option Strickt On, dobio jedno stotinak grešaka u kodu :) A da ne pričamo o tome da je na ovaj način i inteli-sense svestan postojanja tih property-ja, pa ti je lakše da se snađeš u kodu prilikom prepravki, itd.
[ Shadowed @ 27.03.2014. 14:05 ] @
Aplikacija moze da radi (postize cilj) na vise nacina, neki su bolji neki losiji.

A za ovo konkretno sto je pitano, bez shared nije komplikovanije. Zapravo je jednostavnije - samo izbacis "Shared" :)
Onda ti ta promenljiva bude ista kao ta Tag koju koristis (ni ona nije Shared).

Dakle, u samom pravljenju, za mrvicu je jednostavnije (imas jednu rec koda manje).
A razlika u efektu je sledeca:
Ako koristis samo jednu instancu forme u jedno vreme, osiguravas se da neces imati staru vrednost.
Ako koristis vise instanci te forme.. Pa, shared promenljiva ce ti biti ista u svima sto u vecini slucajeva ne zelis.


Sto se tice prakse da napravis nekoli shared promenljivih u formi kao globalne promenljive, to je polu-losa praksa.
Losa praksa je imati globalne promenljive, ali mozes to grupisati u konfiguracionu klasu koja sadrzi samo shared promenljive/property-e (ili koja je singleton). Dakle, imas istu stvar ali bolje organizovanu.



PS. Za C# ljude, Shared je isto sto i static u C#-u.
[ Shadowed @ 27.03.2014. 15:15 ] @
Citat:
Marko_L:
Inače to sa tagom nije loš način za prosleđivanje vrednosti novoj formi, ali bih ja predložio da se to ipak uradi na drugačiji način koji je malo više OOP. Dakle, napraviš klasu koja nasleđuje od klase forme kojoj se pristupa, i onda umesto da kreiraš instancu forme, kreiraš instancu klase koja nasleđuje od te forme, a u derived klasi napraviš property-je koji predstavljaju podatke koji trebaju da se koriste u novoj formi. Na taj način dobijaš na skalabilnosti, jer ako ti ikada treba da proslediš neke nove vrednosti, koje su možda drugačijeg tipa, samo dodaš nove property-je. Ako ti treba drugačije ponašanje forme u odnosu na neku odabranu opciju, možeš to da odradiš kroz konstruktore u svojoj klasi.

Ako je ta forma tvoja tj. nije iz nekog referenciranog assembly-a, nema potrebe za dodatnom gimnastikom jer je taj princip vec primenjen kada si pravio tu formu (nasledjena je is klase Form). Doveljno je da te property-e dodas u nju.
Ako formu imas samo kao gotov proizvod koji referenciras (ili imas neki razlog totalno nevezan za sve ovo) onda naravno, nasledis (ako nije zabranjeno) i dodajes sta treba.

Citat:
Marko_L: Takođe, izbegavaš potrebu za konverzijom između različitih tipova podataka, jer Tag je svojstvo tipa Object i primiće šta god mu pošalješ, ali kada to treba da iskoristiš, može doći do raznih grešaka, jer sistem ne zna sa kojim tipom podatka radi. Sa takvim načinom programiranja, kladim se da bi kad bi uključio Option Strickt On, dobio jedno stotinak grešaka u kodu :) A da ne pričamo o tome da je na ovaj način i inteli-sense svestan postojanja tih property-ja, pa ti je lakše da se snađeš u kodu prilikom prepravki, itd.

Sa ovim se sasvim slzem i jedan je od razloga zbog kojih ne koristim Tag. Type safety je i sigurniji i jednostavniji za rad.
[ Marko_L @ 27.03.2014. 15:54 ] @
Citat:
Ako je ta forma tvoja tj. nije iz nekog referenciranog assembly-a, nema potrebe za dodatnom gimnastikom jer je taj princip vec primenjen kada si pravio tu formu (nasledjena je is klase Form). Doveljno je da te property-e dodas u nju.

Potpuno si u pravu. Može i tako. Štaviše, ako je manji projekat u pitanju, onda i bolje tako. Nego ja imam tu profesionalnu deformaciju da sve rasparčam koliko god mogu na neke logičke celine, tako da samu klasu koja predstavlja formu gledam da držim maksimalno čistom, odnosno da samo obrađuje evente i apdejtuje UI, dok svu ostalu logiku, a koja je vezana za tu formu gledam da prebacim u drugu klasu, ili klase zavisno već od kompleksnosti. Postoje dva glavna razloga za to. Prvi je taj što mi je lakše da se snađem u kodu kada imam više klasa sa manje linija koda, nego jednu ogromnu klasu sa više hiljada linija koda. A drugi je, kada više ljudi radi na projektu, može lakše da se podeli posao između onoga ko radi prezentacioni deo i onoga ko recimo radi na biznis logici, jer se radi na dva različita fajla, pa se smanjuje mogućnost za stvaranje konflikta koji posle moraju da se resolvuju čime se gubi vreme. To se naravno može uraditi i sa parcijalnim klasama i na još par načina. Sve to ne menja ništa u funkcionalosti, već je samo stvar stila kodiranja i/ili dogovora između developera ako više ljudi radi na projektu.
[ Sija @ 27.03.2014. 19:53 ] @
Hvala na pomoći.

Početnik sam pa ću valjda shvatiti jednog dana ili nisam dobro postavio pitanje pa da ga preformulišem:

Sa glavne forme otvaram instancu Form1, sa nje otvaram instancu Form2, zatvaram Form2 i otvaram instancu Form3.
Sa Form3 treba da vratim npr. string na Form1 samo ne znam kako budući da je Form1 instanca ne mogu da prenosim referencu na nju po imenu kroz forme.
Kako do te instance Form1 da dođem? Ne znam kako pozvati baš tu i samo tu instancu forme sa koje sam krenuo.



Izvinjavam se ako sam naporan ali me ovo muci vec neko vrijeme.


Rijeseno ovako:

Kod na glavnoj formi:
Code:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim myForm As New Form1

        myForm.myCaller = Me

        myForm.Show()
    End Sub

Kod na Form1
Code:
   Public myCaller As Form

 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim myForm As New Form2


        myForm.myCaller = Me

        myForm.Show()

    End Sub


i sve tako do forme koja vraca na Form1.:

Code:
Public myCaller As Form
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     
            myCaller.Text = "NESTO"
       
    End Sub


[Ovu poruku je menjao Sija dana 27.03.2014. u 22:09 GMT+1]

[Ovu poruku je menjao Sija dana 27.03.2014. u 22:10 GMT+1]
[ ravni @ 28.03.2014. 07:37 ] @
Citat:
...a kad radi onda se ne dira.
Ovo funkcionise na vise nivoa:
1. totalni pocetnik: ne zna tacno kako nesto radi, i stvarno je bolje da se ne menja bez preke potrebe
2. advanced: siguran u sebe, izgvara ovo kao salu
3. seasoned professional: zna da nekad i najtrivijalnija stvar ima skrivene zavisnosti koje nekad ukljucuju bagove u vise povezanih komponenti koji se medjusobno ponistavaju i da naizgled korektna ispravka od 2 minuta dovodi do visesatnog cupanja kose kada se softver sa ispravkom konacno isporuci


:)
[ S A J A @ 28.03.2014. 09:48 ] @
Citat:
Sija:
Početnik sam pa ću valjda shvatiti jednog dana ili nisam dobro postavio pitanje pa da ga preformulišem:
Sa glavne forme otvaram instancu Form1, sa nje otvaram instancu Form2, zatvaram Form2 i otvaram instancu Form3.
Sa Form3 treba da vratim npr. string na Form1 samo ne znam kako budući da je Form1 instanca ne mogu da prenosim referencu na nju po imenu kroz forme.
Kako do te instance Form1 da dođem? Ne znam kako pozvati baš tu i samo tu instancu forme sa koje sam krenuo.


Nije da mi je baš potpuno jasno šta radiš ali probaću da odgovorim na osnovu delimične jasnoće:

Ti iz nekog razloga imaš potrebu da imaš više formi i da prenosiš podatke između njih. Ja sam za svrhu dopisivanja između formi koristio TAG ali u tvom slučaju mislim da on nije dobro rešenje jer preskačeš forme. Koliko sam razumeo, ti otvoriš 1-2-3 pa onda hoćeš nešto sa 3 da se nađe na 1. Ja u tom slučaju ne bi išao na razmenu podataka između formi već bi napravio globalne promenljive koje bi bile dostupne svakoj formi. Znači promenjiva ne bi "stajala" na formi pa da imaš potrebu da je gađaš nego bi forma po svom pokretanju proveravala promenjivu koja je globalna.

To bi otprilike ovako izgledalo: napraviš globalnu promenljivu AAA i forma1 kad se pokrene proverava da li tu ima nešto ili nema. Potpuno je nebitno odakle se pojavila vrednost te promenljive, u tvom slučaju bi to bila forma3. Znači neko uđe u formu1, pa formu2, pa formu3, tamo unese vrednost koja se smesti u AAA i posle kad se ponovo otvori forma1 tebi je dostupno da se u AAA nešto nalazi.

Za globalne promenljive ja sam koristio "Public Shared" na startup formi jer mi je ona uvek aktivna jer je MDI, tu mi stoji glavni meni i razne druge stvari. Drugo rešenje je ovo što je napisao Marko, dodaj u projekat novi modul, to se radi sa: desni klik na projekat, Add, New Item.., izaberi Module pa klikni na Add. U projektu će ti se pojaviti Module1.vb, dvoklik na njega i tu možeš da pišeš svoj kod. Tu napiši: Public AAA as string. Dalje ćeš svuda u programu moći da koristiš tu promenljivu AAA. Ne moraju da budu velika slova, ja sam to stavio ovde da bude čitljivije.

Ako je bitno da se pošalje više od jednog podatka, možeš da otvoriš više promenljivih a možeš i da ih uvežeš u niz, strukturu ili slično. Na primer, ako ti na formi1 treba sadržaj promenljive AAA kao i informacije odakle je to došlo.

Nadam se da ti ovo može pomoći, ako to nije to onda malo detaljnije objasni šta radiš, na nekom konkretnom primeru. Možda osnovna postavka nije dobro odrađena, možda je bolje stvari organizovati na drugi način, to sad ovako ne može da se zna. Ja sam odgovorio vezano za "razmenu podataka" između formi bez da mi je jasno zašto si uopšte napravio takvu koncepciju.
[ Shadowed @ 28.03.2014. 09:55 ] @
Marko_L, to je sad vec druga prica koja je naravno tacna i odnosi se na organizaciju cele aplikacije. Ali sto se tice prosirenja forme da bi joj dodao neki property, jednostavno nema potrebe praviti jos jedan nivo nasledjivanja.


@Sija, ovo se zaista moze uraditi na vise nacina pa je najbolje da napises cemu tacno sluzi koja forma pa da mozemo dati sto bolji odgovor.
[ Sija @ 28.03.2014. 14:13 ] @
Radi se o običnoj pretrazi npr.:

1. Sa forme1 otvaram formu za pretragu
2. po unosu podataka na formu za pretragu ta forma se zatvara
3. otvara se forma sa rezultatom/ima pretrage
4. forma sa rezultatom se zatvara i rezultat pretrage vraćam na početnu formu 1

Ta forma1 je instanca i tih instanci može biti više i one su otvorena cijelo vrijeme.
Zbog toga moram da "gađam" baš određenu instancu tj. sa koje je krenulo sve jer ne znam kako da pretraga koja je krenula baš sa te instance vrati rezultat baš toj instanci.
Javne promjenjive ne mogu da koristim jer će se desiti da pretraga sa bilo koje instance mijenja tu promjenjivu.
[ ravni @ 28.03.2014. 15:40 ] @
Probajmo ovako
Code (csharp):

class Forma1:Form
{
  ...  
  btnPretrazi.Click += delegate { Pretrazi() };  
  ...

  void Pretrazi()
  {
    using(var pretragaForm = new PretragaForm())
    {
      if(pretragaForm.ShowDialog() == DialogResult.Ok)
       {
         using(var rezultatiForm = new RezultatiForm())
         {
           rezultatiForm.Init(
                              pretragaForm.OdabraniParametarPretrage1,
                              pretragaForm.OdabraniParametarPretrage2,
                              ...);
         
            if(rezultatiForm.ShowDialog() == DialogResult.Ok)
            {
              PrimeniRezultatePretrage(rezultatiForm.Rezultat);
            }
         }
       }
    }
  }
   
  void PrimeniRezultatePretrage(string rezultatPretrage)
  {
    // neki kod koji koristi resultat
  }    
}


class PretragaForm:Form
{
     ...
     public int OdabraniParametarPretrage1 {get; private set;}
     public bool OdabraniParametarPretrage2 {get; private set;}
     ...
}

class RezultatForm:Form
{
  public void Init(int parametarPretrage1, bool parametarPretrage2 ...)
  {
    ...
  }
 
  public string Rezultat {get; private set;}
}
[ S A J A @ 28.03.2014. 15:44 ] @
Citat:
Sija: Radi se o običnoj pretrazi npr.:


Ja bi to uprostio.

Kad imam neku formu sa podacima (grid), pretragu i filtere stavljam sa strane tako da sve stoji na jednoj formi i lako se koristi.
Ako ne može tako, onda idi na kombinaciju sa dve forme, nikako tri.
Znači u prvoj formi se zadaju parametri za pretragu a rezultati da stoje u drugoj formi koja se pojavi.
Ili, sve stoji u drugoj formi, i parametri i rezultati.
Ako ne mogu parametri i rezultat da stanu na jednu formu, možeš koristiti neki kontejner kao na primer Tab Contol pa da to odvojiš. Samo je poenta da bude na istoj formi.
I onda, pošto imaš samo dve forme, lako ti je one razmenjuju podatke, možeš koristiti TAG (ko o čemu ja o TAG-u, ko je to smislio svaka mu dala).
To bi radilo ovako: korisnik klikne na dugme "pretrage", otvori se forma, upiše parametre, uradi se pretraga, prilikom zatvaranja rezultat smestiš u TAG i dalje taj tag preuzme forma 1.

Ovako:

Code:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim myForm As New Form1
        myForm.ShowDialog()

        If String.IsNullOrEmpty(myForm.Tag) = False Then
              ... ovde upišeš šta ti već treba sa rezultatima pretrage ...
        End If

End Sub


Naravno, podrazumeva se da vodiš računa o formatu toga što stavljaš u tag.
Samo obrati pažnju da se forma za pretragu otvara sa ShowDialog(). Ako staviš samo Show() onda ti ovo neće raditi. U tom slučaju bi morali da smislimo nešto drugo.
[ Marko_L @ 28.03.2014. 17:45 ] @
U tom slučaju nema potrebe koristiti Tag, već se kroz instancu druge forme može pristupiti bilo kom property-ju, kontroli ili metodi te druge forme i očitati neka vrednost. Takođe, valjalo bi zatvoriti tu instancu jednom kada se sa njom završi.

Code:
Using frmRes As New Form1
   If frmRes.ShowDialog() = Windows.Forms.DialogResult.OK Then
      'ovde se nešto uradi sa rezultatima pretrage
   End If
End Using


[ Sija @ 29.03.2014. 16:41 ] @
Ne mogu da stavim na 2 forme. Parametara za pretragu ima toliko da su u TabControl, a rezultat pretrage bi se otvorio na formi sa gridom koje bi opet mogao editovati itd. itd.

[ S A J A @ 30.03.2014. 10:50 ] @
Citat:
Sija: Ne mogu da stavim na 2 forme. Parametara za pretragu ima toliko da su u TabControl, a rezultat pretrage bi se otvorio na formi sa gridom koje bi opet mogao editovati itd. itd.


Ti ko da praviš svemirski brod :)

Probaj onda ovako: na prvu formu, gde treba da se primene rezultati pretrage, stavi Public Sub(naki argumenti). Onda možeš iz treće forme da pozoveš tu proceduru, pošalješ joj određene podatke i ona će se izvršiti na formi 1. Sad sam probao i radi, ja na prvoj formi imam samo glavni meni, napravio sam Public proceduru koja stavlja da je glavni meni Visible=False. Onda sam u trećoj po nivou formi pozvao tu proceduru i meni je nestao :) Dakle može.
[ Sija @ 30.03.2014. 14:50 ] @
Nije svemirski brod samo sam tako zamislio da radi ali sve mi se čini da ću da krpim. Kao korisnik aplikacija sam kao mađioničar u 5 minuta nađem grešku u programu pa ne bih da mi se desi kada jednog dana završim aplikaciju i dam nekom na korištenje da me zivka svakih 5 minuta. :(


Problem i jeste u pozivanju nečega na prvoj formi. Kako da pozovem kada je i ta prva forma instanca, a da ne utiče na druge instance?
Suština je da ne mogu da nađem neko normalno rješenje za pristup toj određenoj instanci.


[ S A J A @ 30.03.2014. 18:57 ] @
Pobaj ovako:

Kad otvaraš nove forme upiši im Owner.

Dim f2 As New Form2
f2.Owner = Me
f2.Show()


Dim f3 As New Form3
f3.Owner = Me
f3.Show()


Na formi1 stavi

Public Sub Nesto()
...
End Sub


U formi3 pozivas proceduru sa:

CallByName(Me.Owner.Owner, "Nesto", CallType.Method)
[ Sija @ 30.03.2014. 19:56 ] @
@S A J A

Hvala care. :D

Za ovo sam ti dužnik veeeeliki.
[ Shadowed @ 31.03.2014. 07:41 ] @
Nisam bio tu da ti ranije odgovorim.
Elem, sto se Sajinog reesnja tice, ok je osim poslednjeg dela. Nema nikakvog razloga da se koristi CallByName a nije type safe. Umesto toga je bolje koristiti:

Code (vbnet):
DirectCast(Me.Owner.Owner, Form1).Nesto()


Ili jos bolje:
Code (vbnet):

If Me.Owner IsNot Null AndAlso Me.Owner.Owner IsNot Null AndAlso Me.Owner.Owner Is Form1 Then
    DirectCast(Me.Owner.Owner, Form1).Nesto()
End If
 


To je sto se tice resavanja konkretne situacije.


Sistematski, bolje resenje je da ti druga klasa vrati podatke o filtriranju u prvu pa onda prva pozove trecu. Tako svaka radi svoj posao. Prva je glavna, druga dobavlja filter, treca trazi. Nesto ovako (sorry ako ima po neka sintaksna greska, ne radim u vb-u godinama):

Klasa za filter:
Code (vbnet):

Class PeopleFilter
    Public Property FirstName As String
    Public Property LastName As String
End Class
 


U Form2 i u Form3:
Code (vbnet):
Public Property Filter as PeopleFilter


Kada se klikne na OK (ili sta vec imas) u Form2, popunis Filter.

U Form1:
Code (vbnet):

Dim FilterForm As New Form2
If FilterForm.ShowDialog() = DialogResult.OK AndAlso FilterForm.Filter IsNot Null Then
    Dim SearchForm As New Form3
    SearchForm.Filter = FilterForm.Filter
    SearchForm.ShowDialog()
End If
 



Naravno, to moze da se prosiruje i uopstava dalje, zavisno od slozenosti projekta, ali ovo je generalna ideja.
[ Sija @ 02.04.2014. 13:56 ] @
@Shadowed

Kako da se ovo odradi sa klasama, a da FilterForm i SearchForm nisu pozvane sa ShowDialog nego samo sa Show?
[ Shadowed @ 03.04.2014. 13:29 ] @
Ako ces sa Show, onda nemas tu povratnu informaciju koju ti inace ShowDialog vraca tako da treca forma mora na neki nacin da obavesti da je zavrsila (tacnije da hoce da vrati rezultate).
E sad, mozes to na onaj nacin kako je Saja rekao, ali uz onu izmenu koju sam napisao (da ne koristis CallByName). To je svakako krace i ako je aplikacija bas mala, mozes tako.
Bolja opcija je da treca forma ima event koji okida kada hoce da vrati rezultate. Onda event handler moze biti na prvoj formi. Povezivanje event handler-a sa eventom moze da se uradi na vise nacina. Jedan mozes videti u primeru koji sam ti napravio. Okacen je uz poruku. Glavna prednost eventa je da formu 3 mozes koristiti odakle god hoces, dok sa onim pozivanjem funkcije iz owner-ovog owner-a si zavistan da to bude bas forma1 i da je bas drugi nivo owner-a i da su owneri postavljeni. Ovako, forma 3 okine event pa ako je neko zainteresovan, zakacice svoj handler.

To se, naravno, moze dalje generalizovati i uopstavati, zavisno od potreba. Mogu se uvesti generics i sl. pa da imas filtere za razne vrste podataka i forme i sl. ali to je na tebi, ovo je proof of concept :)