Toon posts:

[VB] Array teruggeven

Pagina: 1
Acties:

Verwijderd

Topicstarter
Mijn probleem is het volgende. Ik heb een array van 'vraag'-objecten en ieder vraagobject heeft een array van 'antwoord'-objecten in zich.

De antwoorden zijn gedeclareerd in de vraag class als:
code:
1
Private aAntwoorden As Variant

Het setten van de antwoorden in het vraagobject gebeurt op deze manier:
code:
1
2
3
4
5
6
7
8
Public Sub SetAntwoorden(a As Variant)
  Dim i As Integer
    
  ReDim aAntwoorden(UBound(a)) As Antwoord
  For i = 0 To UBound(a)
    Set aAntwoorden(i) = a(i)
  Next
End Sub

Dat gaat allemaal prima, nu heb ik dus een mooie array van antwoordobjecten.

Omdat een bij een 'set' ook een 'get' hoort heb ik ook de volgende code in de vraag class:
code:
1
2
3
Public Function GetAntwoorden() As Variant
  GetAntwoorden = aAntwoorden
End Function

Maar als ik nu in mijn code na het setten van het hele gebeuren iets doe als dit:
code:
1
2
Dim temp As Integer
temp = UBound(aVraagObjects(0).GetAntwoorden())

krijg ik een typemismatch :?

Het is toch een array of ben ik nu gek?

Ik heb ook al geprobeerd om de variabele aAntwoorden in het de vraagclass public te maken en het dan zo te doen:
code:
1
2
Dim temp As Integer
temp = UBound(aVraagObjects(0).aAntwoorden)

Maar dan krijg ik gewoon diezelfde foutmelding. Maar als ik direct na het setten van de antwoordarray in het object de UBound van aAntwoorden laat printen dan krijg ik wel het juiste getalletje terug :?

Ik doe iets fout, maar wat? Ik hoop dat jullie mij een duw in de goede richting kunnen geven :)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-08 23:12
Je probeert een array aan een integer toe te kennen.

[Oeps] Ff de Ubound over het hoofd gezien..

Hmmm... bij een array van integers gaat deze constructie wel goed. Weet je zeker dat je VraagObjects geval ok 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.


Verwijderd

Topicstarter
Op vrijdag 19 juli 2002 13:42 schreef farlane het volgende:
Je probeert een array aan een integer toe te kennen.

[Oeps] Ff de Ubound over het hoofd gezien..

Hmmm... bij een array van integers gaat deze constructie wel goed. Weet je zeker dat je VraagObjects geval ok is?
Ja, dat weet ik zeker, die wordt gewoon goed gevuld. Als ik in die SetAntwoorden methode alle antwoorden laat zien, dus in een for-loopje
code:
1
MsgBox(aAntwoorden(i).GetAntwoord())

Dan laat hij ze allemaal netjes zien.

Verwijderd

het is geen array. . . het is een variant die ge-redimed hebt . .. maar in principe is het een variant . .

Private aAntwoorden() As Antwoord
dit is wel een array

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-08 23:12
Heb het ff nagebouwd maar het gaat wel goed bij mij.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
' Class code
Option Explicit

Private blah As Variant

Public Sub setBlah(b As Variant)

    Dim i
    
    ReDim blah(UBound(b)) As Class1
    
    For i = 0 To UBound(b)
      Set blah(i) = b(i)
    Next i
    
End Sub

Public Function getBlah() As Variant
    getBlah = blah
End Function
    

'Form code
Private Sub Command2_Click()

    Dim i(100) As Class1
    Dim x
    Dim obj As New Class1
    
    
    obj.setBlah (i)
    
    
    x = UBound(obj.getBlah)
    
    
End Sub

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.


Verwijderd

waarom maak je er een variant van ?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-08 23:12
Op vrijdag 19 juli 2002 13:56 schreef Skizmo het volgende:
het is geen array. . . het is een variant die ge-redimed hebt . .. maar in principe is het een variant . .
Purist ;) . Het is een variant die een 'pointer naar een array' type heeft.

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.


Verwijderd

edit:

Was overbodig

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 09:31

Crazy D

I think we should take a look.

Ik vraag me ook af waarom je er een Variant voor gebruikt, maar goed.
Het is logisch dat je een error krijgt. Het datatype is Variant, Ubound wil een array hebben. En dat spoort dus niet. Dat jij later van die Variant een array maakt, is Ubound z'n zorg niet. Njah zo ongeveer dan ;)
Mjah gebruik gewoon de juiste datatypes. Als je een array van strings wilt teruggeven, maak je je functie/property As String(), als je een array van clsDummy wilt teruggeven, doe je dat dus met As clsDummy(). Ga niet zo moeilijk zitten doen met variants, variants zijn voor luie mensen ;)

[edit]
en eigenlijk vind ik dan een collection nog mooier en past ook meer in de VB style...

Exact expert nodig?


Verwijderd

Topicstarter
Op vrijdag 19 juli 2002 14:15 schreef Crazy_D het volgende:
Ik vraag me ook af waarom je er een Variant voor gebruikt, maar goed.
Het is logisch dat je een error krijgt. Het datatype is Variant, Ubound wil een array hebben. En dat spoort dus niet. Dat jij later van die Variant een array maakt, is Ubound z'n zorg niet. Njah zo ongeveer dan ;)
Mjah gebruik gewoon de juiste datatypes. Als je een array van strings wilt teruggeven, maak je je functie/property As String(), als je een array van clsDummy wilt teruggeven, doe je dat dus met As clsDummy(). Ga niet zo moeilijk zitten doen met variants, variants zijn voor luie mensen ;)

[edit]
en eigenlijk vind ik dan een collection nog mooier en past ook meer in de VB style...
Tnx voor jullie hulp allemaal, nu moet het wel lukken!

Ik weet wel van het bestaan van collections af, maar heb me er (nog) niet in verdiept. Ben sowieso een VB-noob, pas met mijn eerste applicatie bezig.

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 30-08 17:59

Gerco

Professional Newbie

Op vrijdag 19 juli 2002 14:15 schreef Crazy_D het volgende:
en eigenlijk vind ik dan een collection nog mooier en past ook meer in de VB style...
Gebruik dan een flexbag, die zijn *iets* sneller dan collections...

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Verwijderd

Topicstarter
Vaag, ik zit nu met die typering te goochelen, schijnt allemaal wel te werken.

Maar het lijkt wel of ik die array opsla in het object en dat als dat gebeurt is ik die array weer gewoon net zo hard kwijt ben :?

Zitten er nog wat andere haken en ogen aan aan het opslaan van een array? Want als er alleen een pointer wordt gegenereerd bij een assignment als aAntwoorden = a, dan gaat het mis natuurlijk, die a is weer weg daarna.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-08 23:12
Op vrijdag 19 juli 2002 14:15 schreef Crazy_D het volgende:
Het is logisch dat je een error krijgt. Het datatype is Variant, Ubound wil een array hebben. En dat spoort dus niet. Dat jij later van die Variant een array maakt, is Ubound z'n zorg niet. Njah zo ongeveer dan ;)
Hij maakt er eerst een array van en roept dan Ubound aan voor zover ik het kan opmaken uit het verhaal.

Een variant van het type Single(10,10) is geen array volgens jou?

Ubound heeft geen problemen met dit type(Zie mijn code). Sterker nog, volgens mij is het in VB de enige manier om een array met meer dan 1 dimensie aan een functie mee te geven.
Ik vraag me ook af waarom je er een Variant voor gebruikt, maar goed.
Dat is een ander verhaal.

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.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-08 23:12
Op vrijdag 19 juli 2002 15:27 schreef cruesli het volgende:
Vaag, ik zit nu met die typering te goochelen, schijnt allemaal wel te werken.

Maar het lijkt wel of ik die array opsla in het object en dat als dat gebeurt is ik die array weer gewoon net zo hard kwijt ben :?
Dat komt omdat jij een set blah = blah gebruikt in die setfunctie. Hij kopieert dan alleen een referentie naar je originele object.

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.


Verwijderd

Topicstarter
Op vrijdag 19 juli 2002 15:31 schreef farlane het volgende:

[..]

Dat komt omdat jij een set blah = blah gebruikt in die setfunctie. Hij kopieert dan alleen een referentie naar je originele object.
Ok :)
Heb jij daar dan ook een oplossing voor?

/edit
Ik wil nu dus proberen om die objecten gewoon fysiek in die array te zetten en geen pointers maken naar iets wat straks toch niet meer bestaat. Ben een beetje rond aan het zoeken, maar kan zo gauw even niet vinden hoe dat werkt.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-08 23:12
Op vrijdag 19 juli 2002 16:59 schreef cruesli het volgende:

[..]

Ok :)
Heb jij daar dan ook een oplossing voor?
Tuurlijk ;)

Door de functie van waaruit je het object toevoegt zo te maken dat deze elke keer een nieuw object maakt.

Je kunt dit bereiken door de referentie in die functie na het toevoegen expliciet op Nothing te zetten.
code:
1
2
3
4
5
6
7
8
9
10
Dim blah as blahObject

For i = 0 to eenBovengrens

    Set blah = new blahObject

    Call blahContainer.addBlah(blah)

    Set blah = Nothing
Next i

Beetje achtergrondkennis van de technische werking van dit soort dingen is onontbeerlijk vind ik. Snap je ook waarom VB doet wat 'ie doet. Heb ff geen link voor je ...

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.


Verwijderd

FF een nieuwe approach:

Gebruik types (moet in module staan)

Type VraagType
VraagZelf as Variant
Antwoorden(10) as Variant
End Type

Form

Dim Vraag() As Vraag

Dan
Vraag(1).VraagZelf = Vraag
Vraag(1).Antwoorden(1-10) = Antwoorden



zo kan het ook...

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-08 23:12
Op dinsdag 23 juli 2002 23:39 schreef sa007sa007sa007 het volgende:
Gebruik types (moet in module staan)

Type VraagType
VraagZelf as Variant
Antwoorden(10) as Variant
End Type

Dim Vraag() As Vraag

Dan
Vraag(1).VraagZelf = Vraag
Vraag(1).Antwoorden(1-10) = Antwoorden
zo kan het ook...
Afgezien van de tikfouten vraag ik me af wat het voordeel is van het gebruik van typen boven klassen.

Je zou overigens Vraag ook moeten redimmen als je deze zo declareert.

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