Scholieren.com forum

Scholieren.com forum (https://forum.scholieren.com/index.php)
-   Huiswerkvragen: Exacte vakken (https://forum.scholieren.com/forumdisplay.php?f=17)
-   -   [INF]Help gezocht (Visual Basic) (https://forum.scholieren.com/showthread.php?t=1683501)

Lothar 09-04-2008 16:15

[INF]Help gezocht (Visual Basic)
 
Ik ben dus een programma aan het schrijven in Visual Basic.

uitleg:
http://i276.photobucket.com/albums/k...choelieren.jpg

(sorry voor de slordige paint tekening)

De bedoeling is dus dat ik een getal invoer in TxtAantal, dan een keuzerondje kies, ik klik op berekenen en het resultaat komt te voor schijn in TxtTotaal.

(berekenen staat niet op de tekening van hierboven maar is er wel..)

Elk keuzerondje stelt een getal voor. Hier volgt even de code die ik nu al heb. Maar het werkt niet, kan iemand me helpen?

Private Sub CmdBerekenen_Click()
'variabelen
Dim SngEen As Single
Dim SngTweeAs Single
Dim SngDrie As Single
Dim SngVier As Single
Dim SngVijf As Single

'berekeningen
SngEen = TxtAantal * 21.6
SngTwee = TxtAantal * 52.8
SngDrie = TxtAantal * 68.4
SngVier = TxtAantal * 87
SngVijf = TxtAantal * 58.6


'resultaat tonen
If OptEen = True Then TxtGold = SngEen
Else: If OptTwee = True Then TxtGold = SngTwee
Else: If OptDrie = True Then TxtGold = SngDrie
Else: If OptVier = True Then TxtGold = SngVier
Else: If OptVijf = True Then TxtGold = SngVijf
Else: TxtTotaal = ""
End If

End Sub

Alle hulp is welkom, bedankt :)

mathfreak 09-04-2008 18:37

Ik heb je code als volgt aangepast:
Code:

Private Sub CmdBerekenen_Click()
        'variabelen
        Dim TxtAantal, TxtGold, SngEen, SngTwee, SngDrie, SngVier, SngVijf As Single
        Dim OptEen, OptTwee, OptDrie, OptVier, OptVijf As Boolean
        Dim TxtTotaal As String
        'berekeningen
        SngEen = TxtAantal * 21.6
        SngTwee = TxtAantal * 52.8
        SngDrie = TxtAantal * 68.4
        SngVier = TxtAantal * 87
        SngVijf = TxtAantal * 58.6


        'resultaat tonen
        If OptEen = True Then
            TxtGold = SngEen
        ElseIf OptTwee = True Then
            TxtGold = SngTwee
        ElseIf OptDrie = True Then
            TxtGold = SngDrie
        ElseIf OptVier = True Then
            TxtGold = SngVier
        ElseIf OptVijf = True Then
            TxtGold = SngVijf
        Else : TxtTotaal = ""
        End If


Gunkan 10-04-2008 07:20

Werkt het

Code:

code blok
hier niet?

EDIT:
Wel dus... Da's misschien wel handig als je grotere lappen code gaat laten zien. *suggestie doet*

Lothar 10-04-2008 20:49

Citaat:

CailinCoilleach schreef: (Bericht 27360834)
Werkt het

Code:

code blok
hier niet?

EDIT:
Wel dus... Da's misschien wel handig als je grotere lappen code gaat laten zien. *suggestie doet*

en hoe doe je dat dan?

en er zat een klein foutje in de code die ik gekopieerd hebt. TxtTotaal is het zelfde als TxtGold..
Khad de namen vereenvoudigd zodat het makkelijker werd om mij te helpen... Maar de code werkt nu nog niet.. Nog eens overkijken aub?

Gunkan 11-04-2008 05:20

Citaat:

En hoe doe je dat dan?
Ah, sorry :) In plaats van het woordje "quote" tussen blokhaken, zoals voor een citaat, schrijf je nu "code" tussen de blokhaken.

Lucky Luciano 11-04-2008 07:15

Citaat:

Lothar schreef: (Bericht 27365139)
en hoe doe je dat dan?

en er zat een klein foutje in de code die ik gekopieerd hebt. TxtTotaal is het zelfde als TxtGold..
Khad de namen vereenvoudigd zodat het makkelijker werd om mij te helpen... Maar de code werkt nu nog niet.. Nog eens overkijken aub?

kan je niet via de debugmode achterhalen waar het programma er mee stopt?

mathfreak 12-04-2008 12:59

Even de diverse stappen op een rij: je wilt een bepaald getal weergeven in het bovenste tekstvak. Stel dat je dit tekstvak TxtBox1 hebt genoemd en dat je voor het in te voeren getal de variabele Getal declareert. Je definieert dan: Getal=InputBox("Geef een getal op:"). Hiermee geef je via een invoervenster de waarde van Getal op. Om deze waarde in het bovenste tekstvak weer te geven gebruik je de opdracht TxtBox1.Text=Getal.
Nu wil je, afhankelijk van het keuzerondje dat je kiest, een bepaalde waarde in het tekstvak bij dat keuzerondje laten verschijnen. Omdat je 5 keuzerondjes hebt (zeg met de namen RBtn1, RBtn2, RBtn3, RBtn4 en RBtn5) moet je dus 5 keer controleren of een van deze keuzerondjes geselecteerd is. Zo ja, dan komt er in het bijbehorende tekstvak (zeg met de namen TxtBox2, TxtBox3, TxtBox4, TxtBox5 en TxtBox6) een getal te staan. Als er geen enkel keuzerondje geselecteerd is komt er in het onderste tekstvak (zeg met de naam TxtBox7) een 0 te staan. Stel dat het keuzerondje met de naam RBtn1 is geselecteerd. Deze eigenschap wordt in Visual Basic weergegeven als RBtn1.Checked=True. De eigenschap geeft dus een Boolean waarde als uitkomst. Je definieert nu een Boolean variabele Aangeklikt. Omdat je 5 keuzerondjes hebt krijgt Aangeklikt bij ieder keuzerondje de waarde RBtn.Checked, waarbij RBtn de naam van het desbetreffende keuzerondje voorstelt. Als Aangeklikt de waarde True heeft, dus als het keuzerondje is geselecteerd, moet er in het bijbehorende tekstvak (zeg TxtBox) een waarde Getal*AnderGetal worden opgeslagen. Je krijgt dus een instructie in de vorm
Code:

Aangeklikt=RBtn.Checked
        If Aangeklikt=True Then
        TxtBox.Text=Getal*AnderGetal
        End If

Omdat je deze instructie 5 keer achter elkaar uitvoert zou je gebruik kunnen maken van geneste If-Elseif statements, maar bij meer dan 3 te testen voorwaarden wordt dat nogal onoverzichtelijk. Je kunt in plaats daarvan ook gebruik maken van een Select Case statement. Het begin daarvan ziet er dan uit als
Code:

Select Case Aantal
        Case Aangeklikt=RBtn1.Checked
        If Aangeklikt=True Then
        TxtBox2.Text=Getal*AnderGetal1
        End If

Voor de overige 4 keuzerondjes ziet je Case instructie er precies zo uit. Na deze instructies sluit je af met
Code:

Case Else
        TxtBox7.Text=0
        End Select

Merk op dat je zo slechts 2 variabelen nodig hebt, namelijk Getal en Aangeklikt, om zo de waarden in de desbetreffende tekstvakken in te laten stellen.

Lothar 12-04-2008 13:14

bedankt Mathfreak voor de tijd die je er in hebt gestopt!
Ik zal nu proberen de code aan te passen aan wat je vertelde :)
alvast bedankt

Lothar 12-04-2008 14:29

Ok, kheb alles eens rustig overlezen. Enkele dingen begrijp ik niet..

-Wat?
Ik heb een vakje waar ik een getal invoer (In jouw uitleg TxtBox1). Dan heb ik 5 keuzerondjes (RBtn 1-5). Je hebt dan naast elke RBtn nog een TxtBox (TxtBox2-6). TxtBox2-6=de geselecteerde Rbtn*TxtBox1.
Als er geen enkele Rbtn geselecteerd is, dan verschijnt in TxtBox7 een 0.

-Jouw uitleg
Wat ik niet begreep uit jouw uitleg:

1) je wilt een bepaald getal weergeven in het bovenste tekstvak.
Stel dat je dit tekstvak TxtBox1 hebt genoemd en dat je voor het in te voeren getal de variabele Getal declareert.
Je definieert dan: Getal=InputBox("Geef een getal op:").
Hiermee geef je via een invoervenster de waarde van Getal op.
Om deze waarde in het bovenste tekstvak weer te geven gebruik je de opdracht TxtBox1.Text=Getal.

2) Stel dat het keuzerondje met de naam RBtn1 is geselecteerd.
Deze eigenschap wordt in Visual Basic weergegeven als RBtn1.Checked=True.

(Misschien is het door mijn versie van access (2003) maar 'Checked' kent hij niet.)

3) Je definieert nu een Boolean variabele Aangeklikt.

(Boolean? Ligt misschien voor de hand maar dat heb ik nog niet gezien in school..)

mathfreak 12-04-2008 17:01

Ik ging er van uit dat je werkte in Visual Basic, maar omdat je aangeeft dat je Access 2003 gebruikt begrijp ik dat je in Visual Basic for Applications (VBA) werkt. In dat geval gebruik je de eigenschap Enabled in plaats van Checked. Een ander verschil is dat een keuzerondje in Visual Basic de objectnaam RadioButton heeft, en in VBA de objectnaam OptionButton.
Een Boolean variabele is een variabele die slechts 2 waarden kan aannemen: True of False. In dit geval ligt het gebruik van een Boolean variabele voor de hand omdat een keuzerondje of een selectievakje maar 2 toestanden kent: wel of niet geselecteerd.

Lothar 12-04-2008 17:40

ok, nu begrijp ik het
nu gebeurt er nog 1 vreemd ding.

code:

If Opt1.Enabled = True Then
TxtBox7 = TxtBox1 * 23
ElseIf Opt2.Enabled = True Then
TxtBox7 = TxtBox1 * 30
End If

Dit is een klein voorbeeldje maar het systeem kan ik uitleggen. Hetzelfde gebeurt als ik opt1 of opt2 kies. Hij doet altijd *23
weet jij waarom?

mathfreak 12-04-2008 18:28

Citaat:

Lothar schreef: (Bericht 27373464)
ok, nu begrijp ik het
nu gebeurt er nog 1 vreemd ding.

code:

If Opt1.Enabled = True Then
TxtBox7 = TxtBox1 * 23
ElseIf Opt2.Enabled = True Then
TxtBox7 = TxtBox1 * 30
End If

Dit is een klein voorbeeldje maar het systeem kan ik uitleggen. Hetzelfde gebeurt als ik opt1 of opt2 kies. Hij doet altijd *23
weet jij waarom?

Je moet in TxtBox7 de waarde 0 krijgen als het goed is. In ieder geval moet je de uitdrukking TxtBox.Text=Waarde gebruiken om het tekstvak TxtBox met een bepaalde waarde te vullen.
Laat ik voor de zekerheid maar even de volledige code vermelden, zoals die er uit zou moeten zien:
Code:

Dim Getal As Integer, Aangeklikt As Boolean
Getal=InputBox("Geef een getal op:") 'getal ingeven via invoervenster
TxtBox1.Text=Getal 'getal weergeven in bovenste tekstvak
Select Case Aangeklikt
        Case Aangeklikt=Opt1.Enabled
        If Aangeklikt=True Then
        TxtBox2.Text=Getal*21.6
        End If
        Case Aangeklikt=Opt2.Enabled
        If Aangeklikt=True Then
        TxtBox3.Text=Getal*52.8
        End If
        Case Aangeklikt=Opt3.Enabled
        If Aangeklikt=True Then
        TxtBox4.Text=Getal*68.4
        End If
        Case Aangeklikt=Opt4.Enabled
        If Aangeklikt=True Then
        TxtBox5.Text=Getal*87
        End If
        Case Aangeklikt=Opt5.Enabled
        If Aangeklikt=True Then
        TxtBox6.Text=Getal*58.6
        End If
        Case Else 'als geen enkel keuzerondje geselecteerd is
        TxtBox7.Text=0
        End Select


Lothar 12-04-2008 18:51

2 zaken nu:

1: als ik jouw code laat lopen krijg ik een foutmelding en komt dit in het geel te staan: TxtBox1.Text = Getal 'getal weergeven in bovenste tekstvak

2: Die inputbox is eigenlijk niet nodig voor het resultaat dat ik wil.
ieder rondje komt overeen met een getal. Als het rondje geselecteerd is gaat TxtBox1*het getal van het geselecteerde rondje.

(bedankt voor je tijd en moeite)

mathfreak 13-04-2008 12:10

Citaat:

Lothar schreef: (Bericht 27373775)
2 zaken nu:

1: als ik jouw code laat lopen krijg ik een foutmelding en komt dit in het geel te staan: TxtBox1.Text = Getal 'getal weergeven in bovenste tekstvak

2: Die inputbox is eigenlijk niet nodig voor het resultaat dat ik wil.
ieder rondje komt overeen met een getal. Als het rondje geselecteerd is gaat TxtBox1*het getal van het geselecteerde rondje.

(bedankt voor je tijd en moeite)

Je hebt iets nodig om het getal in te geven waar je mee begint, vandaar dus de opdracht met InputBox. Waarschijnlijk is de foutmelding ontstaan doordat de waarde in het invoervenster niet als een getal, maar als een string wordt opgevat. Als je Getal=InputBox("Geef een getal op:") wijzigt in Getal=Val(InputBox("Geef een getal op:")) treedt daar in ieder geval geen fout meer op, omdat Getal dan inderdaad als een getal wordt opgevat.
Als je zonder invoervenster wilt werken veronderstel ik dat je het eerste tekstvak selecteert en daar zelf de waarde in typt waarmee je wilt werken. In dat geval kun je gewoon de instructie Getal=TxtBox1.Text gebruiken.

Lothar 13-04-2008 12:26

mijn code nu:

Code:

Private Sub CmdBerekenen_Click()
Dim Getal As Integer, Aangeklikt As Boolean
Getal = TxtBox1.Text
Select Case Aangeklikt
        Case Aangeklikt = Opt1.Enabled
        If Aangeklikt = True Then
        TxtBox2.Text = Getal * 21.6
        End If
        Case Aangeklikt = Opt2.Enabled
        If Aangeklikt = True Then
        TxtBox3.Text = Getal * 52.8
        End If
        Case Aangeklikt = Opt3.Enabled
        If Aangeklikt = True Then
        TxtBox4.Text = Getal * 68.4
        End If
        Case Aangeklikt = Opt4.Enabled
        If Aangeklikt = True Then
        TxtBox5.Text = Getal * 87
        End If
        Case Aangeklikt = Opt5.Enabled
        If Aangeklikt = True Then
        TxtBox6.Text = Getal * 58.6
        End If
        Case Else
        TxtBox7.Text = 0
        End Select
End Sub

wat klopt nu nog niet? :(

ILUsion 13-04-2008 12:43

Volgens mij klopt die Enabled niet, hoor. In zowat alle omgevingen (Delphi, VB, Java, ...) staat Enabled voor het al dan niet bruikbaar zijn van dat vakje (als het grijs is, staat enabled op false). Maar ik heb hier geen Office staan om mee na te kijken, maar het zou me echt verbazen dat het enabled zou zijn. Om dat na te gaan heb je normaal iets als een Object Inspector (Delphi-term): een venstertje waarmee je alle eigenschappen van een visueel object kan bekijken en dus ook naam, caption (weergavetekst) enzo kan aanpassen, daar staat dan ook zoiets als Checked bij.

Maar goed, wat volgens mij niet klopt aan je code: je controleert nu op Aangeklikt, welke een boolean is, maar je weet bij het begin niet of die boolean true/false is in feite. Je bent dus in het wilde weg aan het controleren. Wat ik zou proberen, als je ook nog steeds die case wilt:

Private Sub CmdBerekenen_Click()
Dim Getal As Integer

Code:

Getal = TxtBox1.Text

Select Case True
    Case Opt1.Enabled
        TxtBox2.Text = Getal * 21.6
    Case Opt2.Enabled
        TxtBox3.Text = Getal * 52.8
    Case Opt3.Enabled
        TxtBox4.Text = Getal * 68.4
    Case Opt4.Enabled
        TxtBox5.Text = Getal * 87
    Case Opt5.Enabled
        TxtBox6.Text = Getal * 58.6
    Case Else
        TxtBox7.Text = 0
End Select

End Sub

Nu moet ik wel toegeven dat mijn Basic-skills heel erg roestig zijn, maar het lijkt me nogal stom om in een CASE-structuur bij elke case weer je variabele te moeten herhalen (het heeft in sommige gevallen wel nut natuurlijk, maar voor een vergelijking niet). Dus misschien dat mijn code daarop vastloopt. Anders: misschien loopt hij vast op het feit dat hij bij die Select Case True i.p.v. True een variabele wilt, dan moet je hem ook maar die boolean Aangeklikt aanmaken en die instellen op True.

Een andere tip die ik geef: probeer wat te letten op je indentatie (witruimte voor je eigenlijke code), zoals bij mij. Ik weet dat VB er niet zo op let, en dat het waarschijnlijk niet aangeleerd wordt, maar door erop te letten, maak je je code VEEL leesbaarder, en hoe leesbaarder code, hoe makkelijker je er fouten uit kan halen omdat je de structuur direct ziet in plaats van dat je alles moet lezen.

Waar je inderdaad ook op moet letten is het eventuele omzetten van het ene type naar het andere, al zou Basic dat misschien wel zelf doen; dat weet ik nu echt niet meer. In de meeste andere talen is het trouwens wel noodzakelijk (dan moet je overal waar die .Text enzo staat, die String nog door Val( ) gooien, zoals mathfreak al gezegd heeft).

Lothar 13-04-2008 13:04

Bedankt,
ik voegde nu jouw code in maar hij gaf een foutmelding bij: Getal = TxtBox1.Text
Dat kon ik verhelpen door overal de .Text weg te laten.
Misschien komt het door de .Text weg te laten maar nu doet hij altijd TxtBox1*21.6. Hij houdt geen rekening met wat er geselecteerd is nu...

ILUsion 14-04-2008 17:26

Dat lijkt me dan ook het idee van die Enabled: enabled is in elke grafische omgeving die ik ken: het al dan niet grijs zijn van het vakje. Of het aangevinkt is, dat wordt meestal aangegeven door checked, of value, of iets dergelijks. Maar ik heb hier geen Office staan, DUS dat moet je zelf zoeken, met welk veld je dat doet.

En volgens mij moet die .Text er wel bij, tenzij je heel rare dingen gedaan hebt. De reden is dat en TxtBox geen getal is, maar een TextBox en de waarde die ingevuld is, normaal dus met iets als .Text opgeroepen zou moeten worden, lijkt me; maar ik kan me natuurlijk vergissen (in dat geval daalt VB in mijn achting).

Lothar 14-04-2008 17:29

Citaat:

ILUsion schreef: (Bericht 27383596)
Dat lijkt me dan ook het idee van die Enabled: enabled is in elke grafische omgeving die ik ken: het al dan niet grijs zijn van het vakje. Of het aangevinkt is, dat wordt meestal aangegeven door checked, of value, of iets dergelijks. Maar ik heb hier geen Office staan, DUS dat moet je zelf zoeken, met welk veld je dat doet.

En volgens mij moet die .Text er wel bij, tenzij je heel rare dingen gedaan hebt. De reden is dat en TxtBox geen getal is, maar een TextBox en de waarde die ingevuld is, normaal dus met iets als .Text opgeroepen zou moeten worden, lijkt me; maar ik kan me natuurlijk vergissen (in dat geval daalt VB in mijn achting).

ok, kzal eens zoeken wat die enabled zou kunnen zijn :)
maar ik vrees inderdaad dat VB in je achting zal dalen. van .Text heb ik niks gezien op school..

Lothar 14-04-2008 17:48

JA!!!!
nu werkt het! :D:D:D

Code:

Private Sub CmdBerekenen_Click()

Getal = TxtBox1

Select Case True
    Case Opt1 = True
        TxtBox2 = Getal * 21.6
    Case Opt2 = True
        TxtBox3 = Getal * 52.8
    Case Opt3 = True
        TxtBox4 = Getal * 68.4
    Case Opt4 = True
        TxtBox5 = Getal * 87
    Case Opt5 = True
        TxtBox6 = Getal * 58.6
    Case Else
        TxtBox7 = 0
End Select

End Sub

bedankt ilusion en mathfreak! jullie hebben me beide fantastisch geholpen! *O*

Lothar 14-04-2008 21:00

Ow :(

wat is:
fout 94 tijdens uitvoering:
Ongeldig gebruik van Null


alles werkte, nu krijg ik dit? :(

ILUsion 14-04-2008 21:24

Null is een waarde die geen waarde is, het komt eigenlijk neer op de computer die zegt 'ik weet niet waar dat object/dat item/... staat' (dus als je bv. een object, item, ... gebruikt vanuit een variabele, maar je hebt nog geen item in die variabele gestoken).

Bv. die TxtBoxen moet je eerst grafisch aanmaken, maar als je er bv. eentje wegdoet, en toevallig selecteer je het bijhorende vinkje, dan zal hij een NULL geven: hij vindt wel de variabele TxtBoxN, maar daarin zit er geen TxtBox, die variabele is leeg, oftewel NULL. (andere talen gebruiken soms ook NIL: not in list).


Alle tijden zijn GMT +1. Het is nu 20:40.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.