[ [ivans] @ 10.11.2010. 21:40 ] @
Pozdrav svima,
imam početničko pitanje, a ono se sastoji u sledećem:

U programu postoje dve forme.
Na glavnoj formi nalaze se nekoliko dugmadi. Svako dugme poziva formu 2 (forma 2 se prikazuje modalno) i prosleđuje joj drugi objekat po referenci (dugme 1 poziva formu 2 i prosleđuje joj objekat A, dugme 2 poziva formu 2 i porosleđuje joj objekat B,....). Objekti su kreirani iz iste klase. Objekti moraju biti predati po referenci jer se menjaju u formi 2.

Kako proslediti objekat formi po referenci?

Nadam se da sam bio dovoljno jasan.

Hvala
[ vuchko.vuchko @ 11.11.2010. 09:23 ] @
Ja te bas i nisam skontao...
Kakav je objekat u pitanju i na koji ga nacin prosledjujes drugoj formi?

Mozda da okacis projekat ili neki slican primjer pa da se pozabavimo time.
[ Shadowed @ 11.11.2010. 09:36 ] @
Zar nije po default-u prosledjivanje objekata po referenci? Ako nije, probaj da dodas byref (izguglaj kako tacno, ne secam se, davno bese vreme sestice:) ).
[ [ivans] @ 11.11.2010. 17:56 ] @
Citat:
vuchko.vuchko: Ja te bas i nisam skontao...
Kakav je objekat u pitanju i na koji ga nacin prosledjujes drugoj formi?

Mozda da okacis projekat ili neki slican primjer pa da se pozabavimo time.



Klasa objekta je vrlo prosta:
Klasa clsPodaci

Code:

Option Explicit

Private m_A As Double
Private m_B As Double

Public Property Let A(ByVal vData As Double)
    m_A = vData
End Property

Public Property Get A() As Double
    A = m_A
End Property

Public Property Let B(ByVal vData As Double)
    m_B = vData
End Property

Public Property Get B() As Double
    B = m_B
End Property


Kod za prvu (glavnu) formu:

Code:

Private obj1 As clsPodaci
Private obj2 As clsPodaci

Private Sub Command1_Click()
    'treba prikazati formu 2 i proslediti joj objekat obj1
    Form2.Show vbModal
    
End Sub

Private Sub Command2_Click()
    'treba prikazati formu 2 i proslediti joj objekat obj1
    Form2.Show vbModal
    
End Sub

Private Sub Form_Load()
    
    Set obj1 = New clsPodaci
    Set obj2 = New clsPodaci
    
    obj1.A = 10#
    obj1.B = 15#
    
    obj2.A = 20#
    obj2.B = 30#

End Sub


Klikom na dugme jedan ili dva treba da se prosledi odgovarajući objekat formi 2. U formi dva se vrši izračunavanje i menja se prosleđen objekat(menjaju se vrednosti A i B). Po povratku iz forme objekat treba da ima nove vrednosti za A i B.

Nadam se da sam sada bio jasan :)


[ vuchko.vuchko @ 11.11.2010. 19:19 ] @
Mozda je ovde problem

Code:
Private obj1 As clsPodaci
Private obj2 As clsPodaci
ti ih dimenzionises da su "private", trebao bi "public"

Al mislim da sam te skapirao sta ti treba. Evo jedan primjer pa ako ti to moze pomoci, a ako ne javi se pa cemo rjesiti na neki drugi nacin.


S' tim da sam ja u primjeru koristio obicne variable a ne objekte!
[ [ivans] @ 11.11.2010. 20:32 ] @
Citat:
vuchko.vuchko: Mozda je ovde problem

Code:
Private obj1 As clsPodaci
Private obj2 As clsPodaci
ti ih dimenzionises da su "private", trebao bi "public"

Al mislim da sam te skapirao sta ti treba. Evo jedan primjer pa ako ti to moze pomoci, a ako ne javi se pa cemo rjesiti na neki drugi nacin.


S' tim da sam ja u primjeru koristio obicne variable a ne objekte!


Hvala na primeru, ali to nije ogovor na moje pitanje. Trenutno program koristi globalne objekte, a u formi 2 se ispituje koji je objekat aktivan i njegove vrednosti se menjaju. Hteo sam neko elegantnije rešenje :).

Sledeći kod delimično radi:

forma 1

Code:
 Private Sub Command1_Click()
    'treba prikazati formu 2 i proslediti joj objekat ojb1
    'Form2.Show vbModal
    
    Form2.InicijalizujFormu obj1
    Debug.Print obj1.A 
End Sub


forma 2

Code:

Public Sub InicijalizujFormu(ByRef obj As clsPodaci)
    obj.A = 100#

    Me.Show vbModal
End Sub

Private Sub Command1_Click()
    Unload Me
End Sub


Kreirao sam Public Sub InicijalizujFormu u formi 2. Prosleđujem joj objekat koji želim (u ovom slučaju, klikom na dugme 1, prosleđujem objekat 1).
U ovoj funkciji ojb.A = 100# radi i po povratku u formi 1 vrednost je promenjena na 100.


Sada treba omogućiti bilo kojoj funkciji, unutar forme 2, da može menjati vrednost objekta. Imaš neki predlog?

Pozdrav
[ vuchko.vuchko @ 11.11.2010. 22:22 ] @
Ima dosta nacina da se to uradi, stvar je u kombinovanju poznatih metoda...

Evo u ovom primjeru sam "sklepao" dva nacina koja provjereno rade, sigurno je da se ovo moze i bolje, al ukljuci malo i ti inspiracije . Javi jel ti ovo pashe!
[ [ivans] @ 11.11.2010. 23:01 ] @
Primer za formu 2 ne može da se iskoristi jer uvek gleda obj1.
Primer za formu 3 može.
Jel postoji mogućnost predati objekat drugom objektu . Primer za formu 3:

Code:

Private tmpObj as clsPodaci

Public Sub Iniciraj(ByRef obj As clsPodaci)

Set tmpObj = New clsPodaci

End Sub

Private Sub Command1_Click()
tmpObj.A = 100#
Unload Me
End Sub
[ dava @ 12.11.2010. 09:03 ] @
Po defaultu se objekti prosledjuju po referenci.

Code:

Dim a As Integer

Private Sub Form_Load()
    a = 5

    Uvecaj a
    
    Debug.Print a
    
End Sub


Private Function Uvecaj(a As Integer)
    
    a = a + 1
    Debug.Print a
    
End Function


U ovom primjeru varijebli 'a' je podesena vrijednost 5. Ta varijabla se prosledjuje kao parametar funkciji 'Uvecaj' po referenci, a to se vidi tako sto f-ja 'Uvecaj' postavi vrijednost var. na 6 pa nakon izlaska iz funkcije ta varijabla ima vrijednost 6.

Code:

Dim a As Integer

Private Sub Form_Load()
    a = 5

    Uvecaj a
    
    Debug.Print a
    
End Sub


Private Function Uvecaj(ByVal a As Integer)
    
    a = a + 1
    Debug.Print a
    
End Function


U drugom primjeru koji se odnost na prosledjivanje po vrijednosti se vidi da će varijabla 'a' nakon izlaska iz f-je zadržati vrijednost 5.
[ [ivans] @ 12.11.2010. 09:32 ] @
@dava

Razumem tvoj kod, ali to nije odgovor na moje postavljeno pitanje.

Pitanje je glasilo kako proslediti različite objekte (koji imaju istu klasu) jednoj (univerzalnoj) formi, izvršiti neki proračun i promeniti vrednosti tog objekta tako da objekat po povratku iz te forme promenjen.

Primer:

U windows exploreru za svaki fajl desnim klikom miša možemo pozvati istu formu "Properties" gde su upisani podaci vezani za taj fajl. U ovoj formi možemo promeniti osobine fajla (primer sakriti fajl) i po povratku iz ove forme fajl je promenio osobinu vidljivost. Znači da u njegovom kodu postoji objekat tipa fajl (objekat je različit za svaki faj) koji se prosleđuje istoj univerzalnoj formi (ista je za sve fajlove), menja se osobina tog objekta u formi i objekat ostaje promenjen po izlazku iz te forme.

Nadam se da sam ovim primerom bio jasan :))
[ vuchko.vuchko @ 12.11.2010. 11:23 ] @
Pa jel ti ne rjesava problem ovo moje rjesenje sa formom 3???
[ [ivans] @ 13.11.2010. 05:45 ] @
Citat:
vuchko.vuchko: Pa jel ti ne rjesava problem ovo moje rjesenje sa formom 3???


Hvala na tvom rešenju i ono rešava primer koji sam postavio. Kod stvarne aplikacije, kao što je moja, klasa ima veliki broj podataka pa je ovaj postupak teško upotrebljiv (treba pistati dosta koda u formi 2).

Problem sam rešio i napisaću ta u sledećam postu.

Pozdrav

[ [ivans] @ 13.11.2010. 06:20 ] @
Rešenje za problem kako pozvati formu i proslediti joj objekat po referenci

Napomena: Stručni izrazi, definicije i sam kod možda nisu tačni (ja nisam profesionalac već amater) pa su ispravke-dopune dobrodošle.

Kod za klasu clsPodaci:

Code:
Option Explicit

Private m_A As Double
Private m_B As Double

Public Property Let A(ByVal vData As Double)
    m_A = vData
End Property

Public Property Get A() As Double
    A = m_A
End Property

Public Property Let B(ByVal vData As Double)
    m_B = vData
End Property

Public Property Get B() As Double
    B = m_B
End Property


Kod za glavnu forma 1

Code:
Private obj1 As clsPodaci
Private obj2 As clsPodaci

Private Sub Command1_Click()

    Debug.Print "Pre ulaza u formu 2 obj1.A = ", obj1.A
    
    'Prosledjuje obj1 formi 2
    Form2.InicijalizujFormu obj1
    
    Debug.Print "Po izlasku iz forme 2 obj1.A = ", obj1.A
    
End Sub

Private Sub Command2_Click()
    
    Debug.Print "Pre ulaza u formu 2 obj2.A = ", obj2.A
    
    'Prosledjuje obj2 formi 2
    Form2.InicijalizujFormu obj2
    
    Debug.Print "Po izlasku iz forme 2 obj2.A = ", obj2.A
    
End Sub

Private Sub Form_Load()
    
    Set obj1 = New clsPodaci
    Set obj2 = New clsPodaci
    
    obj1.A = 10#
    obj1.B = 15#
    
    obj2.A = 20#
    obj2.B = 30#

End Sub


U formi se kreiraju dva objekta obj1 i obj2 i postavljaju im se vrednosti za A i B.
Klikom da dugme 1 ili 2 prosleđuje se različit objekat pozivom "InicijalizujFormu" iz forme 2. Forma 2 se ne poziva klasično "Form2.Show vbModal" već je kreiran Sub "InicijalizujFormu" u formi 2 kojoj prosleđujemo objekat.

Kod za formu 2:
Code:
Option Explicit
Private m_obj As clsPodaci

Public Sub InicijalizujFormu(ByRef obj As clsPodaci)
    'Graska koju sam pravio
    'Ovaj kod pri kompajliranju javlja gresku
    'Set m_obj = New clsPodaci
    'm_obj = obj
    
    'Ispravan postupak
    Set m_obj = obj 'predaja lokalnom objektu po referenci
    Me.Show vbModal 'prikazi formu i postavi je na vbModal
End Sub

Private Sub Command1_Click()
    m_obj.A = m_obj.A + m_obj.B
    Unload Me
End Sub


Sub InicijalizujFormu prima prosleđeni objekat i on se predaje lokalnom objektu m_obj po referenci. Sada m_obj možemo koristiti bilo gde u formi 2 da promenimo prosleđeni objekat što je i učinjeno u Command1_Click().

Napomena:
Ako se forma 2 pozove naredbom Form2.Show vbModal iz forme 1 javiće se greška pri pritisku na dugme Command1, u formi 2, jer m_obj nije inicijalizovana.

Nadam se da je ovo ispravno i da će nekome koristiti :).
Pozdrav