Avatar billede jaws Nybegynder
17. januar 2003 - 11:09 Der er 3 kommentarer og
1 løsning

Initialisere vars i klasse med empty eller null værdier ???

Jeg har et problem:

Jeg har oprettet en class der indeholder oplysninger omkring f.eks. en bruger:

### class: UserClass ####
public intParentID as Integer
public strName as String
public blnIsActive as Boolean

Denne klasse overføres så til en funktion som parameter:

public function NewUser(byval vUserClass as UserClass)
    'insert into db, blabla
end function

Men mit problem er at jeg har ingen mulighed for at se hvilke variabler i UserClass der er blevet udfyldt og hvilke der ikke er.

A string is by default initialized as an empty string, an integer=0 and a boolean=false.

Er der en måde, hvorpå jeg kan tildele variabler der IKKE er udfyldt, med enten "empty" eller "null" værdier?

På denne måde kan jeg bruge IsEmpty() eller IsNull() til at vide hvilke værdier jeg skal tage hånd om.

Ser frem til nogle gode ideer:)
Avatar billede clausph Nybegynder
17. januar 2003 - 11:36 #1
Du kan bruge properties istedet for public-variable, så ved du med sikkerhed hvornår data bliver læst skrevet.
Dit eget script bliver lidt mere kompliceret, men du får lige pludselig kontrol over hvad der sker:

Option Explicit

'Interne hjælpevariable:
' m_ indeholder værdien
'¨b_ Er True, hvis der er skrevet til variablen

Private m_intParentID As Integer
Private b_intParentID As Boolean

Private m_strName      As String
Private b_strName    As Boolean

Private m_blnIsActive As Boolean
Private b_blnIsActive As Boolean

Public Property Get intParentID() As Integer
    ' Kaldes når variablen aflæses udefra
    intParentID = m_intParentID
End Property
Public Property Let intParentID(vData As Integer)
    ' Kaldes når vairablen tildeles udefra
    m_intParentID = vData
    b_intParentID = True
End Property

Public Property Get strName() As String
    strName = m_strName
End Property
Public Property Let strName(vData As String)
    m_strName = vData
    b_strName = True
End Property

Public Property Get blnIsActive() As Boolean
    blnIsActive = m_blnIsActive
End Property
Public Property Let blnIsActive(vData As Boolean)
    m_blnIsActive = vData
    b_blnIsActive = True
End Property

Private Sub Class_Initialize()
    ' Denne kaldes når klassen oprettes (instantieres)
    ' Her kan data initialiseres
    ' OBS! Følgende faktisk er overflødig - det er VB's standardværdier
    m_intParentID = 0
    b_intParentID = False

    m_strName = ""
    b_strName = False

    m_blnIsActive = False
    b_blnIsActive = False
End Sub

Public Sub VisUdfyldteVariable()
    If b_intParentID Then Debug.Print "intParentID=" & m_intParentID
    If b_strName Then Debug.Print "strName=" & m_strName
    If b_blnIsActive Then Debug.Print "blnIsActive=" & m_blnIsActive
End Sub

-- 0 --

Udadtil (dvs. i de programdele, der anvender klassen), vil det se ud på samme måde som før!

Håber det var det du havde brug for.

/Claus
Avatar billede clausph Nybegynder
17. januar 2003 - 11:38 #2
Sorry - mit indlæg skulle selvfølgelig være lagt ind som svar (undskyld)
/Claus
Avatar billede jaws Nybegynder
17. januar 2003 - 11:47 #3
Ja, jeg har selv overvejet løsningen, men gik hurtigt væk fra den igen da jeg syntes det er et stort nummer at gøre ud af det og tænkte at der må findes en nemmere løsning. En lidt bøvlet løsning syntes jeg...

Er det meningen at jeg skal bruge VisUdfyldteVariable() til at se hvilke variabler der er udfyldt?

Jeg kan selvfølgelig alternativt oprette public boolean properties svarende til mine variabler, der hver fortæller om variablen er udfyldt - men stadig en besværlig løsning på problemet.

Kan det virkelig ikke lade sig gøre at sætte empty eller null værdier? Det ville lette det hele, en helt del...
Avatar billede clausph Nybegynder
17. januar 2003 - 12:06 #4
VisUdfyldteVariable() er blot en demonstration - du skal selvfølgelig lave en passende Sub eller Function til dit eget brug.

Jeg ved godt at det er besværligt at bruge properties, men det er ofte besværet værd - der er ikke rigtigt andre måder at gøre det på. Der er dog hjælp at hente - der følger en udmærket Wizard med (der også kan bruges for allerede oprettede klasser), den kan aktiveres ved at add'e et klassemodul (altså lade som om man vil oprette en ny) og vælge "VB Class Builder". Koden er lidt omfattende, men den er der, uden at man selv skal gøre noget.

Der er dog et muligt alternativ, HVIS du har nogle værdier som du VED aldrig forekommer i praksis - du kan så blot initialisere dine variable med disse værdier i  Class_Initialize og så blot teste på denne værdi senere, altså:

Private Sub Class_Initialize()
    intParentID = -1
    strName = "Denne er tom"
    blnIsActive = False
End Sub
- dette virker dog ikke for blnIsActive!

/Claus
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester