[vb6] Properties van de array opvragen

Pagina: 1
Acties:

  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 20-05 15:17

TwoR

Gekleurde stippen

Topicstarter
Ik ben met VB6 bezig en heb een probleem met de array's

Ik wil een array dynamisch vullen en daar begonnen de problemen. Ik kan namelijk de properties van de array niet opvragen.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
Dim array_test(4) As String

Private Sub Form_Load()
    
    array_test(1) = "test"
    array_test(2) = "test1"
    array_test(3) = "test2"

    MsgBox array_test(1)   
    MsgBox array_test.Count
End Sub


De eerste MsgBox geeft netjes de string test terug maar als ik dan array_test.Count wil uitvoeren dan krijg ik een dikke foutmelding en ik kan ondertussen echt niet meer vinden waar de fout zit.

De foutmelding die ik krijg is: compile error: Invalid qualifier

Wat doe ik hier nu fout? Ik maar netjes de array aan en geef ze waardes maar de proporties van de array krijg ik er echt niet uit. Is er hier iemand die mij aan een antwoord of een duw in de goede richting kan helpen want ik word hier zo langzamer hand hartstikke gek.

  • Obliterator
  • Registratie: November 2000
  • Laatst online: 30-04 16:09
Ik kan geen VB, maar is de array wel op die manier te benaderen. Moet het niet zijn Count(array) ipv Array.Count ?

  • Shuisman
  • Registratie: Maart 2004
  • Laatst online: 21-05 17:29
code:
1
Msgbox Ubound(array_test)

dit moet werken

[ Voor 61% gewijzigd door Shuisman op 03-09-2004 15:51 ]


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Kan je niet beter dictionary object gebruiken?

Visual Basic 6:
1
2
3
4
5
6
Dim bla As Object
Set bla = CreateObject("Scripting.Dictionary")
bla.Add 1, "test"
bla.Add 2, "blaat"
bla.Add 3, "woei"
MsgBox bla.Count

Programmer - an organism that turns coffee into software.


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Met UBound kun je het aantal elementen van een array opvragen. Staat allemaal gewoon in de manual.

It’s nice to be important but it’s more important to be nice


  • Arnaud
  • Registratie: Mei 2000
  • Laatst online: 21-05 22:25
SHuisman heeft de oplossing, maar gebruik wel Ubound (met een d dus)

LuCarD heeft een alternatief dat handiger kan werken als je een "1 of 2-dimensionale" array gebruikt.

  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 20-05 15:17

TwoR

Gekleurde stippen

Topicstarter
SHuisman schreef op 03 september 2004 @ 15:49:
code:
1
Msgbox Ubound(array_test)

dit moet werken
Ja dit werkt maar waarom werkt .count dan niet?
JonkieXL schreef op 03 september 2004 @ 15:50:
Met UBound kun je het aantal elementen van een array opvragen. Staat allemaal gewoon in de manual.
Klopt maar ik wilde het eigenlijk met .count doen aangezien dit volgens mij ook standaard vb is.

  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
TwoR schreef op 03 september 2004 @ 15:56:
[...]

Ja dit werkt maar waarom werkt .count dan niet?

[...]

Klopt maar ik wilde het eigenlijk met .count doen aangezien dit volgens mij ook standaard vb is.
Niet standaard VB6 in ieder geval. Misschien haal je VB6 en VB.NET door elkaar :?

It’s nice to be important but it’s more important to be nice


  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 20-05 15:17

TwoR

Gekleurde stippen

Topicstarter
JonkieXL schreef op 03 september 2004 @ 16:01:
[...]

Niet standaard VB6 in ieder geval. Misschien haal je VB6 en VB.NET door elkaar :?
Zou kunnen aangezien ik in beide pakketten moet werken. Ik zal het nog eens opzoeken in .net. Maar goed ik ben blij dat het is opgelost, kan ik eindelijk weer verder. Wel balen dat zo'n klein stom dingetje me bijna een hele middag kost :(

  • Shuisman
  • Registratie: Maart 2004
  • Laatst online: 21-05 17:29
count ken ik alleen van lijsten etc. listcount, volgens mij is dat nergens te vinden in array's

  • KO
  • Registratie: December 2001
  • Laatst online: 12-11-2023

KO

De count heb je ook als je een collection gebruikt.

Yesterday Is History. Today Is A Gift. Tomorrow Is Mystery


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Aangezien arrays in VB6 geen objecten zijn, hebben ze ook geen properties, metoden of events.

[ Voor 13% gewijzigd door farlane op 03-09-2004 16:53 ]

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.


  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 21:15

Sponge

Serious Game Developer

Arnaud schreef op 03 september 2004 @ 15:53:
SHuisman heeft de oplossing, maar gebruik wel Ubound (met een d dus)

LuCarD heeft een alternatief dat handiger kan werken als je een "1 of 2-dimensionale" array gebruikt.
Count(array,welkedimensie) werkt ook gewoon voor multidim's :)

Verwijderd

Let wel even op mensen, .Count (als het doet wat ik denk dat het doet) doet niet hetzelfde als UBound().
UBound() geeft namelijk het nummer van het hoogste element (de upper bound van de array dus), en .Count het *aantal* elementen.
Om dus .Count te krijgen heb je de volgende code:

Visual Basic:
1
Count = UBound(array_test) - LBound(array_test) + 1


LBound() geeft dus het nummer van het laagste element aan. En als je wilt kun je natuurlijk gewoon een functie maken zodat je niet de hele tijd dat regeltje hoeft te typen:

Visual Basic:
1
2
3
Public Function arrayCount(testArray()) As Integer
  arrayCount = UBound(testArray) - LBound(testArray) + 1
End Function


En TS: arrays beginnen standaard *ALTIJD* op element 0 en niet op 1. Als je persé wil dat je array bij 1 begint doe je dat zo:

Dim array_test(1 to 4) As String

En ook dan klopt de count-functie die hierboven staat nog steeds.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Verwijderd schreef op 03 september 2004 @ 19:29:
En TS: arrays beginnen standaard *ALTIJD* op element 0 en niet op 1. Als je persé wil dat je array bij 1 begint doe je dat zo:
Option Base ?

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.


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Verwijderd schreef op 03 september 2004 @ 19:29:
Visual Basic:
1
2
3
Public Function arrayCount(testArray()) As Integer
  arrayCount = UBound(testArray) - LBound(testArray) + 1
End Function
Alhoewel het best een aardige functie is gaat deze helemaal de mist in met dynamische arrays. Zolang je dynamische array niet is geinitialiseerd dan zal je routine crashed. Je kunt daar namelijk geen UBound of LBound van opvragen. Een van de meer vervelende eigenschappen van VB als je 't mij zou vragen.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Lorn schreef op 04 september 2004 @ 14:31:
Alhoewel het best een aardige functie is gaat deze helemaal de mist in met dynamische arrays. Zolang je dynamische array niet is geinitialiseerd dan zal je routine crashed. Je kunt daar namelijk geen UBound of LBound van opvragen. Een van de meer vervelende eigenschappen van VB als je 't mij zou vragen.
Wat ik dan wel vreemd vind is dat een ongeinitialiseerd dynamisch array in je watch window een ubound van -1 aangeeft. Waarom kan hij het daar wel ?

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.


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

farlane schreef op 05 september 2004 @ 00:28:
[...]


Wat ik dan wel vreemd vind is dat een ongeinitialiseerd dynamisch array in je watch window een ubound van -1 aangeeft. Waarom kan hij het daar wel ?
Tja, in het watch window zal d'r wel een error trap omheen liggen die -1 terug geeft? Zoiets zal 't wel moeten zijn.

  • Devion
  • Registratie: Januari 2000
  • Laatst online: 21-05 14:58

Devion

Space for rent ;-)

Ehh..

.Count is voor collections
Ubound is voor arrays...

Says it all ;)

(Immed. window heeft on error handling in zich... maw: gaat er iets fout; pak de waarde die hij had.. Voor de initialisatie is dat 0 of -1.. dus die krijg je terug)

Om het makkelijk te maken...


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public Function mysnIsArrayDefined(Array as Variant) as Boolean
On error goto errHandler

       dim lngCount as long

       lngCount = ubound(Array)

       mysnIsArrayDefined = true
       exit function

Errhandler:
       mysnIsArrayDefined = false
       exit function

End function
En TS: arrays beginnen standaard *ALTIJD* op element 0 en niet op 1. Als je persé wil dat je array bij 1 begint doe je dat zo:

Dim array_test(1 to 4) As String
Of je doet gewoon bovenaan Option Base 1 :P

[ Voor 94% gewijzigd door Devion op 06-09-2004 23:53 . Reden: code erbij en quote ]


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Je functie werkt wel maar niet altijd. Ik heb een soort gelijk routine geschreven maar je hebt problemen met UDTs die in een andere module zijn gedeclareerd. Heeft met het COM model te maken geloof (zoiets staat me in ieder geval wel bij).

  • Devion
  • Registratie: Januari 2000
  • Laatst online: 21-05 14:58

Devion

Space for rent ;-)

Qua scope cq. public/global werkt dat gewoon zonder problemen; Gebruik dit standaard in al m'n code (danwel op het werk of thuis).

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Als ik weer een keer het probleem tegenkom dan zal ik 't hier wel even posten. In sommige gevallen wil het namelijk echt niet werken.

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Devion schreef op 06 september 2004 @ 23:49:
Ehh..
[quot
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public Function mysnIsArrayDefined(Array as Variant) as Boolean
On error goto errHandler

       dim lngCount as long

       lngCount = ubound(Array)

       mysnIsArrayDefined = true
       exit function

Errhandler:
       mysnIsArrayDefined = false
       exit function

End function
tja ...
http://www.w3schools.com/vbscript/func_isarray.asp ? 8)

Programmer - an organism that turns coffee into software.


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Begrijp niet helemaal wat je hiermee wilt duidelijk maken. De functie IsArray geeft alleen maar terug of iets wel of niet een array is. Als het was bedoelt als alternatief / hulpmiddel bij het oplossen van het UBound probleem met dynamische arrays dan moet ik je teleurstellen. IsArray geeft namelijk ook True terug bij een niet gedimentioneerde dynamische array.

Verwijderd

Lorn schreef op 04 september 2004 @ 14:31:
[...]


Alhoewel het best een aardige functie is gaat deze helemaal de mist in met dynamische arrays. Zolang je dynamische array niet is geinitialiseerd dan zal je routine crashed. Je kunt daar namelijk geen UBound of LBound van opvragen. Een van de meer vervelende eigenschappen van VB als je 't mij zou vragen.
code:
1
2
3
4
5
6
Sub testdynamischearray()
Dim x() As String
MsgBox Len(Join(x)) = 0
ReDim x(2)
MsgBox Len(Join(x)) = 0
End Sub

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Verwijderd schreef op 07 september 2004 @ 12:00:
[...]


code:
1
2
3
4
5
6
Sub testdynamischearray()
Dim x() As String
MsgBox Len(Join(x)) = 0
ReDim x(2)
MsgBox Len(Join(x)) = 0
End Sub
Had nog nooit de Join functie gezien, weer wat geleerd dus :) Maar helaas is je oplossing ook niet echt waterdicht. Het loopt al helemaal mis als je x() definieerd als een Long in plaats van een String.

Verwijderd

Lorn schreef op 07 september 2004 @ 12:10:
[...]


Had nog nooit de Join functie gezien, weer wat geleerd dus :) Maar helaas is je oplossing ook niet echt waterdicht. Het loopt al helemaal mis als je x() definieerd als een Long in plaats van een String.
goed gezien. oorspronkelijk was dit een oplossing die ik op een ander forum gepost had, maar dat ging enkel over dynamische variabelen van het type string, en ik nam aan dat het voor andere types ook zou werken. niet dus. de enige manier blijft dus foutafhandeling. tijdens het debuggen kan je wel een verschil zien in het venster 'lokale variabelen' een ongeïnitialiseerde array van bv. het type long staat er als long(), een die reeds een aantal elementen heeft, staat er als type long(n to m), maar er is geen manier blijkbaar om die precieze informatie via een opdracht in vb uit te lezen (waarschijnlijk zal er toch een functie zijn in een van de vba dll's die dit kan, maar ook dat is niet echt een mooie oplossing).
Pagina: 1