Registreer FAQ Berichten van vandaag


Ga terug   Scholieren.com forum / Technologie / Software & Hardware
Reageren
 
Topictools Zoek in deze topic
Oud 02-09-2003, 09:57
Martijngr
Martijngr is offline
Hey

Ik moe nu stage lopen en moet hier werken met vb6

Ik weet nie of er iemand bekent mee is op dit forum, maar ik probeer het gewoon...

Ik moet voor mn opdracht een menu creeren en daarbij werken met de index ervan.. Alleen zodra ik de index een waarde geeft en ik zet de code bij form_load om die menu uit te schakelen dan doet hij dat niet. Hij doet da wel als ik geen index waarde opgeeft..

Iemand?

iig bedankt
Met citaat reageren
Advertentie
Oud 02-09-2003, 10:09
Marcade
Avatar van Marcade
Marcade is offline
Wat bedoel je precies (met 'menu uitschakelen') ?

Ik heb net ff twee menu items aangemaakt in VB6, allebei met dezelfde naam (mnuItem), alleen de eerste index 0 en de andere index 1

in Form_Load kan ik gewoon mnuItem(0).Enabled=false doen, of mnuItem(1).Enabled=false?
Met citaat reageren
Oud 02-09-2003, 10:32
Martijngr
Martijngr is offline
Ten eerste bedankt voor je antwoord.
Je hebt me al een beetje op weg geholpen
Ik werk met een MDI Form.
Het uitschakelen (visible = false) is gelukt (dit doe ik bij het parent MDI tijden Load).
Alleen nu wil ik via een form (als ik op een button klik, juist inlog) dat die menu weer zichtbaar wordt. Hiervoor had ik deze code:

MDIForm1.mnuEdit(1).visible = true
of
mnuEdit(1).visible = true

Alleen dit werkt niet, weet jij mss een oplossing?

Voor de duidelijkheid, ik wil geen menus in de forms, alleen in de parent child.

Waar ik net niet uitkwam was omdat ik de index waarde vergat. Ik heb nog nooit met menus gewerkt en index waarden, dus vandaar..

EDIT: IK BEN ER AL UIT, IK WAS EEN TEKEN VERGETEN IN DE NAAM VD MENU

Alvast bedankt

Laatst gewijzigd op 02-09-2003 om 10:36.
Met citaat reageren
Oud 02-09-2003, 10:42
Martijngr
Martijngr is offline
Maar misschien dat je me met andere kunt helpen. Ik nog n vrij redelijke n00p in vb6

Ik kab bijv. al helemaal niet overweg met arrays. Ik weet een beetje hoe je ze aan kan maken, maar zou echt niet weten wat ik eraan heb. Ik weet ook niet hoe je die dingen kan vullen met variablen.

Nu heb ik al erg veel op internet gezocht, maar ik kom er nog steeds niet uit. (Gisteren heb ik niets anders gedaan dan heel de dag zitten pielen met arrays. Ik moe stage lopen en moet met arrays overweg kunnen, dus vandaar)

Bedankt,

Martijn
Met citaat reageren
Oud 02-09-2003, 10:53
Marcade
Avatar van Marcade
Marcade is offline
Arrays?

Arrays is ongeveer hetzelfde als wat je deed met dat menu en die index.

Ik neem aan dat je al wel wat weet van variables, Integers, Strings, Longs enzo.

Arrays zijn oa. gewoon lijsten van die waardes.

bv. je doet

Dim stSampleString as String

Heb je een string variable, die je simpelweg kan vullen door stSampleString = "Hello world" te doen.

Dim stSampleString(0 to 10) as String

Heb je een array van string variables. Je kan die dan vullen door simpelweg stSampleString(0) = "Hello World" te doen, of stSampleString(6) = "This is the seventh spot in the array"

..

Het voordeel van arrays kom je vanzelf wel tegen; t'is heel handig, wil je lijsten oid. op slaan.

Stel je voor dat je bv. een lijst van namen wil bij houden.

Je zou zoiets belachelijks als

Dim stName01 as String, stName02 as String, stName03 as String, stName04 as String

kunnen doen; maar het is zo aflexibel als de pest en je krijgt gigantische slordige en onbeheerbare code.

Dim stName(0 to 3) as String is veel beter.

Wil je bv. met al die namen iets doen, kan je ze nu simpel in een FOR .. NEXT loop stoppen

For iCount = 0 to 3
stName(iCount) = UCase(stName(iCount))
Next iCount

Om ze bv. allevier tegelijk in upper case te zetten.

etc, etc.

Laatst gewijzigd op 02-09-2003 om 10:57.
Met citaat reageren
Oud 02-09-2003, 11:06
Martijngr
Martijngr is offline
Ja wat je me nu heb uitgelegd, dat snapte ik al wel redelijk. Maar iig thnx
Maar hoe kan je arrays vullen met variabelen? En kan je arrays ook aanmaken zonder dat je aangeeft hoeveel waarden er in die array komen?Want nu geef je aan:

dim DezeArray(5) as string

Hierin kunnen dus 6 waarden, maar stel nou dat ik tijdens een programma dingen aan de gebruiker vraagt die in een array opgeslagen moeten worden, maar niet weet hoeveel waarden er in die array moeten komen. Ik noem maar wat heel simpels:
Een programma vraagt de naam en stopt deze namen in een array. Hij vraagt je naam en jij voert die naam in en daarna vraagt hij of je nog n naam wil toevoegen. Tot jij op een gegeven moment op 'nee' klikt.

Ik hoop dat je snap wat ik een beetj bedoel

Martijn
Met citaat reageren
Oud 02-09-2003, 12:28
Marcade
Avatar van Marcade
Marcade is offline
Juh,

Over dat naam voorbeeld; je dimensioneert je Names array boven al je Functies (zodat de array in al die functies van het form beschikbaar zijn) alsvolgt:

Dim stNames() as String

Dus zonder een nummer tussen de haakjes.

Zodra je dan een Naam erin wil stoppen, doe je het volgende:

Redim Preserve stNames(0)

of

Redim Preserve stNames(10)

Ligt er aan hoe ver je bent he?

In principe zal je dan ook gebruik willen maken van ubound en lbound; die vertellen hoe groot je array is. Dan krijg je dus zoiets als ..

Redim Preserve stNames(ubound(stNames) + 1)

om je array met 1 te vergroten.

ubound(stNames) geeft dus de upperbound terug van je array. (en lbound je lower bound .. sinds je bv ook Dim stNames(10 to 20) kan doen)

Dus bij Dim stNames(10 to 20) geeft je lbound(stNames) 10 terug, en je ubound(stNames) 20 ..

Wat je precies bedoelt met je array vullen met variables begrijp ik niet?!?

Dim stName as String
Dim stNameList(10) as String

stNameList(6) = stName

?? Zo stop je in stNameList(6) de waarde van stName?

Of als je een textbox op het scherm hebt genaamt txtName:

stNameList(6) = txtName.text
Met citaat reageren
Oud 02-09-2003, 12:57
Martijngr
Martijngr is offline
Wat je als laatste uitlegte over variabelen in arrays, dat bedoelde ik ook Thnx

Maar dat redim gebeuren snap ik niet, naja ik zie het nut er niet van in. Ik zal proberen te zeggen wat ik nie snap...

je dimensioneert een array:

dim mijnArray() as string

Okay tot zover snap ik het.
Maar dan krijg je dat redim, wat is nou het nut daarvan?Als je Redim Preserve stNames(10) doet, dan kan je toch net zo goed bij het declareren van mijnArray() de waarde 10 opgeven? Zo dus:

dim mijnArray(10) as string

Dat komt toch op hetzelfde neer?Dit zal ongetwijfeld aan mij liggen, maar mss dat jij mij dit kan uitleggen?
Lbound en Ubound tellen, zoals ik het opvat, hoeveel er in de array zit. Lbound telt van boven naar beneden en Ubound van onder naar boven
Verbeter me als ik het verkeerd zeg, zo interpreteer ik het...
Met citaat reageren
Oud 02-09-2003, 13:18
Marcade
Avatar van Marcade
Marcade is offline
Als je

Dim MyArray(10) as String doet ..

.. word er alvast ruimte gereserveerd voor dat array. Voor kleine lijsten maakt dat niks uit, maar het kan best voorkomen dat je met gigantische arrays wilt werken ..

Dim MyArray(30000) as String

.. vooral als er data in staat of je gebruik maakt van types, wil dat wel aardig wat geheugen opvreten.

Stel je voor

Type PersonalDataType
Name as String * 64
Address as String * 256
Phone as String * 16
End Type

Dim Users(10000) as PersonalDataType

.. dan gaat VB bij voorbaat al 10000x(64 + 256 + 16) bytes reserveren. Behoorlijk wat, en behoorlijk zonde als je uiteindelijk maar 3 users opslaat.

Daarnaast is het extra handig als je idd. niet bij voorhand weet bv. hoeveel namen je erin gaat zetten.

Kan je idd wel Dim Names(10) doen, maar wat ineens als je 12 namen wil opslaan?

LBound en UBound telt niks; ze geven gewoon terug welke minimale en maximale index je kan gebruiken.

Als je Dim stNames(10 to 20) doet (voor welke onzinnige reden ook) kan je dus geen waarde toekennen aan stNames(9) of aan stNames(21) .. LBound geeft 10 terug, UBound geeft 20 terug.

Of Dim iValues(3 to 14) .. lbound(iValues) is dan 3 en ubound(iValues) is dan 14 ..

Practische dingen; tja, nu zou je er geen kunnen bedenken, maar als je eenmaal bezig bent met iets complex ..

Laatst gewijzigd op 02-09-2003 om 13:20.
Met citaat reageren
Oud 02-09-2003, 13:36
Martijngr
Martijngr is offline
Citaat:
Marcade schreef op 02-09-2003 @ 14:18:
.....
Kan je idd wel Dim Names(10) doen, maar wat ineens als je 12 namen wil opslaan?

LBound en UBound telt niks; ze geven gewoon terug welke minimale en maximale index je kan gebruiken.

Als je Dim stNames(10 to 20) doet (voor welke onzinnige reden ook) kan je dus geen waarde toekennen aan stNames(9) of aan stNames(21) .. LBound geeft 10 terug, UBound geeft 20 terug.

Of Dim iValues(3 to 14) .. lbound(iValues) is dan 3 en ubound(iValues) is dan 14 ..

....
Dat bedoel ik nou,dat is mijn punt. Wat als je idd 12 namen heb en er maar 10 op kan slaan. Hoe voorkom je dit? Nu hoor ik jou al zeggen met dat redim preserve. Maar hoe gebruik je dat dan in werkelijkheid?

Het nut van l-U Bound snap ik niet. Ik bedoel wat heb je eraan?Dat snap ik niet, ze geven de minimale en de maximale index terug. Wat kan je daar mee dan?
Met citaat reageren
Oud 02-09-2003, 13:46
Marcade
Avatar van Marcade
Marcade is offline
Citaat:
hardstyle_rulez schreef op 02-09-2003 @ 14:36:
Dat bedoel ik nou,dat is mijn punt. Wat als je idd 12 namen heb en er maar 10 op kan slaan. Hoe voorkom je dit? Nu hoor ik jou al zeggen met dat redim preserve. Maar hoe gebruik je dat dan in werkelijkheid?

Het nut van l-U Bound snap ik niet. Ik bedoel wat heb je eraan?Dat snap ik niet, ze geven de minimale en de maximale index terug. Wat kan je daar mee dan?
Stel, je dimensioneert je Names() array dat die 10 namen kan bevatten, en de user zit vervolgens dan vrolijk namen toe te voegen, en hij wil een 11e erin zetten .. Er is geen plaats meer want alle tien de posities in de array zijn al gevuld. Als je dan op de 11e plek iets probeert te zetten, krijg je een foutmelding in VB. Dus moet je het array vergroten, Je wil eigenlijk dus van Names(10) een Names(11) maken zodat je een plek genoeg hebt voor de extra naam.

Of het de 10e naam of de 11e naam of de 12e naam is, weet je op dat moment niet, mits je een teller bij houd. Maar stel dat je het niet weet; dus dat het Names(x) is maar Names(x) is te klein voor die extra naam; je hebt Names(x + 1) nodig. Dan wil je kunnen opvragen hoe groot de array op dat moment is. Dat doe je dan met ubound().

Als je dan weet hoe groot je de array wilt hebben, gebruik je Redim Preserve om de array groter te maken, en kan je eindelijk je 11e naam in het array kwijt.
Met citaat reageren
Oud 02-09-2003, 14:01
Marcade
Avatar van Marcade
Marcade is offline
Voorbeeld code

Code:
' Option Base 1 zegt, dat standaard 1 de lbound is van arrays die we dimensioneren.
' Normaliter gesproken is dat 0

Option Base 1

' We initializeren de huidige array NamenLijst zodat die nog geen namen kan bevatten
' We willen dat de array gewoon dynamisch groter word. Dit willen we, omdat het
' flexibel is, en omdat het geheugen uitspaart.

Dim NamenLijst() As String

' En een integer die bijhoud hoeveel namen we al hebben

Dim TotaalAantalNamen As Integer

Private Sub btnVoegToe_Click()

Dim iUpperBoundVanArray As Integer

 ' We willen een naam toevoegen, onderaan de array
 
 TotaalAantalNamen = TotaalAantalNamen + 1
 
 ' We vragen de upperbound van de array op, en slaan dit even op in de integer
 ' iUpperBoundVanArray .. In het begin zal deze nul zijn, en met elke naam een
 ' groter worden.
 
 iUpperBoundVanArray = UBound(NamenLijst)
 
 ' We kijken of de array groot genoeg is; zo niet, dan willen we hem vergroten
 
 If iUpperBoundVanArray < TotaalAantalNamen Then

   ' We geven een melding dat het array te klein is
   
   MsgBox "Array is te klein, dus nu doen we een redim preserve!"
   
   ' Nu willen we de array met een vergroten zodat we de nieuwe naam erin kunnen zetten
   ' Redim betekent dat we het array al eerder gedimensioneerd hebben, en het willen
   ' herdimensioneren. Preserve zegt dat we de data die in het huidige array staat, niet
   ' willen kwijtraken.
   
   ReDim Preserve NamenLijst(TotaalAantalNamen)
 
 End If
 
 ' Uiteindelijk willen we in de nieuw gekreeerde plek, de naam op slaan.
 
 NamenLijst(TotaalAantalNamen) = txtNaam.Text
 
 ' En ten slotte, met behulp van een FOR .. NEXT loop, laten we alle namen in de
 ' andere textbox zien
 
 txtAlleNamen.Text = ""
 For iCount = 1 To TotaalAantalNamen
  txtAlleNamen.Text = txtAlleNamen.Text + NamenLijst(iCount) + ", "
 Next iCount
 
End Sub

Private Sub Form_Load()

 ' Hier dimensioneren we het array voor de eerste keer. We zeggen nu voor het gemak
 ' dat er maar drie namen in kan staan.
 
 ReDim Preserve NamenLijst(3)
 
End Sub
Met citaat reageren
Oud 02-09-2003, 14:38
Martijngr
Martijngr is offline
Code:
Private Sub cmdresult1_Click()
'Proberen het nut van een array te begrijpen
'Proberen met redim en preserve te werken
'Proberen met Ubound en Lbound te werken?
'proberen het te gaan snappen
'Wat moet het gaan doen? Simpel, er wordt gevraagd of je een
'naam in wilt voeren, (verplicht al 3 namen)zo ja wordt de naam opgeslagen in de array
'zo niet, dan worden de namen die in de array staan weergegeven in een textbox
'starten maar

'verplicht namen in te voeren, 3x mbv een lus
Dim names(2) As String
Dim i As Integer
Dim name As String
Dim aantal As Integer
Dim totaal As Integer

totaal = 2
For i = 0 To 2

    name = InputBox("Voer een naam in", "Naaminvoer")
    names(i) = name
    
Next i

Dim vraag As String

'vraagt aan de gebruiker of die nog n naam wilt invoeren
vraag = MsgBox("Wil je nog een naam invoeren?", vbOKCancel + vbQuestion, "Naam invoeren")

If vraag = vbOK Then
    
    name = InputBox("Voer een naam in", "Naaminvoer")
    Dim waarde As Integer
    waarde = UBound(names)
    waarde = waarde + 1
    ReDim Preserve names(waarde)
    names(waarde) = name
        
Else

    txtText.Text = ""
    
    aantal = UBound(names)
    For A = 0 To aantal
    
        txtText.Text = txtText.Text & names(A) & vbNewLine
        'ReDim Preserve names(UBound(names) + 2)
    Next A
End If
End Sub
Waarom doet hij het nu niet? Hij zegt dat mijn array al gedimensioneerd is en verwijst dan naar redim gedeelte in het if blok. Maar hij hoeft enkel te gaan herdimensioneren als het aan de if vergelijking voldoet......toch?Ik bedoel, ik heb nog niet eens op OK geklikt.....
Met citaat reageren
Oud 02-09-2003, 14:40
deathz0rz
deathz0rz is offline
je moet het zo doen:

Dim names() As String
ReDim Preserve names(2)

niet zoals jij hebt:

Dim names(2) As String
__________________
Ooit. Dan.
Met citaat reageren
Oud 02-09-2003, 14:41
Marcade
Avatar van Marcade
Marcade is offline
Je moet boven al je code (Dus ook boven Private Sub cmdresult1_Click() )

Dim names() As String

zetten

En

Dim names(2) As String

aan het begin, moet je

Redim names(2)

van maken.
Met citaat reageren
Oud 02-09-2003, 14:42
deathz0rz
deathz0rz is offline
ik was eerder
__________________
Ooit. Dan.
Met citaat reageren
Oud 02-09-2003, 15:00
Martijngr
Martijngr is offline
Citaat:
Marcade schreef op 02-09-2003 @ 15:41:
Je moet boven al je code (Dus ook boven Private Sub cmdresult1_Click() )

Dim names() As String

zetten

En

Dim names(2) As String

aan het begin, moet je

Redim names(2)

van maken.
Vraag niet hoe (ja eigenlijk wel, dankzij jouw hulp), maar het is gelukt. Maar ik blijf zeuren ....Ik heb nog een paar puntjes.:

- Moet je altijd in het general declarations gedeelte dim array() as datatype neergooien als je met deze soort array gaat werken?En dan ook zonder waarde?
- Waarom moet dat?
- Waarom moet je, voordat je met die array gaat werken, redim array(aantal) neerzetten?

Dit was het denk ik wel, als er iets niet lukt dan hoor je het wel...
Met citaat reageren
Oud 02-09-2003, 15:14
Verwijderd
Lekker jongens... public vars...
Met citaat reageren
Oud 02-09-2003, 15:20
Martijngr
Martijngr is offline
Citaat:
eddie schreef op 02-09-2003 @ 16:14:
Lekker jongens... public vars...
Uhm iets meer duidelijkheid en uitleg, zou voor mij al een stuk duidelijker zijn....
Met citaat reageren
Oud 02-09-2003, 15:23
deathz0rz
deathz0rz is offline
Citaat:
eddie schreef op 02-09-2003 @ 16:14:
Lekker jongens... public vars...
dat is volgens mij heel normaal hoor in VB
__________________
Ooit. Dan.
Met citaat reageren
Oud 02-09-2003, 17:31
Marcade
Avatar van Marcade
Marcade is offline
Citaat:
deathz0rz schreef op 02-09-2003 @ 16:23:
dat is volgens mij heel normaal hoor in VB
Hij's een trol

- Moet je altijd in het general declarations gedeelte dim array() as datatype neergooien als je met deze soort array gaat werken?En dan ook zonder waarde?

Nee hoor; je mag het ook in de functie zelf doen, alleen dan verlies je het array plus de inhoud, zodra de functie afgelopen is. Als je het in het general declarations gedeelte doet, behoud je het en kan je het ook in andere functies gebruiken. (En als er nu weer een of andere wijsneuzerige irritante *** met Object Orientated achtige dingen gaat smijten en stomme dingen gaat roepen Ik *haat* van die wijsneuzerige cowboys)

- Waarom moet dat?

Zie vorige tekst In principe zal je niet een names lijst gelijk weer weg willen gooien zodra je ze net toegevoegd hebt

- Waarom moet je, voordat je met die array gaat werken, redim array(aantal) neerzetten?

In principe moet je gewoon als eerste Dim MyArray() as String doen, maar dan is die nog leeg, en functies zoals ubound en lbound gaan de mist in. Daarom dat je dan gelijk zoiets als Redim MyArray(0) moet doen, wil je niet dat die crasht bij lbound/ubound dingen.

Maar je kan het ook allemaal zelf uitproberen he Ik probeer het ook telkens beetje uit in VB hiero
Met citaat reageren
Oud 03-09-2003, 15:48
Martijngr
Martijngr is offline
Bedankt voor je uitleg Het begint allemaal n beetje te dagen

Alleen ik zit nu weer met het volgende.

Hoe kan je erachter komen wat het hoogste is in deze regel:

MDIForm1.mnubestand(1)

Zoals je mss ziet gaat het hier om een menu. Ik heb 4x mnubestand en de index loopt van 1 t/m 4.
Alleen nu wil ik vb6 er zelf achter laten komen wat de hoogste waarde is.

Ubound(MDIForm1.mnubestand)

^
Dit werkt niet, en als ik dit doe in MDIForm1:

Ubound(mnubestand)

doet hij dat ook niet. Ik snap het niet. mnubestand is toch een array? Hij zegt namelijk dat er in ubound geen array zit

Weten jullie mss een oplossing?

Alvast bedankt
Met citaat reageren
Oud 03-09-2003, 16:19
deathz0rz
deathz0rz is offline
het probleem zit er in dat mnubestand geen array is, maar een collection

daarom moet je MDIForm1.mnubestand.UBound gebruiken
__________________
Ooit. Dan.
Met citaat reageren
Oud 04-09-2003, 12:47
Martijngr
Martijngr is offline
Citaat:
deathz0rz schreef op 03-09-2003 @ 17:19:
het probleem zit er in dat mnubestand geen array is, maar een collection

daarom moet je MDIForm1.mnubestand.UBound gebruiken
Kan je mij uileggen wat collections zijn? En wanneer je een collection gebruik en wanneer je een array gebruik?

Bedankt alvast
Met citaat reageren
Oud 04-09-2003, 14:03
deathz0rz
deathz0rz is offline
Citaat:
hardstyle_rulez schreef op 04-09-2003 @ 13:47:
Kan je mij uileggen wat collections zijn? En wanneer je een collection gebruik en wanneer je een array gebruik?

Bedankt alvast
uit MSDN Lib 6:
Citaat:
The Collection object provides a convenient way to refer to a related group of items as a single object. The items, ormembers, in a collection need only be related by the fact that they exist in thecollection. Members of a collection don't have to share the samedata type.
__________________
Ooit. Dan.
Met citaat reageren
Advertentie
Oud 04-09-2003, 14:05
Martijngr
Martijngr is offline
OKay....

En kan je mij een voorbeeld geven wanneer je zoiets gebruikt?
Met citaat reageren
Advertentie
Reageren


Regels voor berichten
Je mag geen nieuwe topics starten
Je mag niet reageren op berichten
Je mag geen bijlagen versturen
Je mag niet je berichten bewerken

BB code is Aan
Smileys zijn Aan
[IMG]-code is Aan
HTML-code is Uit

Spring naar


Alle tijden zijn GMT +1. Het is nu 07:07.