Toon posts:

[VB6] Function returned geen complex object

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi allemaal!

Misschien een vage omschrijving maar ik zit met het volgende. Vanuit VB6 wil ik een functie maken die een DOMDocument terug geeft. Ik heb een hele simpele functie gemaakt maar begrijp niet waarom dit niet werkt.

code:
1
2
3
4
Public Function TestFunction() As DOMDocument
    Dim test As New DOMDocument
    TestFunction = test
End Function


Ik krijg de foutmelding: "object variable or with block variable not set". Ik heb dit nog voor geen enkel complex object voor elkaar gekregen. Als ik een simpel type gebruik werkt het wel. Hij loopt vast op het toewijzen van het object aan de functie (dus het terug geven van de variabele).

code:
1
2
3
4
5
Public Function TestFunction() As Integer
    Dim test As Integer
    test = 1
    TestFunction = test
End Function


Ik doe iets verkeerd maar heb geen idee wat. Het is ook alweer een tijd geleden dat ik met VB6 gewerkt heb B). Dit moet toch uberhaupt mogelijk zijn in VB6 dunkt mij?

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 13-01 07:19
Als je een object aan een variabele wilt toewijzen moet je SET gebruiken
SET TestFunction = test

  • wboevink
  • Registratie: September 2004
  • Laatst online: 09-02 17:21
Als het dan toch lang geleden is, even een opfris cursus.
Voor deze simpele functie maakt het weinig uit, maar in het algemeen geld dat je ipv:

Dim obj as new Object

Beter als volgt kan doen:

Dim obj as Object
Set obj = New Object

Zo weet je in ieder geval zeker dat het object geinstantieerd wordt wanneer jij dat wil.

Verwijderd

Topicstarter
Super!! Moet toch zeggen dat VB6 erg raar weer werkt als je OOP probeert te programmeren! Vooral als je al 4+ jaar met OOP talen werkt :o. Echt super bedankt! Begint me nu weer van alles te dagen _/-\o_.

P.S. Er is niet iets zoals een constructor in VB6 of wel?


Edit
Oh trouwens wat is het verschil tussen.
code:
1
Dim o as new DOMDocument

en
code:
1
2
Dim o as DOMDocument
Set o = new DOMDocument


Beiden zouden een object moeten instantieren??

[ Voor 28% gewijzigd door Verwijderd op 01-08-2006 17:53 ]


  • coenbijlsma
  • Registratie: Augustus 2004
  • Niet online
Nee. Bij de eerste geef je aan dat je een variabele o hebt van het type DOMDocument, en plaatst 'm gelijk in het geheugen.

Bij het 2e stukje code doe je dat in 2 stappen. Eerst aanmaken en vervolgens instantiëren.

Verwijderd

Topicstarter
cbijlsma schreef op dinsdag 01 augustus 2006 @ 19:58:
Nee. Bij de eerste geef je aan dat je een variabele o hebt van het type DOMDocument, en plaatst 'm gelijk in het geheugen.

Bij het 2e stukje code doe je dat in 2 stappen. Eerst aanmaken en vervolgens instantiëren.
Ik begrijp dat het in twee stappen gebeurd maar het was meer een quote op het volgende
Zo weet je in ieder geval zeker dat het object geinstantieerd wordt wanneer jij dat wil.
Vind het een beetje vaag dat je bij het direct instantieeren van een object het niet zo zeker is dat ie aangemaakt wordt? :? wboevink of iemand anders misschien uitleg hierop? Volgens mij is het namelijk onzin maar ik weet niet of VB6 misschien hier anders overdenkt?

  • Tukk
  • Registratie: Januari 2002
  • Laatst online: 11:41

Tukk

De α-man met het ẞ-brein

Verwijderd schreef op dinsdag 01 augustus 2006 @ 20:08:
[...]

Ik begrijp dat het in twee stappen gebeurd maar het was meer een quote op het volgende


[...]


Vind het een beetje vaag dat je bij het direct instantieeren van een object het niet zo zeker is dat ie aangemaakt wordt? :? wboevink of iemand anders misschien uitleg hierop? Volgens mij is het namelijk onzin maar ik weet niet of VB6 misschien hier anders overdenkt?
Bij het 1e wordt het object geinstantieerd, meteen als de variabele gedeclareerd wordt. Bij het tweede kun je zelf alsnog ergens in de code de tweede regel plaatsten, mogelijk heb je het object niet eens nodig, bij de 1e wordt hij altijd aangemaakt, bij de tweede beslis je het zelf.

Q: How many geeks does it take to ruin a joke? A: You mean nerd, not geek. And not joke, but riddle. Proceed.


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 13:48

Robtimus

me Robtimus no like you

Verwijderd schreef op dinsdag 01 augustus 2006 @ 17:51:
Moet toch zeggen dat VB6 erg raar weer werkt als je OOP probeert te programmeren!
Veel succes ermee.

VB6 is geen OOP taal, het ondersteunt ook geen OOP. Ja er zijn klassen, maar daar houdt het meteen mee op. Interfaces zijn er impliciet maar enige vorm van inheritance kun je vergeten.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
Tukk schreef op dinsdag 01 augustus 2006 @ 20:11:
[...]


Bij het 1e wordt het object geinstantieerd, meteen als de variabele gedeclareerd wordt. Bij het tweede kun je zelf alsnog ergens in de code de tweede regel plaatsten, mogelijk heb je het object niet eens nodig, bij de 1e wordt hij altijd aangemaakt, bij de tweede beslis je het zelf.
Aaaah kijk nu snap ik hem. Ik vond het al zo raar dat ie "soms wel soms niet" geinitialiseerd zou worden. Ik begrijp nu wat er bedoeld werd (ik denk dat ik in de mist ging bij de vreemde verwoording).
IceManX schreef op dinsdag 01 augustus 2006 @ 20:14:
[...]
VB6 is geen OOP taal, het ondersteunt ook geen OOP. Ja er zijn klassen, maar daar houdt het meteen mee op. Interfaces zijn er impliciet maar enige vorm van inheritance kun je vergeten.
Mja ben blij dat ik 4+ jaar geleden opgehouden ben met VB6. Moet zeggen dat je veel mooiere IT oplossing kan maken met een OOP taal (C# / Java, etc). Helaas moet het in VB6 though, anders had ik binnen C# een COM+ DLL gemaakt om deze te gebruiken binnen VB6 :).

Anyway iedereen hartelijk bedankt!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11:20
Verwijderd schreef op dinsdag 01 augustus 2006 @ 20:37:
Aaaah kijk nu snap ik hem. Ik vond het al zo raar dat ie "soms wel soms niet" geinitialiseerd zou worden. Ik begrijp nu wat er bedoeld werd (ik denk dat ik in de mist ging bij de vreemde verwoording).
Sterker nog, als je em weggooit ( Set Blaat = Nothing ) wordt er meteen weer een nieuwe aangemaakt

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.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
farlane schreef op woensdag 02 augustus 2006 @ 00:54:
[...]


Sterker nog, als je em weggooit ( Set Blaat = Nothing ) wordt er meteen weer een nieuwe aangemaakt
Euh, kun je dat ergens mee aantonen?
Holy crap! Ik heb echt ages met VB6 gewerkt... dit is nieuw voor me!
Visual Basic 6:
1
2
3
4
5
6
7
8
9
    Dim Bla As StdFont
    
    Set Bla = New StdFont
    
    Debug.Print Bla Is Nothing
    
    Set Bla = Nothing
    
    Debug.Print Bla Is Nothing

Geeft True, False


Visual Basic 6:
1
2
3
4
5
6
7
    Dim Bla As New StdFont
    
    Debug.Print Bla Is Nothing
    
    Set Bla = Nothing
    
    Debug.Print Bla Is Nothing

Geeft False, False

:D

[ Voor 46% gewijzigd door RobIII op 02-08-2006 01:06 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
farlane schreef op woensdag 02 augustus 2006 @ 00:54:
[...]

Sterker nog, als je em weggooit ( Set Blaat = Nothing ) wordt er meteen weer een nieuwe aangemaakt
Erm?! Hoe kan je dan fatsoenlijk objecten destroyen?? Wil dat zeggen dat je dan vanuit dit oogpunt NOOIT direct iets moet declareren en initializeren? Dit is echt zo fout :?
RobIII schreef op woensdag 02 augustus 2006 @ 01:03:
[...]
Holy crap! Ik heb echt ages met VB6 gewerkt... dit is nieuw voor me!
Hier ook even getest en dit is echt raar :o.

  • Boss
  • Registratie: September 1999
  • Laatst online: 19:31

Boss

+1 Overgewaardeerd

Dit is niet raar mensen. Dit is nou VB6, en volgens mij meer speciefiek een stukje memory management. En de reden dat er weinig echt serieuze zware applicaties in gemaakt zijn. :)

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 13:48

Robtimus

me Robtimus no like you

Verwijderd schreef op woensdag 02 augustus 2006 @ 08:06:
[...]

Erm?! Hoe kan je dan fatsoenlijk objecten destroyen??
Variabele out of scope laten gaan?
Het is idd geen nette oplossing vind ik, dus ik zal er in de toekomst eens wat beter naar kijken.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
IceManX schreef op woensdag 02 augustus 2006 @ 12:36:
[...]
Variabele out of scope laten gaan?
Het is idd geen nette oplossing vind ik, dus ik zal er in de toekomst eens wat beter naar kijken.
Mja het accent lag op netjes ;). Wordt een complex object dat uit de scope gaat ook fatsoenlijk opgeruimd? Zal wel niet zoals C++ werken dat wanneer je niets opruimt je applicatie het niet lang uithoud (en dus alles "ergens" rond zweeft in je geheugen) :P

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 13-02 20:06

Gerco

Professional Newbie

Verwijderd schreef op woensdag 02 augustus 2006 @ 13:22:
Wordt een complex object dat uit de scope gaat ook fatsoenlijk opgeruimd?
VB6 (COM eigenlijk) doet aan reference counting en als er geen references meer zijn naar een bepaald object, word het opgeruimd.

Dit systeem is overigens niet al te geavanceerd, met self-, circular- en weak-references gaat het de mist in. Weak references kan ik begrijpen, aangezien je al enorm moeilijk moet doen om er 1 te maken. Circular references zijn moeilijk te detecteren, maar dat zelfs een selfreference fout gaat vind ik vreemd. Meestal is dat niet erg omdat je er niet tegenaan loopt, maar het is dus weldegelijk mogelijk om een memory leak te maken in VB6:

Visual Basic 6:
1
2
3
4
5
6
7
MemoryLeak.cls:

Private m As MemoryLeak

Private Sub Class_Initialize:
  m = Me
End Sub


Overigens gelijk een "constructor" achtige demo, Class_Initialize is dus je "constructor". Deze heeft nooit parameters. Meestal zul je dus een init() achtige sub willen maken die je class initializeert. Of beter: Een factory gebruiken.

[ Voor 27% gewijzigd door Gerco op 02-08-2006 13:50 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11:20
Verwijderd schreef op woensdag 02 augustus 2006 @ 08:06:
Erm?! Hoe kan je dan fatsoenlijk objecten destroyen?? Wil dat zeggen dat je dan vanuit dit oogpunt NOOIT direct iets moet declareren en initializeren? Dit is echt zo fout :?
Door niet

code:
1
Dim Blaat as New BlaatClass


te schrijven maar

code:
1
2
3
4
Dim Blaat as BlaatClass
Set Blaat = new BlaatClass
....
Set Blaat =Nothing

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.

Pagina: 1