Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    OPTIONS: argomenti opzionali per sub e funzioni e altri usi

    ho scritto, per una classe che pubblico in giornata, tre funzioni utili per vari utilizzi

    uno di questi è raggruppare argomenti in un'unica stringa per far si di avere un argomento di una funzione che possa avere più valori e quindi anche valori opzionali
    (purtroppo l'overload in ASP è fantascienza)

    vediamo un esempio pratico

    codice:
    <%
    '/***********************************************************************************/
    	
    	function parseOption(byval columnoptions, columnoption)
    		dim reg
    		Set Reg = New RegExp 	
    		Reg.Global = True
    		Reg.Ignorecase = True
    		
    		dim Matches,return,value
    		return = ""
    		
    		Reg.pattern = ":" & "(" & columnoption & ")[ ]*=[ ]*((?:,(?![ ]*:" & ")|[^,])+)"
    		if reg.test(columnoptions) then
    			set Matches = reg.Execute(columnoptions)
    			value = trim(Matches(0).submatches(1))
    			if isnumeric(value) then value = clng(value)
    			if value = "true" then value = true
    			if value = "false" then value = false
    			return = value
    		end if
    		
    		parseOption = return
    	
    	end function
    	
    	function parseOptions(byval columnoptions)
    		dim reg
    		Set Reg = New RegExp 	
    		Reg.Global = True
    		Reg.Ignorecase = True
    		
    		dim Matches,match,return,value
    		set return = CreateObject("Scripting.Dictionary")
    		return.CompareMode = 1
    		
    		Reg.pattern = ":" & "([a-z0-9_-]+)[ ]*=[ ]*((?:,(?![ ]*:" & ")|[^,])+)"
    		if reg.test(columnoptions) then
    			
    			set Matches = reg.Execute(columnoptions)
    			for each match in matches
    				value = trim(match.submatches(1))
    				if isnumeric(value) then value = clng(value)
    				if value = "true" then value = true
    				if value = "false" then value = false
    				return(trim(match.submatches(0))) = value
    			next
    		end if
    		
    		set parseOptions = return
    	
    	end function
    	
    	'value = a, values = "|a|b|c|d|" => true
    	function inValue(value,values)
    		inValue = false
    		if instr(values,"|" & value & "|") > 0 then inValue = true
    	end function
    	
    	'/***********************************************************************************/
    	
    	'ESEMPIO
    	
    	dim a, aa, b, options
    	options = ":test=ciao,:numero=52,:booleana=false"
    	response.write "opzioni: """ & options & """
    
    "
    	set aa = parseOptions(options)
    	b = parseOption(options,"test")
    	for each a in aa
    		response.write "" & a & " vale " & aa(a) & "
    "
    	next
    	response.write "b (che cerca 'test') vale " & b & "
    
    "
    	
    	response.write "test è uno di questi valori ""a,b,c"" : " & inValue(aa("test"),"|a|b|c|") & "
    "
    	response.write "test è uno di questi valori ""ciao,sono,test"" : " & inValue(aa("test"),"|ciao|sono|test|")
    %>
    l'output a schermo è

    codice:
    opzioni: ":test=ciao,:numero=52,:booleana=false"
    
    test vale ciao
    numero vale 52
    booleana vale Falso
    b (che cerca 'test') vale ciao
    
    test è uno di questi valori "a,b,c" : Falso
    test è uno di questi valori "ciao,sono,test" : Vero
    in pratica prende i valori e li mette in un dictionary.
    se il campo cercato non esiste penso restituisce "" o null, cmq con un trim(value&"") siete sicuri che il risultato se vuoto sia sempre ""

    io nelle funzioni lo uso così

    codice:
    function miafunc(argomento1, options)
    
    	dim ioptions
    	set ioptions = parseOptions(options)
    	
    	'a questo punto dentro ioptions ho disponibili tutti i valori passati
    	'secondo la sintassi ":nome=valore,:nome2=valore2"
    	'per accedere al valore di nome scrivo semplicemente
    	response.write ioptions("nome")
    
    end function
    può venire utile anche in altri casi
    ovviamente solo se in diversi casi passate diversi valori e non volete scrivere funzioni differenti o argomenti flag

    se avete commenti sono qui
    (ho diviso le stringhe del pattern nello script perché vbullettin ci metteva dei simpatici ma poco funzionali smiles)
    cià
    san imente saluta

    * http://simonecingano.it *

  2. #2
    non per rompere le scatole, ma usare un array per passare i valori opzionali?

    cmq si che palle l'asp..w l'OOP!
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  3. #3
    Originariamente inviato da Santino83_02
    non per rompere le scatole, ma usare un array per passare i valori opzionali?

    cmq si che palle l'asp..w l'OOP!
    certamente, è una strada altrettanto buona

    questa OPTIONS io l'ho presa solo per esigenze di semplicità e compatibilità con eventuali file esterni

    l'ho pubblicata perché magari in altri casi può venire utile a qualcuno

    peraltro l'utilizzo di un array blocca a un dato valore / posizione il recupero dei dati
    questo invece è assolutamente elastico

    (si ok, so già che rispondi che con UBOUND si verifica quanti ce ne sono, ma sulla posizione niente da dire.. tiè )
    san imente saluta

    * http://simonecingano.it *

  4. #4
    touchè
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  5. #5
    Originariamente inviato da Santino83_02
    touchè
    per un momento, letta la riga di "critica", ho vacillato chiedendomi se sono completamente fuso oppure se aveva un senso aver fatto 'ste funzioni ghghgh
    san imente saluta

    * http://simonecingano.it *

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.