Ga naar inhoud

[vb6] Set myObject = Nothing probleem


anoniem

Aanbevolen berichten

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?
Link naar reactie
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.
Link naar reactie
[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]
Link naar reactie
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?
Link naar reactie
[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"
Link naar reactie
[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.
Link naar reactie
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.
Link naar reactie
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.
Link naar reactie
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.' .
Link naar reactie
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.
Link naar reactie
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.
Link naar reactie
[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?
Link naar reactie
Dat hoeft ie niet te weten. Het is een object of niet. Je wilt toch weten of je funktie wel of geen user heeft aangemaakt? In dat geval komt er een object terug. Van welke klasse die afgeleid is, is in dit geval niet van belang omdat er maar 1 soort teruggeven kan worden. Overigens zou ik het als parameter meegeven van je object ook niet op voorhand uitsluiten. Dat is een hele makkelijke oplossing waarbij je zonder problemen een Nothing 'waarde' kan zetten. Die vraag je dan gewoon in een volgend statement af.
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

  • Populaire leden

    Er is nog niemand die deze week reputatie heeft ontvangen.

  • Leden

    Geen leden om te tonen

×
×
  • Nieuwe aanmaken...