duda: discriminar instalaciones segun booleanos

Este sección contiene programas, extras, plugins, tutoriales y demas sobre Setup Factory.
Hola a todos:
Estoy volviendo a tocar el setup factory y tenia un ejercicio sin terminar sobre un pack de mapas que estoy haciendo en fase de pruebas.

Esto es lo que estoy haciendo:
1- crear un ini del estilo de numeros correlativos ( nota: Esto no lo voy a hacer asi sino por sqlite encriptado y desencriptado por otra aplicacion, este simula una base de datos imaginaria. Ahora estoy probando)
"[file01]
name01=dm-aim.zip
valueBool01=0
..."

2- Imaginate que un señor me dice que no quiere ver su contenido incluido en el pack, para ello en vez de desempaquetarlo, buscar el jodido mapa y quitarlo, lo que hago es coger la BBDD y meter un campo especial llamado "vAllowed" que no se hablará aqui, ya que lugar de una bd estoy usando un ini y su equivalente es el valor de tipo "valueBool0x" donde x es el numero correlativo de mapas incluidos en el pack.

Con esto tengo pensado lo siguiente:
-Crear un script donde detecte si el valor booleano ( en este caso los del tipo "valueBool01=0") lleva un 0 que significa que no se instalará y los que tengan valor 1 se instalaran en su destino usando la accion "inifile" hago una tabla a traves de las secciones, luego a traves de los valores ( nombres de mapas y sus valores booleanos)

-Crear una sentencia condicional de modo que si llevan el 1 se instala a la ruta prefijada en las "session variables" usando la accion file.copy. Si sale cero simplemente se ignora y no lo instala.

Pregunta: ¿Donde seria mas aconsejable poner los scripts juntos en "On preinstall" o dentro de la ventana "ready to install" en el evento "OnNext"? Alguien que sea experto en la materia me puede decir cual es la operacion mas idonea? Al principio pense en usar una ventana con las listas de casillas verificables pero abandone la idea ya que cualquiera puede escoger los mapas que el mapeador no quiere que se vea....Es un poco rebuscado pero no se. No encuentro otra manera que no sea desempaquetarlo todo otra vez

Saludetes!

Can you put an example .Suf ?

I will try to help you if you can even understand what you want to do in practice

Greetings

Hey Abood brother whats up? hahah ...sorry for the delay I was too busy lately!

I got the result I wanted to do so in short ( Im out of my sweet home I miss stay in a lot! grrr! ) surely tonight I will post the example just finished for a project I am doing long time ago. Is basically a simple operation: Get the values ( it can be booleans values or similar, the true project I cannot publish here cos its using sqlite3 with encryption -and desencryption from inside by using a script from the exe installer and isn't not 100% related to SUF at all, but well) from a ini file and then depending what values was given at the exe, this does make pre-sets preventing user to change the packages selection. Only you have to click on next and install etc etc..

Cya!

Hey Abood que pasa hermano? jeje...siento por el retraso estaba muy liado!

Ya tengo el resultado que queria asi que en breve ( estoy fuera de casa, echo de menos estar ahi! grrr!) Seguramente para esta noche postearé el ejemplo para un proyecto que estoy haciendo desde hace una pila de tiempo. Basicamente es una operacion simple: Obtener los valores ( pueden ser valores booleanos o similar, el proyecto real no lo puedo publicar porque esta usando sqlite3 con encriptacion y no esta 100% relacionado con SUF, pero bueno) desde un archivo ini y luego dependiendo de su valor dado por el exe, se hace una preconfiguracion que impide al usuario cambiar la seleccion de paquetes. Solo tienes que hacer click y instalar etc, etc...
Hombre, hay formas bastante rebuscadas de hacerlo. Hablo sin testearlo pero podría servir:
Para ambas formas:
  • Crear un Package por cada mapa a instalar
  • Poner todos los package en disable
Plan A y el más pesado del mundo mundial:
  • Crear una página de "Select packages"
  • Poner en el Preload el script para que saque los mapas que no están permitidos de la base de datos y modifique en la página las opciones "DlgSelectPackages.SetCategoryProperties(CTRL_SELECT_PACKAGE_TREE, CTRL_CATEGORY_00X, {State=CB_UNCHECKED, Enabled=false, Description="Instalación no permitida"});"
Creo que esto permitiría cambiar los que están permitidos, y los que no están permitidos aparecerían como desactivados, deshabilitados y con el texto de "Instalación no permitida".

Plan B y menos pesado:
  • Poner el script de recuperación en el On Startup con un progreso o mensaje.
  • Recorrer la base de datos buscando los que son instalables y activándolos con "SetupData.SetPackageProperties("paquete", {Install=true});"
Este segundo es menos pesado, porque al fin y al cabo si llamas a los mapas paquete1, paquete2... puedes hacer un loop con for y son muchas menos líneas de programación que el otro.

Mi recomendación de hacerlo en el On Startup es más que nada porque así el instalador tiene los paquetes a instalar desde el principio, y así si pones para que se seleccione la carpeta de instalación te sale el tamaño que ocupa. Además de que al ir a instalarlo te diría si te entra en el disco duro.
Si lo pones en On Install o en Ready to Install creo que el tamaño de los paquetes sería 0 y es posible que aunque no te entre no te avise.

Un saludo!!

Bueno lo prometido es deuda jejeje, Dani, si, tambien se puede hacer asi lo he probado pero tambien se puede poner en on preload ( si no son base de datos mas pequeños o pocos archivos, sino iria donde tu has indicado).

Abood este es el ejemplo que hice finalmente, es un zip con el archivo *.suf, un archivo ini y una carpetita de unas 6 fotos ( esta carpeta debes de ponerlo en c:\ para que puedas ver el proyecto como funciona), el ini en tu escritorio ( o donde lo veas mmejor pero acuerdese de editar el proyecto).

enlace a virustotal:

https://www.virustotal.com/es/file/9429 ... 405621333/

Enlace desde mega:

HIDE: ON
Hidebb Message Hidden Description


Aconsejo si vais a usar sqlite3 encriptarlo de alguna manera es cuestion de buscar algun soft en internet, comprar vale mucho asi que es cosa vuestra. Asi desde dentro del exe instalador desencripta la bbdd para evitar miradas curiosas.

Chao!

Hola:
He perfeccionado el codigo un poco ya que tenia un error tonto:
-- obtengo una lista en formato tabla virtual de los nombres de paquetes ( ojo los nombres de paquetes se refieren a la casilla Package ID no al
--DisplayName que es el texto con el que se da a presentar al usuario...
tPackageList = SetupData.GetPackageList();

	--Para comprobar los datos que coincidan con el package ID, he usado el truco de poner los nombres reales de los archivos a instalar
	--con las que vienen en el archivo ini ( o base de datos sqlite si es el caso, aqui solo usamos el ini para verlo mejor). Obtengo otra tabla con 
	--los nombres de secciones ( aqui solo hay uno, lo veo mas sencillo) y ahi los valores
	RutaEscritorio = SessionVar.Expand("%DesktopFolder%");

	all_sections = INIFile.GetSectionNames(RutaEscritorio.."\\CONFIG.ini");

	-- Compruebo que no haya errores....
	error = Application.GetLastError();
		--Si salta algun error se publica en mensaje...
		if (error ~= 0) then
    	Dialog.Message("Error", _tblErrorMessages[error], MB_OK, MB_ICONEXCLAMATION);
		else
    				
    		--si no da error de inexistencia de secciones en el archivo ini, sigo adelante
    		if (all_sections ~= nil) then
    	    	    	
    	    	--declaro en primer lugar las variables strings que se usaran para recoger los datos del ini y poder usarlo en cualquier
    	    	--parte para su llamada cuando sea necesario.
    	    	local value_data = "";
				local value_boolean = "";
				--hago un loop de los 6 items ( 6 archivos en este caso)
				for x=1, 6 do
    			   		value_data = INIFile.GetValue(RutaEscritorio.."\\CONFIG.ini", "TableConfig", "name"..x);
						value_boolean = INIFile.GetValue(RutaEscritorio.."\\CONFIG.ini", "TableConfig", "valueBool"..x);
		
					--si hay packages disponibles en el instalador sigo adelante...	
					if tPackageList then 
    					
    					--hago un loop para buscar los nombres de los paquetes
    					for nIndex, sName in pairs(tPackageList) do
        					
        					--si no hay datos del ini vacios....															
							if value_data ~= ""  and  value_boolean ~= "" then
						
							--En mi caso para mas facilidad de trabajo los booleanos los puse en 0 Y 1, primero
							--los paso de string a numeros porque los valores que me dan "value_boolean" son de tipo string
							--asi que los paso a numeros y por otro lado el valor "value_data" que son strings tambien los comparo sin mayusculas ni nada 
							--con las de la tabla de los paquetes.
							NumVal = String.ToNumber(value_boolean);
							identify = String.CompareNoCase(sName, value_data);
				
									if identify == 0 then					
										if NumVal == 1 then--Que da valor 1 ( verdadero)? pues se deja como instalable
										SetupData.SetPackageProperties(sName, {Install=true});
										SetupData.SetPackageProperties(sName, {Enabled=true});
										DlgSelectPackages.SetCategoryProperties(CTRL_SELECT_PACKAGE_TREE_01, CTRL_CATEGORY_001, {Enabled=true});
										else--Que da valor 0 (falso)? pues se deja como  no instalable
										SetupData.SetPackageProperties(sName, {Install=false});
										SetupData.SetPackageProperties(sName, {Enabled=false});
										DlgSelectPackages.SetCategoryProperties(CTRL_SELECT_PACKAGE_TREE_01, CTRL_CATEGORY_001, {Enabled=false});
										end
										DlgSelectPackages.UpdateDisplay(CTRL_SELECT_PACKAGE_TREE_01);
									end

							end
						end
					else 
					--Esto es opcional y un poco tonto pero lo pongo....
					Dialog.Message("Notice", "Pajaro no veo ningun paquete a instalar.", MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);					
					end
				end

       		  end

		end
		--Si no hay secciones en el archivo ini pues doy aviso y se cierra la aplicacion
		if (all_sections == nil) then
        Dialog.TimedMessage("Please Wait...", "No se ha encontrado esta entrada en ninguna parte del Ini", 2000, MB_ICONINFORMATION);
		Application.Exit(0);        
        end
Esto en on preload o on startup
Saludetes
graças
yead yead
Gracias :D :lol: :friends: