Brug af klasser (hvad er der galt her?)
HejsaJeg har for første gang forsøgt at anvende klaser i VBScript, og ummidelbart er det jo ligetil. MEN...Der er jo altid et men. Jeg er stødt lidt på grund her. Jeg forsøger at give et heltal som parameter et sted hvor jeg mener det bør være et heltal, men får en fejlmeddelelse om at der mangler et objekt...
Jeg har lavet et par klasser: en simpel liste (IndexedList) og en Config klasse. I koden laver jeg et objekt af typen IndexedList som jeg senere populerer med Configobjekter som er oprettet ud fra data fra en DB. For at teste at det hele er gået godt forsøger jeg så at udskrive indholdet af listeobjektet ved hjælp af Configs accessormetoder. På et tidspunkt går det dog galt, og jeg får denne meddelelse:
Der opstod en Microsoft VBScript-kørselsfejl fejl ´800a01a8´
Et objekt er obligatorisk: ´rgList(...)´
/includes/classes.asp, linje 147
Det der refereres til er koden til IndexedList. Mere specifikt følgende linier:
public function getElement(iIndex)
set getElement = rgList(iIndex)
end function
Her forsøger jeg at tilgå et objekt gemt i rgList, som er et normalt array. Betyder fejlmeddelelsen at indholdet af rgList(iIndex) ikke er et objekt, eller betyder den at den vil have et objekt i stedet for iIndex som er et heltal? Eller er der noget helt andet galt?
Jeg har inkluderet nogle uddrag af koden som måske kan være behjælpelige til at give et bedre overblik over situationen.
På forhånd tak for hjælpen
Michael Ingeman
set objConfigList = new IndexedList
*** Der hentes nogle data fra DB og gem dem i resultsettet rsOps. ***
´ opret og populer objekterne
if not rsOps.EOF then
dim objConfig
set objConfig = new Config
while not rsOps.EOF
´ Initier objektet. Det samme objekt genbruges for at undgå et overhead
´ i forbindelse med oprettelse af objekter.
call objConfig.setID(rsOps(\"Op_OpsaetningID\"))
call objConfig.setName(rsOps(\"Op_Navn\"))
call objConfig.setSuperGroup(rsOps(\"Op_Niv1\"), rsOps(\"Op_Niv2\"), rsOps(\"Op_Niv3\"))
´ Gem opsætningen og inkrementer counteren.
call objConfigList.addElement(objConfig)
´ Gå videre til næste tuple.
rsOps.moveNext
wend
´ Da alle data er kopieret lukkes resultsettet og det midlertidige
´ Config objekt fjernes
rsOps.close
set objConfig = nothing
end if
´ udskriv indholdet af objekterne
dim objTemp, i
trace(\"\")
trace(\"Listing configurations\")
for i = 0 to objConfigList.getLastIndex()
objTemp = objConfigList.getElement(i)
trace(\"Name : \" & objTemp.getName())
trace(\"ID : \" & objTemp.getID())
trace(\"Supergroup : \" & objTemp.getSuperGroup())
trace(\"\")
next
end if
**************
´ klassedefinitioner
class IndexedList
private rgList()
private iMaxIndex
private function Class_Init()
iMaxIndex = -1
end function
public function addElement(objNewElement)
iMaxindex = iMaxIndex + 1
reDim preserve rgList(iMaxIndex)
set rgList(iMaxIndex) = objNewElement
end function
public function getElement(iIndex)
set getElement = rgList(iIndex)
end function
end class
Class Config
private strID
private strName
private strSuperGroupID
public function getID()
getID = strID
end function
public function getName()
getName = strName
end function
public function getSuperGroup()
getSuperGroup = strSuperGroupID
end function
public function setID(strTmpID)
strID = strTmpID
end function
public function setName(strTmpName)
strName = strTmpName
end function
public function setSuperGroup(strNiv1ID, strNiv2ID, strNiv3ID)
´ Her gennemgås ID´erne i omvendt rækkefølge, altså niv3, niv2, niv1.
´ Hvis
if isNull(strNiv3ID) then
if isNull(strNiv2ID) then
if isNull(strNiv1ID) then
Trace(\"Error: Configuration without a supergroup!!\")
else
setSuperGroup = strNiv1ID
end if
else
setSuperGroup = strNiv2ID
end if
else
setSuperGroup = strNiv3ID
end if
end function
end class
