[VB6] probjeem met Obj = Obj

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • honda4life
  • Registratie: Januari 2007
  • Laatst online: 25-09 16:59
Doel:
Een zelfgemaakt object (clsObject) die in een lus zit toe te voegen aan een collection of iets gelijkaardig

Probleem:
Doordat deze in de lus zit, en ik deze met .Add toevoeg aan de collectie, zijn alle items gelijk aan het laatste item.

Oorzaak: .Add is ByRef

Oplossing:
Een tweede object (clsObjecten) aanmaken en het vorige object toevoegen in een array

Visual Basic:
1
2
3
4
5
6
Public Sub Add(ByVal v_clsItem As clsObject) 'Toevoegen van een object
ReDim Preserve m_aItems(m_iCount) 'Array van objecten met 1 vergroten
Set m_aItems(m_iCount) = New clsObject
m_aItems(m_iCount) = v_clsItem 'Poging tot object toe te voegen aan array van objecten
m_iCount = m_iCount + 1 'Aantal items onthouden
End Sub


m_aItems(m_iCount) = v_clsItem: Hier gaat het fout
m_aItems(m_iCount) & v_clsItem zijn beiden van het type clsObject
zet ik er SET voor werkt dit wel, maar dan zit ik met hetzelfde probleem, omdat set ByRef is

Wat doe ik verkeerd, sorry dat ik her hier kom vragen, docent is afwezig, en zou graag voortdoen aan eindwerk
Waarschijnlijk elementaire fout

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

kijk eens naar regel 2 en naar regel 5. Zoek de verschillen..

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • honda4life
  • Registratie: Januari 2007
  • Laatst online: 25-09 16:59
is door het vastlopen verloren gegaan, zie ik inderdaad nu, zal het ff aanpassen, maakt geen versschil hoor

Acties:
  • 0 Henk 'm!

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 09:11

sopsop

[v] [;,,;] [v]

Waarom heb je een aparte var voor het aantal items? Dat kun je prima uit de array zelf halen (ubound).

Je code wordt dan:
Visual Basic:
1
2
3
4
Public Sub Add(ByVal v_clsItem As clsObject) 'Toevoegen van een object 
  ReDim Preserve m_aItems(uBound(m_aItems)) 'Array van objecten met 1 vergroten 
  Set m_aItems(uBound(m_aItems)-1) = v_clsItem 
End Sub

Er vanuitgaande dat je module option base 0 is.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23-09 20:04
Jammer dat mensen niet meer snappen wat pointers zijn :P

Enyways, jij denkt dat deze code:

Visual Basic:
1
2
Set m_aItems(m_iCount) = New clsObject
m_aItems(m_iCount) = v_clsItem


Een kopie maakt van het object v_clsItem naar m_aItems(m_iCount). Dat doet het niet. Je kunt op deze manier geen deep copy maken van een object. ( In VB/Java/C#/ ... anyways )
( Wat je eigenslijk doet is een nieuw object aanmaken en de reference naar dat object overschrijven met de reference v_clsItem. )
Byval of ByRef maakt geen hol uit, het blijft een reference.

Je kunt dit oplossen door de code die deze aanroept elke keer een nieuw object te laten maken deze code ongeveer zo te maken:
Visual Basic:
1
2
3
ReDim Preserve m_aItems(m_iCount) 'Array van objecten met 1 vergroten
Set m_aItems(m_iCount) = v_clsItem 'Poging tot object toe te voegen aan array van objecten
m_iCount = m_iCount + 1 'Aantal items onthouden 
Waarom heb je een aparte var voor het aantal items? Dat kun je prima uit de array zelf halen (ubound).
Behalve als je array nog leeg is.

[ Voor 8% gewijzigd door farlane op 17-12-2008 15:44 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • honda4life
  • Registratie: Januari 2007
  • Laatst online: 25-09 16:59
je hebt gelijk in wat je zegt maar door die set blijf ik met byreference zitten :s

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Als je unieke objecten in je array wilt hebben zul je of in je Add() een deep copy moeten maken, of zorgen dat je niet steeds hetzelfde v_clsItem object zit aan te passen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23-09 20:04
honda4life schreef op woensdag 17 december 2008 @ 15:45:
je hebt gelijk in wat je zegt maar door die set blijf ik met byreference zitten :s
Zoals ik al aangaf ( en .oisyn ook ), je moet zorgen dat de code die deze functie aanroept telkens een new doet. ( of een deep copy maken maar dat is *cough* bewerkelijker :P )

[edit]
Overigens, het heeft geen niets met ByVal/ByRef te maken in dit geval, alle objecten ( classes. forms etc ) worden als reference doorgegeven. In het ene geval echter geef je de reference zelf door ( ByVal ) en het tweede een reference naar de reference ( ByRef ).
Is je clsObject een simpel POD dan ben je makkelijker af met een Type, daar deze wel value semantics hebben.

In het kort: Er is geen (simpele) manier om een object te kopieren in VB.

In de meeste *ahem* makkelijke talen werkt men hier omheen door copy routines een CopyTo( ) te laten aanroepen op het object dat gekopieerd moet worden die dan weer voor alle members die het heeft hetzelfde moet doen.


[edit2]
sucky typing skills

[ Voor 23% gewijzigd door farlane op 17-12-2008 16:04 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • honda4life
  • Registratie: Januari 2007
  • Laatst online: 25-09 16:59
farlane schreef op woensdag 17 december 2008 @ 15:42:
Jammer dat mensen niet meer snappen wat pointers zijn :P

Enyways, jij denkt dat deze code:

Visual Basic:
1
2
Set m_aItems(m_iCount) = New clsObject
m_aItems(m_iCount) = v_clsItem


Een kopie maakt van het object v_clsItem naar m_aItems(m_iCount). Dat doet het niet. Je kunt op deze manier geen deep copy maken van een object. ( In VB/Java/C#/ ... anyways )
( Wat je eigenslijk doet is een nieuw object aanmaken en de reference naar dat object overschrijven met de reference v_clsItem. )
Byval of ByRef maakt geen hol uit, het blijft een reference.

Je kunt dit oplossen door de code die deze aanroept elke keer een nieuw object te laten maken deze code ongeveer zo te maken:
Visual Basic:
1
2
3
ReDim Preserve m_aItems(m_iCount) 'Array van objecten met 1 vergroten
Set m_aItems(m_iCount) = v_clsItem 'Poging tot object toe te voegen aan array van objecten
m_iCount = m_iCount + 1 'Aantal items onthouden 



[...]

Behalve als je array nog leeg is.
jouw voorstel heeft exact hetzelfde probleem :s

misschien moet ik de clsobjecten maar als array in m'n hoofdprogramma verwerken ofzo

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23-09 20:04
honda4life schreef op woensdag 17 december 2008 @ 16:23:
jouw voorstel heeft exact hetzelfde probleem :s
Dan heb je niet aandachtig genoeg gelezen en niet gesnapt wat nou het onderliggende probleem is.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1