Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Programmeren

[vb6] Set myObject = Nothing probleem

Laurens
15 antwoorden
  • Ik heb een programma waarin ik veel klassemodules gebruik.
    Zo heb ik een klasse Beheer met daarin een functie CreateUser die een object teruggeeft van de klasse Gebruiker.
    De code van deze klasse werkt op zich goed, maar mocht er een database probleem optreden, dan moet er toch foutafhandeling zijn.

    Zodra er een fout optreedt, volgt na de foutafhandeling het statement
    [code:1:20bb102966]Set CreateUser = Nothing[/code:1:20bb102966]

    Doe ik iets simpels als

    [code:1:20bb102966]If Not myBeheer.CreateUser Is Nothing Then
    Call updateUserList
    End If[/code:1:20bb102966]

    dan werkt alles perfect, inclusief foutafhandeling.

    Wil ik echter gebruik maken van het object dat teruggegeven wordt, dan gaat het fout als CreateUser de waarde Nothing teruggeeft:

    [code:1:20bb102966]
    Dim selectedUser as New ztrUser
    Set selectedUser = myBeheer.CreateUser

    If Not selectedUser Is Nothing Then
    listUserGroepen selectedUser.Username
    End If
    [/code:1:20bb102966]

    selectedUser neemt de waarde Nothing niet goed over, maar krijgt in debug mode de waarde <Object variable or With block variable not set>

    Weet iemand hoe ik dit kan oplossen?
  • Wat is de waarde aan het einde van de functie CreateUser ?
  • CreateUser geeft - als er GEEN fout optreedt - een ztrUser object terug.
    Dit ztrUser object kan dan direct gebruikt worden. Dit deel gaat ook goed, het gaat erom wat er gebeurt als tijdens de functie CreateUser een fout optreedt. Ik heb geprobeerd om de functie CreateUser de waarde Nothing terug te laten geven, maar helaas werkt dit niet.

    Als omweggetje vraag ik nu na de functie de lengte van de Username van het object selectedUser uit. Als deze 0 is, worden de onderliggende opdrachten niet uitgevoerd.

    Toch zou ik graag willen weten of het mogelijk is om die waarde Nothing terug te laten geven door zo'n functie aan een object.
  • Het is een bekend probleem in VB6 dat er met de waarde Nothing rare dingen gebeuren. Dit is verholpen in VB .Net.
  • [quote:a06d29f965="RubeL"]Ik heb een programma waarin ik veel klassemodules gebruik.
    Zo heb ik een klasse Beheer met daarin een functie CreateUser die een object teruggeeft van de klasse Gebruiker.
    De code van deze klasse werkt op zich goed, maar mocht er een database probleem optreden, dan moet er toch foutafhandeling zijn.

    Zodra er een fout optreedt, volgt na de foutafhandeling het statement
    [code:1:a06d29f965]Set CreateUser = Nothing[/code:1:a06d29f965]

    Doe ik iets simpels als

    [code:1:a06d29f965]If Not myBeheer.CreateUser Is Nothing Then
    Call updateUserList
    End If[/code:1:a06d29f965]

    dan werkt alles perfect, inclusief foutafhandeling.

    Wil ik echter gebruik maken van het object dat teruggegeven wordt, dan gaat het fout als CreateUser de waarde Nothing teruggeeft:

    [code:1:a06d29f965]
    Dim selectedUser as New ztrUser
    Set selectedUser = myBeheer.CreateUser

    If Not selectedUser Is Nothing Then
    listUserGroepen selectedUser.Username
    End If
    [/code:1:a06d29f965]

    selectedUser neemt de waarde Nothing niet goed over, maar krijgt in debug mode de waarde <Object variable or With block variable not set>

    Weet iemand hoe ik dit kan oplossen?[/quote:a06d29f965]

    Een boek VB6 voor dummies kopen.
    Weet je zeker dat je weet wat je aan het doen bent? :-?

    [code:1:a06d29f965]Set TestObject = Nothing[/code:1:a06d29f965]
    Met bovenstaande code zorg je ervoor dat de variabale TestObject alle referenties naar een object verliest en dus niet meer geldig zijn.

    Als je dan toch probeert de variabele TestObject te gebruiken dan krijg je dus de melding [i:a06d29f965]"[b:a06d29f965]Object variable[/b:a06d29f965] or With block [b:a06d29f965]not set[/b:a06d29f965]"[/i:a06d29f965]

    Bovendien
    [code:1:a06d29f965]
    Dim selectedUser as New ztrUser
    Set selectedUser = myBeheer.CreateUser
    [/code:1:a06d29f965]
    Je creëert hier tweemaal een object.
    Het eerste object wordt gecreëerd door [i:a06d29f965]New ztrUser[/i:a06d29f965]
    Waarna deze direct door [i:a06d29f965]Set selectedUser = myBeheer.CreateUser[/i:a06d29f965] wordt overschreven.
    [code:1:a06d29f965]
    If Not selectedUser Is Nothing Then
    listUserGroepen selectedUser.Username
    End If
    [/code:1:a06d29f965]
    Het is niet meer dan normaal om zulke aanroepen te gebruiken. Zie bovenstaande opmerking.

    Aanpassing…
    [code:1:a06d29f965]
    Dim selectedUser As ztrUser ' Ik weet niet zeker of deze regel zo gaat werken.

    if (not (myBeheer is Nothing)) then
    Set selectedUser = myBeheer.CreateUser
    If (not (selectedUser is Nothing)) then
    Call listUserGroepen(selectedUser.Username)
    else
    ' Fout: Aanmaken van nieuwe user is niet gelukt
    end if
    else
    ' Fout: myBeheer is niet gezet.
    end if
    [/code:1:a06d29f965]
  • Eerst zeg je dit:

    [quote:31ba627811]Je creëert hier tweemaal een object.
    Het eerste object wordt gecreëerd door New ztrUser
    Waarna deze direct door Set selectedUser = myBeheer.CreateUser wordt overschreven. [/quote:31ba627811]

    En vervolgens is je versimpeling:

    [code:1:31ba627811]Dim selectedUser as New ztrUser
    if (not (myBeheer is Nothing)) then
    Set selectedUser = myBeheer.CreateUser
    If (not (selectedUser is Nothing)) then
    Call listUserGroepen(selectedUser.Username)
    else
    ' Fout: Aanmaken van nieuwe user is niet gelukt
    end if
    else
    ' Fout: myBeheer is niet gezet.
    end if[/code:1:31ba627811]

    Ik zie het misschien verkeerd, maar doe je nou niet gewoon precies hetzelfde alleen dan binnen een If? Waar slaat die opmerking dan op?
  • [quote:9e56bf9f3e="Ben Lankamp"]Eerst zeg je dit:

    [quote:9e56bf9f3e]Je creëert hier tweemaal een object.
    Het eerste object wordt gecreëerd door New ztrUser
    Waarna deze direct door Set selectedUser = myBeheer.CreateUser wordt overschreven. [/quote:9e56bf9f3e]

    En vervolgens is je versimpeling:

    [code:1:9e56bf9f3e]Dim selectedUser as New ztrUser
    ^^^
    [/code:1:9e56bf9f3e]
    Overigens weet ik niet of dat bij dit Object ook gaat werken.
    [code:1:9e56bf9f3e]
    if (not (myBeheer is Nothing)) then
    Set selectedUser = myBeheer.CreateUser
    If (not (selectedUser is Nothing)) then
    Call listUserGroepen(selectedUser.Username)
    else
    ' Fout: Aanmaken van nieuwe user is niet gelukt
    end if
    else
    ' Fout: myBeheer is niet gezet.
    end if[/code:1:9e56bf9f3e]

    Ik zie het misschien verkeerd, maar doe je nou niet gewoon precies hetzelfde alleen dan binnen een If? Waar slaat die opmerking dan op?[/quote:9e56bf9f3e]

    Die If wordt niet voor niets gebruikt.

    H4xX0r says: "80% procent van de bugs wordt veroorzaakt door slecht inzicht en aannames"
  • Sorry, ik las het verkeerd. Verkeerd inzicht lijkt me een beetje sterk, aangezien ik ICT studeer en we daar onze twee lesjaren VB(A) al hebben gehad. Daarnaast heb ik al 8 jaar eigen ervaring in (Visual) Basic.
  • [quote:7d66a8732d="h4xX0r"]
    Een boek VB6 voor dummies kopen.
    Weet je zeker dat je weet wat je aan het doen bent? :-?
    [/quote:7d66a8732d]

    Dank je voor deze bijzondere complimenterende opmerking. Ik zal hieronder proberen duidelijk te maken hoe ik tot een en ander gekomen ben.

    [quote:7d66a8732d="h4xX0r"]
    [code:1:7d66a8732d]Set TestObject = Nothing[/code:1:7d66a8732d]
    Met bovenstaande code zorg je ervoor dat de variabale TestObject alle referenties naar een object verliest en dus niet meer geldig zijn.

    Als je dan toch probeert de variabele TestObject te gebruiken dan krijg je dus de melding [i:7d66a8732d]"[b:7d66a8732d]Object variable[/b:7d66a8732d] or With block [b:7d66a8732d]not set[/b:7d66a8732d]"[/i:7d66a8732d]

    Bovendien
    [code:1:7d66a8732d]
    Dim selectedUser as New ztrUser
    Set selectedUser = myBeheer.CreateUser
    [/code:1:7d66a8732d]
    Je creëert hier tweemaal een object.
    Het eerste object wordt gecreëerd door [i:7d66a8732d]New ztrUser[/i:7d66a8732d]
    Waarna deze direct door [i:7d66a8732d]Set selectedUser = myBeheer.CreateUser[/i:7d66a8732d] wordt overschreven.
    [/quote:7d66a8732d]

    Dat klopt, een keer expliciet (Dim As New) en later middels het Set commando. Dit heeft ook een reden; in mijn form heb ik een boomstructuur. Middels deze boomstructuur kunnen ontzettend veel acties uitgevoerd worden op beheergebied en dus veel acties met betrekking tot gebruikers. Gezien het vele aantal aanroepen van het gebruikersobject heb ik het object selectedUser in de general declarations gedeclareerd. Met het simpele commando
    [code:1:7d66a8732d]
    selectedUser.Username = "RUBEL"
    [/code:1:7d66a8732d]
    weet het object waar het moet kijken (of moet schrijven) in de database.

    [quote:7d66a8732d="h4xX0r"]
    [code:1:7d66a8732d]
    If Not selectedUser Is Nothing Then
    listUserGroepen selectedUser.Username
    End If
    [/code:1:7d66a8732d]
    Het is niet meer dan normaal om zulke aanroepen te gebruiken. Zie bovenstaande opmerking.
    [/quote:7d66a8732d]

    Niks mis mee dan toch?

    [quote:7d66a8732d="h4xX0r"]
    Aanpassing…
    [code:1:7d66a8732d]
    Dim selectedUser As ztrUser ' Ik weet niet zeker of deze regel zo gaat werken.

    if (not (myBeheer is Nothing)) then
    Set selectedUser = myBeheer.CreateUser
    If (not (selectedUser is Nothing)) then
    Call listUserGroepen(selectedUser.Username)
    else
    ' Fout: Aanmaken van nieuwe user is niet gelukt
    end if
    else
    ' Fout: myBeheer is niet gezet.
    end if
    [/code:1:7d66a8732d][/quote:7d66a8732d]

    Die eerste regel gaat gewoon werken, mits je maar Set gebruikt (wat je ook doet). De gedachte erachter begrijp ik echter niet, want wat is het verschil nu in resultaat? Zoals je zelf al zegt overschrijf ik het object selectedUser met het Set commando. Er verandert dus werkelijk helemaal niets; de fout blijft hetzelfde.

    Misschien krijgen we kwantumkorting als we allebei dat dummies-boek aanschaffen! :lol:

    De heren van Bill zullen er wel een gedachte bij hebben, ik blijf erbij dat ie eigenlijk gewoon het object als Nothing zou moeten teruggeven.
  • Dim selectedUser as New ztrUser
    Set selectedUser = myBeheer.CreateUser


    Voorop gesteld. Het gebruik van New in de declaratie is een voorbeeld van bad practice.
    Dat blijkt ook wel, want het object is hier al gecreëerd voordat je het eigenlijk wilt. Blijkbaar wil je het object in CreateUser maken, dus waarom doe je het hier al? Je moet het alleen maar declareren, verder niet.
    Nu ga je een reeds lokaal gecreëerd object proberen elders te overschrijven. Aangezien dit object lokaal al bestaat kan ik me er iets bij voorstellen dat hij geen nothing wordt in die CreateUser, maar ik ken de kode daarvan niet.

    Je zult toch echt de code van CreateUser moeten geven voordat we hier een sluitend antwoord op je vraag kunnen geven.
    ———————–

    Je zou kunnen overwegen om Selected User als parameter te gebruiken.
    Iets als

    [code:1:debe7b3ef7]

    Private Sub Command1_Click()
    Dim objTest As clsUser

    Call CreateClass(objTest)

    If objTest Is Nothing Then
    MsgBox "Nothing"
    End If

    End Sub

    Private Function CreateObject(objTest As clsUser)
    ' Ja, ik weet het. Dit is raar in een Create, maar het is maar een voorbeeld.
    Set objTest = Nothing

    End Function

    [/code:1:debe7b3ef7]

    Werkt probleemloos.
  • Het object is niet gedeclareerd alvorens het nodig is, want ik gebruik het door m'n hele form heen. Het enige dat misschien apart is, is dat ik dat bestaande object meteen wil gebruiken op het moment dat ik een gebruiker aanmaak (en dan overschrijf ik het object dus).

    In feite zou het ook kunnen met een nieuwe declaratie:
    [code:1:73da3d6db3]
    Dim newUser As ZorgtijdUser

    Set newUser = myMMC.CreateUser

    If Not newUser Is Nothing Then
    Set selectedUser = newUser

    Call TreeUsers
    Call UserInfo(selectedUser.Username)
    End If
    [/code:1:73da3d6db3]

    Echter, ook hier: VB vindt newUser niet Nothing!

    Daarom dan nu de complete code van dat gedeelte:

    Create-knop:
    [code:1:73da3d6db3]
    Set selectedUser = myMMC.CreateUser

    If Not selectedUser Is Nothing Then
    Call TreeUsers
    Call UserInfo(selectedUser.Username, True)
    End If
    [/code:1:73da3d6db3]

    Functie CreateUser in Beheer klasse:
    [code:1:73da3d6db3]
    Friend Function CreateUser(Optional oudeNaam As String) As ZorgtijdUser
    Dim strUsername As String, strPassword As String, strEncPwd As String
    Dim rsAddUser As Recordset
    Dim newUser As New ZorgtijdUser

    strUsername = UCase(Trim(InputBox$("Geef de gebruikersnaam op voor de nieuwe gebruiker.", "Nieuwe gebruiker maken", oudeNaam)))

    Select Case Len(strUsername)
    Case 0
    Set newUser = Nothing

    Case Is > 15
    If MsgBox("De gebruikersnaam mag niet meer dan 15 karakters bevatten.", vbOKOnly + vbExclamation, "Ongeldige gebruikersnaam") = vbRetry Then
    CreateUser = CreateUser(Left(strUsername, 15))
    End If

    Case Else
    If faultyUsername(strUsername) Then
    If MsgBox("De door U opgegeven gebruikersnaam bevat " & Chr$(233) & Chr$(233) & "n of meerdere ongeldige karakters." & vbCrLf & "Alleen letters en cijfers zijn toegestaan. Kies een andere gebruikersnaam.", vbRetryCancel + vbExclamation, "Ongeldige gebruikersnaam") = vbRetry Then
    CreateUser = CreateUser(strUsername)
    End If

    ElseIf userExists(strUsername) Then
    If MsgBox("De door U gekozen gebruikersnaam bestaat al. Kies een andere, unieke gebruikersnaam.", vbRetryCancel + vbExclamation, "Gebruiker " & strUsername & " bestaat al") = vbRetry Then
    CreateUser = CreateUser(strUsername)
    End If

    Else
    strPassword = GeneratePassword(5)
    strEncPwd = EncryptText(LCase(strPassword), strUsername)

    On Error GoTo fout
    Set rsAddUser = dbIRIS.LinkTable(tblUsers)

    rsAddUser.AddNew

    rsAddUser!Username = strUsername
    rsAddUser!Password = strEncPwd
    rsAddUser!full_name = "Onbekende gebruikersaccount"

    rsAddUser.Update
    rsAddUser.Close

    MsgBox "De gebruiker '" & strUsername & "' is aangemaakt." & vbCrLf & "Als tijdelijk wachtwoord is '" & strPassword & "' (kleine letters) toegekend.", vbOKOnly + vbInformation, "Gebruiker aangemaakt"

    newUser.Username = strUsername
    End If
    End Select

    Set CreateUser = newUser

    Exit Function

    fout:
    MsgBox "Er is een fout opgetreden bij het aanmaken van de gebruiker '" & strUsername & "'.", vbOKOnly + vbExclamation, "Gebruiker niet aangemaakt"
    Set CreateUser = Nothing
    End Function
    [/code:1:73da3d6db3]

    Zoals al eerder gezegd werkt de code naar behoren op het moment dat er een echt object wordt teruggegeven.
  • Eigenlijk is het vreemder dat het wel werkt wanneer je een object aanmaakt dan dat het niet werkt als je geen object aanmaakt.
    Je retourneert een pointer naar een object dat bij het verlaten van de funktie out of scope is. Dat het werkt heeft puur met de tolerantie van VB te maken t.o.v. van slechte programmeertechnieken.

    Het recursieve gebruik van CreateUser als er wel een naam is meegegeven zou toch ook tot problemen moeten leiden, ware het niet dat bij verlaten van de funktie weer NewUser over CreateUser heengekalkt wordt.

    Kijk nu eens goed wat je doet.
    Je maakt NewUser aan.
    Als naam langer is dan 0 krijgt CreateUser direct de waarde van een object (recursief uitgevoerd, hoe kan dit nu werken zonder dat het geheugen volloopt?)

    Als alles goed verloopt wordt in de database een nieuwe user aangemaakt, en tenslotte wordt een leeg, lokaal 'as new' gedeclareerd en gecreëerd object geretourneerd.
    VB laat objecten bestaan zolang er een referentie naar is, zelfs in dit geval waar het een lokaal object betreft (voor de goede orde, dit is dus fout geprogrammeerd, maar klapt niet omdat vb vrij tolerant is).

    In dit geval zal er als je newUser op Nothing zet geen referentie meer zijn omdat hij bij verlaten van de funktie out of scope raakt, object verdwijnt dus helemaal.
    Dat is niet hetzelfde als Nothing, maar gewoon een geval van 'Object or with block variable not set.' .
  • Goed, je verhaal is heel duidelijk, ik snap nu goed waarom ik het niet op Nothing kan krijgen.
    Bijkomende verhaal over de recursieve CreateUser is op zich ook duidelijk, heb je alleen misschien nog wat suggesties (liefst met een klein voorbeeldje) hoe ik dit stuk code op de goede manier kan herschrijven? Het mooiste zou natuurlijk zijn als ik dan alsnog in mijn aanroep de door mij gewenste Nothing kan retourneren.

    Ik heb alvast wat code verandert om niet met een overschot aan objecten te blijven zitten:

    Add-button
    [code:1:130a2716d0]
    Dim newUser As ZorgtijdUser

    Set newUser = myMMC.CreateUser

    If Not Len(newUser.Username) = 0 Then
    Call TreeUsers
    Call UserInfo(newUser.Username, True)

    Set newUser = Nothing
    End If
    [/code:1:130a2716d0]

    Klasse functie:
    [code:1:130a2716d0]
    Friend Function CreateUser(Optional oudeNaam As String) As ZorgtijdUser
    Dim strUsername As String, strPassword As String, strEncPwd As String
    Dim rsAddUser As Recordset
    Dim newUser As ZorgtijdUser

    strUsername = UCase(Trim(InputBox$("Geef de gebruikersnaam op voor de nieuwe gebruiker.", "Nieuwe gebruiker maken", oudeNaam)))

    Select Case Len(strUsername)
    Case 0
    Set newUser = Nothing

    Case Is > 15
    If MsgBox("De gebruikersnaam mag niet meer dan 15 karakters bevatten.", vbRetryCancel + vbExclamation, "Ongeldige gebruikersnaam") = vbRetry Then
    Set newUser = CreateUser(Left(strUsername, 15))
    End If

    Case Else
    If faultyUsername(strUsername) Then
    If MsgBox("De door U opgegeven gebruikersnaam bevat " & Chr$(233) & Chr$(233) & "n of meerdere ongeldige karakters." & vbCrLf & "Alleen letters en cijfers zijn toegestaan. Kies een andere gebruikersnaam.", vbRetryCancel + vbExclamation, "Ongeldige gebruikersnaam") = vbRetry Then
    Set newUser = CreateUser(strUsername)
    End If

    ElseIf userExists(strUsername) Then
    If MsgBox("De door U gekozen gebruikersnaam bestaat al. Kies een andere, unieke gebruikersnaam.", vbRetryCancel + vbExclamation, "Gebruiker " & strUsername & " bestaat al") = vbRetry Then
    Set newUser = CreateUser(strUsername)
    End If

    Else
    strPassword = GeneratePassword(5)
    strEncPwd = EncryptText(LCase(strPassword), strUsername)

    On Error GoTo fout
    Set rsAddUser = dbIRIS.LinkTable(tblUsers)

    rsAddUser.AddNew

    rsAddUser!Username = strUsername
    rsAddUser!Password = strEncPwd
    rsAddUser!full_name = "Onbekende gebruikersaccount"

    rsAddUser.Update
    rsAddUser.Close

    MsgBox "De gebruiker '" & strUsername & "' is aangemaakt." & vbCrLf & "Als tijdelijk wachtwoord is '" & strPassword & "' (kleine letters) toegekend.", vbOKOnly + vbInformation, "Gebruiker aangemaakt"

    Set newUser = New ZorgtijdUser
    newUser.Username = strUsername
    End If
    End Select

    Set CreateUser = newUser

    Exit Function

    fout:
    MsgBox "Er is een fout opgetreden bij het aanmaken van de gebruiker '" & strUsername & "'.", vbOKOnly + vbExclamation, "Gebruiker niet aangemaakt"
    Set CreateUser = Nothing
    End Function
    [/code:1:130a2716d0]

    Als ik jou verhaal goed begrepen heb, krijg ik bij meerdere malen verkeerd invullen nu geen overschot aan lokaal gedeclareerde newUser objecten die het geheugen vervuilen.

    Bij het definitieve aanmaken wordt een object newUser aangemaakt.
    Bij een eventuele foute invoer wordt alleen de pointer aangepast.
    Na het retourneren gebruik ik het object enkel om informatie door te geven aan de sub, daarna wordt het vernietigd.
    Wat ik precies wil (met dat Nothing) lukt zo natuurlijk nog niet, maar ik denk dat dit al een stuk 'netter' geprogrammeerd is. Feit blijft wel dat newUser blijft refereren naar een object dat eigenlijk uit scope is gegaan, maar door VB in stand wordt gehouden.

    Heb ik het zo goed geformuleerd? Ik heb ook geprobeerd om vanuit de functie een New ZorgtijdUser te laten retourneren, maar New mag natuurlijk niet. Wellicht weet je daar een oplossing voor.
  • Nee, dat bedoel ik niet. Het lijkt mij dat als er wel een goede naam is ingegeven de funktie zichzelf aan gaat roepen met dezelfde waarde en dan weer en weer. Heb je al eens in debug gekeken wat er precies gebeurd?
    Ik kan het hier niet naspelen want ik heb momenteel geen VB.

    Waarom wil je eigenlijk precies nothing retourneren? Het is op zich wel netjes om klassen te gebruiken voor dit soort dingen, maar is het niet effectiever om vooraf te checken om de ingave klopt zodat je alleen maar een object hoeft te creëren als je over juiste waarden beschikt? De aktie is op zich al een beetje vreemd, want als ik je code zou lees wil je eigenlijk dat SelectedUser de zojuist gecreëerde user is terwijl er alleen maar een record aan de database is toegevoegd. M.a.w. Je SelectedUser is helemaal geen user. Maar goed, het kan zijn dat je dit gewoon de bedoeling is.


    Heb je al eens geprobeerd CreateUser een object terug te laten geven? Dus:

    [code:1:d8a8f79131]
    Friend Function CreateUser(Optional oudeNaam As String) As Object
    [/code:1:d8a8f79131]

    Als ik het me goed herinner zou je dan Nothing moeten kunnen retourneren of zou je een IsObject afvraging kunnen doen ipv Is Nothing.
  • [quote:8dfd73aac9]
    Nee, dat bedoel ik niet. Het lijkt mij dat als er wel een goede naam is ingegeven de funktie zichzelf aan gaat roepen met dezelfde waarde en dan weer en weer. Heb je al eens in debug gekeken wat er precies gebeurd?
    Ik kan het hier niet naspelen want ik heb momenteel geen VB.
    [/quote:8dfd73aac9]

    Dat gebeurt niet. Er staan inderdaad 2 aanroepen:
    [code:1:8dfd73aac9]
    If faultyUsername(strUsername) Then

    ElseIf userExists(strUsername) Then

    [/code:1:8dfd73aac9]

    faultyUsername en userExists zijn twee private functies van de beheerklasse. Ze kijken respectievelijk of er een onjuiste username is opgegeven (bijv. met leestekens) en of de gebruikersnaam al bestaat. Alleen in dat geval wordt de CreateUser functie opnieuw aangeroepen.

    De code
    [code:1:8dfd73aac9]
    newUser.Username = strUsername
    [/code:1:8dfd73aac9]

    zorgt ervoor dat het gebruikersobject zijn Username weet. Daardoor kan ik er gelijk mee werken. Als ik een property (zoals Fullname) uitvraag, wordt op dat moment aan de hand van de Username realtime uit de database uitgevraagd wat die Fullname moet zijn.

    Ik heb met mijn nieuwe code wat tests uitgevoerd en ik denk dat het zo al een stuk beter werkt.

    Het retourneren van een Object vind ik op zich wel interessant, maar hoe weet mijn programma dan weer wat voor object het moet zijn?

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.