Newsgroup: it.comp.www.asp
Titolo: Dictionary object e problemi dalla 2.0 alla 3.0

Mi sono scritto un modulo per usare l'Hiermenus che trovate qui
http://www.webreference.com/dhtml/column50/
 (in realta', l'ho scritto
per una versione piu' vecchia che ho scaricato un sei mesi fa; non
sono aggiornato sulle ultime versioni).
In fondo vi posto il codice di tutto il modulo.
Io, purtroppo, sul mio portatile ho ASP 2.0, quindi non ho a
disposizione lo statement class.
Quindi, per modellare la struttura gerarchica del menu', uso una
struttura ad albero che usa dictionary objects (di dictionary objects,
di dictionary objects...)
Sul mio portatile, il modulo funziona bene, ma quando vado sul server
remoto (dove c'e' IIS5 e ASP 3.0), mi torna un sonoro messaggio
d'errore (che tra l'altro, a volte mi mostra, a volte no; e dopo
arrivo anche su questo).
Non ho trovato alcuna documentazione su come venga gestita uno
statement di questo tipo:
sub pippo( byRef objMainMenu )
  dim objSubMenu
  ....
  set objMainMenu( "subMenu" ) = objSubMenu
end sub
dove objSubMenu, a sua volta, e' un dictionary object che e' un menu'.
La set si fa una copia dell'intera struttura objSubMenu, oppure
"puntano" entrambi alla stessa struttura?
Nel secondo caso, quando esco dalla procedure pippo, objMainMenu(
"subMenu" ) continua a puntare al submenu' o la memoria occupata da
objSubMenu viene liberata?
Su ASP 2.0, se inserisco una "set objSubMenu = nothing" alla fine
della sub pippo, quando esco, objMainMenu( "subMenu" ) va a remengo,
se invece non faccio una "set objSubMenu = nothing", allora
objMainMenu( "subMenu" ) continua a puntare (?) al submenu anche
quando esco dalla procedura.
Onestamente, mi sembra un comportamente un po' sporco (evidentemente
ragiona per puntatori e non per copie e non fa la garbage collection
di objSubMenu quando esce dalla sub pippo).
Pero', visto che funziona cosi', io l'ho utilizzato sul mio portatile.
Pero', sul server, il modulo non funzia ed io ho la netta sensazione
che dipenda dal fatto che ASP 3.0 faccia garbage collection degli
oggetti dictionary all'uscita dalle procedure.
Vi torna?
Comunque, potrei tranquillamente farmi un po' di verifiche se solo
riuscissi a settare il server (dedicated hosting) in modo da spararmi
giu' l'html anche in caso di errore.
Immagino per motivi di sicurezza, quando provo a caricare la pagina,
mi scrive
"Impossibile visualizzare la pagina desiderata. Si è verificato un
problema."
Ma se guardo l'html mi scrive pochissime cose (nemmeno una
response.write aggiunta da me apposta prima della linea di errore).
Come faccio a settare il server per farmi visualizzare le pagine anche
in caso di errore???
Di seguito vi posto il codice del mio modulo: da' un errore (che
adesso non visualizza nemmeno piu') nella linea dopo quella che
contiene la parola myDebug (comunque e' l'errore del numero di
parametri sbagliato).
<%
'***********************************************
'***********************************************
sub objHierMenuItemNew( strName , byRef objHierMenuItem )
'***********************************************
'***********************************************
	set objHierMenuItem = server.createobject(
"scripting.dictionary" )
	objHierMenuItem( "strName" ) = strName
' nome univoco dell'item
	objHierMenuItem( "strLabel" ) = ""
	objHierMenuItem( "strUrl" ) = ""
' usare il path dalla root sse nel menu' a cui appartiene l'item viene
settato strPathToRoot
	objHierMenuItem( "objMenu" ) = ""
' diverso dalla stringa vuota sse l'item e' un submenu'
	'objHierMenuItem( "intMenuPosition" ) = 0
' posizione dell'item all'interno del menu'
end sub
'***********************************************
'***********************************************
sub objHierMenuItemClose( byRef objHierMenuItem )
'***********************************************
'***********************************************
	objHierMenuItem.removeAll
	set objHierMenuItem = nothing
end sub
'***********************************************
'***********************************************
sub objHierMenuItemAddLabel( strLabel , byRef objHierMenuItem )
'***********************************************
'***********************************************
	objHierMenuItem( "strLabel" ) = strLabel
end sub
'***********************************************
'***********************************************
sub objHierMenuItemAddUrl( strUrl , byRef objHierMenuItem )
'***********************************************
'***********************************************
	objHierMenuItem( "strUrl" ) = strUrl
end sub
'***********************************************
'***********************************************
sub objHierMenuItemAddMenu( objHierMenu , byRef objHierMenuItem )
'***********************************************
'***********************************************
mydebug "objHierMenuItemAddMenu",5,5,5,5,5
	set objHierMenuItem( "objMenu" ) = objHierMenu
end sub
'***********************************************
'***********************************************
function funObjHierMenuItem( strName , strLabel , strUrl )
'***********************************************
'***********************************************
	dim objHierMenuItem
	objHierMenuItemNew strName , objHierMenuItem
	objHierMenuItemAddLabel strLabel , objHierMenuItem
	objHierMenuItemAddUrl strUrl , objHierMenuItem
	set funObjHierMenuItem = objHierMenuItem
end function
'***********************************************
'***********************************************
function funObjHierMenuItemSubMenu( strName , strLabel , objHierMenu )
'***********************************************
'***********************************************
	dim objHierMenuItem
	objHierMenuItemNew strName , objHierMenuItem
	objHierMenuItemAddLabel strLabel , objHierMenuItem
	objHierMenuItemAddMenu objHierMenu , objHierMenuItem
	set funObjHierMenuItemSubMenu = objHierMenuItem
end function
'***********************************************
'***********************************************
function funBolObjHierMenuItemIsSubmenu( objHierMenuItem )
'***********************************************
'***********************************************
	funBolObjHierMenuItemIsSubmenu = isObject( objHierMenuItem(
"objMenu" ) )
end function
'***********************************************
'***********************************************
sub objHierMenuItemListNew( byRef objHierMenuItemList )
'***********************************************
'***********************************************
	set objHierMenuItemList = server.createobject(
"scripting.dictionary" )
end sub
'***********************************************
'***********************************************
sub objHierMenuItemListClose( byRef objHierMenuItemList )
'***********************************************
'***********************************************
	objHierMenuItemList.removeAll
	set objHierMenuItemList = nothing
end sub
'***********************************************
'***********************************************
sub objHierMenuItemListAddItem( objHierMenuItem , byRef
objHierMenuItemList )
'***********************************************
'***********************************************
	objHierMenuItemList.add objHierMenuItem( "strName" ) ,
objHierMenuItem
end sub
'***********************************************
'***********************************************
sub objHierMenuListNew( byRef objHierMenuList )	' lista di menu' che
viene gestita durante il drawing dell'hier menu': vengono aggiungi
hiermenu' mano a mano che si incontrano submenu, ne vengono rimossi,
mano a mano che vengono disegnati
'***********************************************
'***********************************************
	set objHierMenuList = server.createobject(
"scripting.dictionary" )
end sub
'***********************************************
'***********************************************
sub objHierMenuListClose( byRef objHierMenuList )
'***********************************************
'***********************************************
	objHierMenuList.removeAll
	set objHierMenuList = nothing
end sub
'***********************************************
'***********************************************
sub objHierMenuListAddMenu( objHierMenu , byRef objHierMenuList )
'***********************************************
'***********************************************
	objHierMenuList.add objHierMenu( "strName" ) , objHierMenu
end sub
'***********************************************
'***********************************************
sub objHierMenuListRemoveMenu( objHierMenu , byRef objHierMenuList )
'***********************************************
'***********************************************
	objHierMenuList.remove objHierMenu( "strName" )
end sub
'***********************************************
'***********************************************
sub objHierMenuNew( strName , byRef objHierMenu )
'***********************************************
'***********************************************
	dim objHierMenuItemList
	set objHierMenu = server.createobject( "scripting.dictionary"
)
	objHierMenu( "strName" ) = strName			' nome
univoco del menu
	objHierMenu( "strId" ) = ""
' identificatore usato per gli hier-menu
	objHierMenu( "intNumeroItems" ) = 0			'
numero items nel menu
	objHierMenu( "bolVisible" ) = true
	objHierMenu( "strPathToRoot" ) = ""			' se
non e' vuoto, i link degli item dei menu' vengono relativizzati alla
root; quando si fa il draw del menu', lo strPathRoot del menu'
principale viene propagato in tutti i sottomenu'
	objHierMenu( "intHorizontalSize" ) = 120
	objHierMenu( "strLeftPosition" ) = ""		' se non viene
settata ad un valore diverso da null, verra' agganciata al relativo
anchor nella menu bar
	objHierMenu( "strTopPosition" ) = ""		' se non viene
settata ad un valore diverso da null, verra' agganciata al relativo
anchor nella menu bar
	objHierMenuItemListNew objHierMenuItemList
	set objHierMenu( "objItemList" ) = objHierMenuItemList
	'set objHierMenu( "objItemList" ) = server.createobject(
"scripting.dictionary" )
'mydebug "yyyyyy",isObject( objHierMenu.item( "objItemList" )
),isObject( objHierMenu ),4,4,4
end sub
'***********************************************
'***********************************************
sub objHierMenuClose( byRef objHierMenu )
'***********************************************
'***********************************************
	objHierMenu.removeAll
	set objHierMenu = nothing
end sub
'***********************************************
'***********************************************
sub objHierMenuAddItem( byRef objHierMenuItem , byRef objHierMenu )
'***********************************************
'***********************************************
	objHierMenuItemListAddItem objHierMenuItem , objHierMenu(
"objItemList" )
end sub
'***********************************************
sub objHierMenuDrawScriptOpen()
'***********************************************
%>
	<SCRIPT LANGUAGE='JavaScript1.2'>
<%
end sub
'***********************************************
function funStrObjHierMenuLeftPosition( objHierMenu )
'***********************************************
	if objHierMenu( "strLeftPosition" ) = "" then
		' l'hier menu' deve essere agganciato alla menu bar
		funStrObjHierMenuLeftPosition =
"leftPosition(""anchorMenu" & objHierMenu( "strId" ) & """)"
	else
		' l'hier menu' deve essere visualizzato nella
posizione indicata
		funStrObjHierMenuLeftPosition = objHierMenu(
"strLeftPosition" )
	end if
end function
'***********************************************
function funStrObjHierMenuTopPosition( objHierMenu )
'***********************************************
	if objHierMenu( "strLeftPosition" ) = "" then
		' l'hier menu' deve essere agganciato alla menu bar
		funStrObjHierMenuTopPosition =
"topPosition(""anchorMenu" & objHierMenu( "strId" ) & """)"
	else
		' l'hier menu' deve essere visualizzato nella
posizione indicata
		funStrObjHierMenuTopPosition = objHierMenu(
"strTopPosition" )
	end if
end function
'***********************************************
function funBolHierMenuIsSubMenu( objHierMenu )
'***********************************************
	funBolHierMenuIsSubMenu = ( inStr( objHierMenu( "strId" ) ,
"_" ) > 0 )
end function
'***********************************************
function funStrObjHierMenuDrawArMenuAssignmentArrayConfiguration(
objHierMenu )
'***********************************************
	if funBolHierMenuIsSubMenu( objHierMenu ) then
		' il menu' attuale e' un submenu
funStrObjHierMenuDrawArMenuAssignmentArrayConfiguration = ""
	else
		' il menu' attuale non e' un submenu
funStrObjHierMenuDrawArMenuAssignmentArrayConfiguration = _
			objHierMenu( "intHorizontalSize" ) & "," & _
			funStrObjHierMenuLeftPosition( objHierMenu ) &
"," & _
			funStrObjHierMenuTopPosition( objHierMenu ) &
",'','','','','','',"
	end if
end function
'***********************************************
function funStrJavaScriptVoidSeCiVuole( objHierMenu , objHierMenuItem
)
'***********************************************
	if isObject( objHierMenuItem( "objMenu" ) ) then
		' the item is simply a title for a submenu and it
doesn't point to any page
		funStrJavaScriptVoidSeCiVuole = "'javascript:void(0)'"
	else
		' strUrl contiene l'indirizzo a cui punta l'item
		funStrJavaScriptVoidSeCiVuole = "'" & objHierMenu(
"strPathToRoot" ) & objHierMenuItem( "strUrl" ) & "'"
	end if
end function
'***********************************************
function funIntSubMenuFlag( objHierMenuItem )
'***********************************************
	if funBolObjHierMenuItemIsSubmenu( objHierMenuItem ) then
		' l'item e' un submenu
		funIntSubMenuFlag = 1
	else
		' l'item non e' un submenu
		funIntSubMenuFlag = 0
	end if
end function
'***********************************************
function funStrObjHierMenuDrawArMenuAssignmentArrayItemTriple(
strItemName , objHierMenu )
'***********************************************
	dim objHierMenuItem
	set objHierMenuItem = objHierMenu( "objItemList" )(
strItemName )
	funStrObjHierMenuDrawArMenuAssignmentArrayItemTriple = _
		"'" & objHierMenuItem( "strLabel" ) & "'," & _
		funStrJavaScriptVoidSeCiVuole( objHierMenu ,
objHierMenuItem ) & "," & _
		funIntSubMenuFlag( objHierMenuItem ) & ","
end function
'***********************************************
function funStrObjHierMenuDrawArMenuAssignmentArrayItemsTriples(
objHierMenu )
'***********************************************
	dim strItemName
	funStrObjHierMenuDrawArMenuAssignmentArrayItemsTriples = ""
	for each strItemName in objHierMenu( "objItemList" )
		funStrObjHierMenuDrawArMenuAssignmentArrayItemsTriples
= _
funStrObjHierMenuDrawArMenuAssignmentArrayItemsTriples & _
funStrObjHierMenuDrawArMenuAssignmentArrayItemTriple( strItemName ,
objHierMenu )
	next
	funStrObjHierMenuDrawArMenuAssignmentArrayItemsTriples =
cutFinal( funStrObjHierMenuDrawArMenuAssignmentArrayItemsTriples , ","
)
end function
'***********************************************
function funStrObjHierMenuDrawArMenuAssignmentArray( objHierMenu )
'***********************************************
	funStrObjHierMenuDrawArMenuAssignmentArray = _
funStrObjHierMenuDrawArMenuAssignmentArrayConfiguration( objHierMenu )
& _
funStrObjHierMenuDrawArMenuAssignmentArrayItemsTriples( objHierMenu )
end function
'***********************************************
sub objHierMenuDrawArMenuAssignment( objHierMenu )
'***********************************************
%>
	arMenu<%= objHierMenu( "strId" ) %> = new Array(<%=
funStrObjHierMenuDrawArMenuAssignmentArray( objHierMenu )%>)
<%
end sub
'***********************************************
sub objHierMenuDrawScriptClose()
'***********************************************
%>
	</SCRIPT>
<%
end sub
'***********************************************
sub objHierMenuSetIdsAndStrPathToRootRecursively( strCurrId ,
strPathToRoot , byRef objHierMenu )
'***********************************************
	dim intItemIndex , strItemName
	objHierMenu( "strId" ) = strCurrId
	objHierMenu( "strPathToRoot" ) = strPathToRoot
	intItemIndex = 0
'mydebug objHierMenu( "strName" ),"yeaaa",strCurrId,5,5,5
	for each strItemName in objHierMenu( "objItemList" ).keys
		intItemIndex = intItemIndex + 1
'mydebug strItemName , intItemIndex , objHierMenu( "objItemList" )(
strItemName )( "strLabel" ) ,4 ,4,4
		if funBolObjHierMenuItemIsSubmenu( objHierMenu(
"objItemList" )( strItemName ) ) then
			' l'item corrente e' un submenu'
			objHierMenuSetIdsAndStrPathToRootRecursively
strCurrId & "_" & ( intItemIndex ) , strPathToRoot , objHierMenu(
"objItemList" )( strItemName )( "objMenu" )
		end if
	next
end sub
'***********************************************
sub objHierMenuSetIdsAndStrPathToRoot( byRef objHierMenu )
'***********************************************
	dim strCurrId , strPathToRoot
	strCurrId = objHierMenu( "strId" )
	strPathToRoot = objHierMenu( "strPathToRoot" )
	objHierMenuSetIdsAndStrPathToRootRecursively strCurrId ,
strPathToRoot , objHierMenu
end sub
'***********************************************
sub objHierMenuDrawWithIdsDrawMenu( objHierMenu )
' visualizza l'array javascript del menu' corrente
'***********************************************
	objHierMenuDrawArMenuAssignment objHierMenu
end sub
'***********************************************
sub objHierMenuDrawWithIdsDrawSubMenus( objHierMenu )		'
visualizza gli array javascript degli eventuali sub menu'
'***********************************************
	dim strItemName
	for each strItemName in objHierMenu( "objItemList" )
		if funBolObjHierMenuItemIsSubmenu( objHierMenu(
"objItemList" )( strItemName ) ) then
			' l'item corrente e' un submenu'
			objHierMenuDrawWithIds objHierMenu(
"objItemList" )( strItemName )( "objMenu" )
		end if
	next
end sub
'***********************************************
sub objHierMenuDrawWithIds( objHierMenu )
'***********************************************
	objHierMenuDrawWithIdsDrawMenu objHierMenu
	objHierMenuDrawWithIdsDrawSubMenus objHierMenu
end sub
'***********************************************
'***********************************************
sub objHierMenuDraw( byRef objHierMenu )
'***********************************************
'***********************************************
	objHierMenuSetIdsAndStrPathToRoot objHierMenu
	objHierMenuDrawScriptOpen
	objHierMenuDrawWithIds objHierMenu
	objHierMenuDrawScriptClose
end sub
'***********************************************
'***********************************************
sub includeHierMenusTopPageJavascript( strPathToHierMenus ,
intSelectedMenu )
'***********************************************
'***********************************************
%>
	<SCRIPT LANGUAGE="JavaScript1.2" >
<!--#include file="browserDetection.js"-->
<!--#include file="menuProperties.js"-->
</script>
	<SCRIPT LANGUAGE='JavaScript1.2'
SRC='<%=strPathToHierMenus%>hierMenus.js'
TYPE='text/javascript'></SCRIPT>
	<SCRIPT LANGUAGE='JavaScript1.2'
SRC='<%=strPathToHierMenus%>utilityFunctions.js'
TYPE='text/javascript'></SCRIPT>
<%
	'beginNavBar strVisibleElements, strScriptElements
	'drawNavMenus strPathToHierMenus , intSelectedMenu ,
strVisibleElements , strScriptElements
	'endNavBar strVisibleElements, strScriptElements
end sub
%>
Glauco, Mantova
www.serate.it

Per una ben nota legge di Murphy, dopo che ho preparato sto messaggio
, lungo da insulti, mentre ancora stava partendo, ho riprovato il sito
remoto ed ha funzionato tutto (probabilmente non aveva beccato
l'upload con l'ultima modifica).
Per cui, il codice che vi ho postato funzia.
Rispetto a quello sbagliato ho corretto solo questa linea:
	objHierMenuItem( "objMenu" ) = objHierMenu
e' diventata
	set objHierMenuItem( "objMenu" ) = objHierMenu
Ed e' giusto che sia cosi', perche' sto assegnando un oggetto.
Pero', con ASP 2.0 funzionava comunque.
Secondo voi perche'?
Comunque, rimane la mia domanda principale:
come posso settare il server IIS5 + ASP 3.0 per farmi visualizzare la
pagina html prodotta fino al momento dell'errore?
Ciao!
Glauco, Mantova
www.serate.it


Moderatore di it.comp.www.asp
Sito di supporto: 
http://www.aspitalia.com/newsgroup/
La più grande community italiana di sviluppatori!