ayuda al llamar nueva ventana

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
Avatar de Usuario
yasmany
Hacker del Foro
Mensajes: 249
Registrado: 06 Sep 2011, 21:30

ayuda al llamar nueva ventana

Mensaje por yasmany »

Hola a todos QUISIERA saber q error tengo al llamar una nueva ventana QUISIERA Q ALGUIEN ME HICIERA ENTENDER por q estoy mal y de pasito me ayuden un chance
este es mi code
al presionar el boton con la letra C bota una ventana pero cuando la cierro la ventana anterior se queda inactiva ....como lo soluciono

Código: Seleccionar todo

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=icoyas.ico
#AutoIt3Wrapper_Outfile=File_in_Jpg.exe
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseUpx=y
#AutoIt3Wrapper_Res_Comment=Software gratuito Yasmany Curimilma
#AutoIt3Wrapper_Res_Description=Oculta archivos tras una imagen
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#[email protected]
#AutoIt3Wrapper_Res_Language=1034
#AutoIt3Wrapper_Run_Obfuscator=y
#Obfuscator_Parameters=/striponly
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
FileInstall(".\fndyas.jpg", @TempDir & "\")
$gui = GUICreate("File in Jpg", 450, 250, -1, -1)
GUISetBkColor((0xfffffff))
$img = GUICtrlCreatePic(@TempDir & "\fndyas.jpg", -1, -1, 452, 40)
$lblNota = GUICtrlCreateLabel("Permite copiar archivos comprimidos u otros dentro de una imagen JPG, para abrir el archivo copiado dentro de la imagen se debe cambiar la extensión de la imagen por la del archivo", 10, 40, 460, 25)
GUICtrlSetColor(-1, 0x666666)
$txtRar = GUICtrlCreateInput("", 100, 83, 280, 22)
$txtJpg = GUICtrlCreateInput("", 100, 120, 280, 22)
$btnRar = GUICtrlCreateButton("FILE", 390, 80, 35, 25)
GUICtrlCreateLabel("Archivo", 40, 80, 60, 22)
GUICtrlCreateLabel("Imagen", 40, 120, 60, 22)
GUICtrlCreateLabel("Nombre de salida", 40, 150, 50, 35)
$btnJpg = GUICtrlCreateButton("JPG", 390, 118, 35, 25)
$btnCon = GUICtrlCreateButton("C", 425, 118, 20, 25)

$txtNameFinal = GUICtrlCreateInput("", 100, 150, 320, 22)
$lblDireccion = GUICtrlCreateLabel("", 150, 150, 225, 25)
$btnIniciar = GUICtrlCreateButton("Iniciar", 220, 175, 80, 35)
$lblNota = GUICtrlCreateLabel("Programacion realizada en Autoit en combinacion con CMD.exe. By ymct1991", 10, 220, 460, 25)
GUICtrlSetColor(-1, 0x666666)
GUICtrlSetState($btnRar, $GUI_FOCUS)
GUISetState(@SW_SHOW)
While 1
	$sMsg = GUIGetMsg()
	Switch $sMsg

		Case $GUI_EVENT_CLOSE
			FileDelete(@TempDir & "\fndyas.jpg")
			Exit
		Case $btnIniciar
			$texto = GUICtrlRead($txtRar)
			$texto2 = GUICtrlRead($txtJpg)
			$texto3 = GUICtrlRead($txtNameFinal)

			if ($texto == "") Then
				MsgBox(64, "Aviso", "File sin especificar")
			ElseIf Not FileExists($texto) Then
				MsgBox(64, "Aviso", "FILE no disponible")

			ElseIf ($texto2 == "") Then
				MsgBox(64, "Aviso", "JPG sin especificar")
			ElseIf Not FileExists($texto2) Then
				MsgBox(64, "Aviso", "La imagen no existe")
			ElseIf ($texto3 == "") Then
				MsgBox(64, "Aviso", "Campo de Nombre final vacio")
			Else

;~ 			FileWrite("d:\archivo.txt", $texto & $texto2)

        
			EndIf
			If FileExists($texto3 & ".jpg") Then
				MsgBox(64, "Aviso", "Listo....imagen creada en el Escritorio")
				GUICtrlSetData($txtJpg, "")
				GUICtrlSetData($txtRar, "")
				GUICtrlSetData($txtNameFinal, "")
			Else
				MsgBox(48, "Aviso", "Error no se pudo crear la imagen..verifique q tenga los permisos necesarios")
			EndIf

		Case $btnJpg

			$message = "Seleccione el archivo comprimido"

;~ 			$var = FileOpenDialog($message, @WindowsDir & "\", "Images (*.jpg;*.bmp)", 1 + 4); para escoger multiples archivos
			$var = FileOpenDialog($message, @DesktopDir & "\", "Images (*.jpg)")

			If @error Then
				MsgBox(4096, "", "No seleccionó ningun archivo")
			Else
;~ 				$var = StringReplace($var, "|", @CRLF)
;~ 				MsgBox(4096, "", "Usted escogió " & $var)
				GUICtrlSetData($txtJpg, $var)
				GUICtrlSetState($txtNameFinal, $GUI_FOCUS)
			EndIf


		Case $btnRar
			$message = "Seleccione el archivo comprimido"
;~ 			$var = FileOpenDialog($message, @WindowsDir & "\", "Images (*.jpg;*.bmp)", 1 + 4); para escoger multiples archivos
			$var = FileOpenDialog($message, @DesktopDir & "\", "Images (*.RAR;*.zip;*.txt;*.docx)")

			If @error Then
				MsgBox(4096, "", "No seleccionó ningun archivo")
			Else
;~ 				$var = StringReplace($var, "|", @CRLF)
;~ 				MsgBox(4096, "", "Usted escogió " & $var)
				GUICtrlSetData($txtRar, $var)
				GUICtrlSetState($btnJpg, $GUI_FOCUS)
			EndIf
		Case $txtNameFinal
			GUICtrlSetState($btnIniciar, $GUI_FOCUS)
		Case $btnCon
			otra($gui)
	EndSwitch

WEnd

Func otra($WinH)
	GUISetState(@SW_DISABLE, $WinH)
	$seg = GUICreate("Cambiar de extension", 450, 200, -1, -1)

	GUISetState(@SW_SHOW, $seg)
	While 1
		$sMsg = GUIGetMsg()
		Switch $sMsg
			Case $GUI_EVENT_CLOSE
				$nMsg = $GUI_EVENT_CLOSE
				GUISetState(@SW_ENABLE, $WinH)
				GUISetState(@SW_ENABLE, $gui)
				GUIDelete($seg)
		EndSwitch

	WEnd
EndFunc   ;==>otra

DESDE YA MUCHAS GRACIAS
Obra de modo que merezcas a tu propio juicio y a juicio de los demás la eternidad, que te hagas insustituible que no merezcas morir.
https://www.facebook.com/yasmanycurimilma
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: ayuda al llamar nueva ventana

Mensaje por arkcrew »

Hola Yasmany

Creo que tengo la solución:

Código: Seleccionar todo

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #NoTrayIcon
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Icon=icoyas.ico
    #AutoIt3Wrapper_Outfile=File_in_Jpg.exe
    #AutoIt3Wrapper_Compression=4
    #AutoIt3Wrapper_UseUpx=y
    #AutoIt3Wrapper_Res_Comment=Software gratuito Yasmany Curimilma
    #AutoIt3Wrapper_Res_Description=Oculta archivos tras una imagen
    #AutoIt3Wrapper_Res_Fileversion=1.0.0.0
    #[email protected]
    #AutoIt3Wrapper_Res_Language=1034
    #AutoIt3Wrapper_Run_Obfuscator=y
    #Obfuscator_Parameters=/striponly
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    FileInstall(".\fndyas.jpg", @TempDir & "\")

	gui1()
	func gui1()
    $gui = GUICreate("File in Jpg", 450, 250, -1, -1)
    GUISetBkColor((0xfffffff))
    $img = GUICtrlCreatePic(@TempDir & "\fndyas.jpg", -1, -1, 452, 40)
    $lblNota = GUICtrlCreateLabel("Permite copiar archivos comprimidos u otros dentro de una imagen JPG, para abrir el archivo copiado dentro de la imagen se debe cambiar la extensión de la imagen por la del archivo", 10, 40, 460, 25)
    GUICtrlSetColor(-1, 0x666666)
    $txtRar = GUICtrlCreateInput("", 100, 83, 280, 22)
    $txtJpg = GUICtrlCreateInput("", 100, 120, 280, 22)
    $btnRar = GUICtrlCreateButton("FILE", 390, 80, 35, 25)
    GUICtrlCreateLabel("Archivo", 40, 80, 60, 22)
    GUICtrlCreateLabel("Imagen", 40, 120, 60, 22)
    GUICtrlCreateLabel("Nombre de salida", 40, 150, 50, 35)
    $btnJpg = GUICtrlCreateButton("JPG", 390, 118, 35, 25)
    $btnCon = GUICtrlCreateButton("C", 425, 118, 20, 25)

    $txtNameFinal = GUICtrlCreateInput("", 100, 150, 320, 22)
    $lblDireccion = GUICtrlCreateLabel("", 150, 150, 225, 25)
    $btnIniciar = GUICtrlCreateButton("Iniciar", 220, 175, 80, 35)
    $lblNota = GUICtrlCreateLabel("Programacion realizada en Autoit en combinacion con CMD.exe. By ymct1991", 10, 220, 460, 25)
    GUICtrlSetColor(-1, 0x666666)
    GUICtrlSetState($btnRar, $GUI_FOCUS)
    GUISetState(@SW_SHOW)
    While 1
       $sMsg = GUIGetMsg()
       Switch $sMsg

          Case $GUI_EVENT_CLOSE
             FileDelete(@TempDir & "\fndyas.jpg")
             Exit
          Case $btnIniciar
             $texto = GUICtrlRead($txtRar)
             $texto2 = GUICtrlRead($txtJpg)
             $texto3 = GUICtrlRead($txtNameFinal)

             if ($texto == "") Then
                MsgBox(64, "Aviso", "File sin especificar")
             ElseIf Not FileExists($texto) Then
                MsgBox(64, "Aviso", "FILE no disponible")

             ElseIf ($texto2 == "") Then
                MsgBox(64, "Aviso", "JPG sin especificar")
             ElseIf Not FileExists($texto2) Then
                MsgBox(64, "Aviso", "La imagen no existe")
             ElseIf ($texto3 == "") Then
                MsgBox(64, "Aviso", "Campo de Nombre final vacio")
             Else

    ;~          FileWrite("d:\archivo.txt", $texto & $texto2)


             EndIf
             If FileExists($texto3 & ".jpg") Then
                MsgBox(64, "Aviso", "Listo....imagen creada en el Escritorio")
                GUICtrlSetData($txtJpg, "")
                GUICtrlSetData($txtRar, "")
                GUICtrlSetData($txtNameFinal, "")
             Else
                MsgBox(48, "Aviso", "Error no se pudo crear la imagen..verifique q tenga los permisos necesarios")
             EndIf

          Case $btnJpg

             $message = "Seleccione el archivo comprimido"

    ;~          $var = FileOpenDialog($message, @WindowsDir & "\", "Images (*.jpg;*.bmp)", 1 + 4); para escoger multiples archivos
             $var = FileOpenDialog($message, @DesktopDir & "\", "Images (*.jpg)")

             If @error Then
                MsgBox(4096, "", "No seleccionó ningun archivo")
             Else
    ;~             $var = StringReplace($var, "|", @CRLF)
    ;~             MsgBox(4096, "", "Usted escogió " & $var)
                GUICtrlSetData($txtJpg, $var)
                GUICtrlSetState($txtNameFinal, $GUI_FOCUS)
             EndIf


          Case $btnRar
             $message = "Seleccione el archivo comprimido"
    ;~          $var = FileOpenDialog($message, @WindowsDir & "\", "Images (*.jpg;*.bmp)", 1 + 4); para escoger multiples archivos
             $var = FileOpenDialog($message, @DesktopDir & "\", "Images (*.RAR;*.zip;*.txt;*.docx)")

             If @error Then
                MsgBox(4096, "", "No seleccionó ningun archivo")
             Else
    ;~             $var = StringReplace($var, "|", @CRLF)
    ;~             MsgBox(4096, "", "Usted escogió " & $var)
                GUICtrlSetData($txtRar, $var)
                GUICtrlSetState($btnJpg, $GUI_FOCUS)
             EndIf
          Case $txtNameFinal
             GUICtrlSetState($btnIniciar, $GUI_FOCUS)
          Case $btnCon
             otra($gui)
       EndSwitch

    WEnd
endfunc
    Func otra($WinH)
       GUISetState(@SW_DISABLE, $WinH)
       $seg = GUICreate("Cambiar de extension", 450, 200, -1, -1)

       GUISetState(@SW_SHOW, $seg)
       While 1
          $sMsg = GUIGetMsg()
          Switch $sMsg
			Case $GUI_EVENT_CLOSE
				 GUIDelete($seg)
                gui1()
          EndSwitch

       WEnd
    EndFunc   ;==>otra

Te explico, lo que he hecho ha sido meter tu código del gui principal en una función, y el otro gui en otra.
así, al principio carga el primero, desde ese se llama a la 21º funcion que carga el segundo, y al cerrar el segundo, se arranca de nuevo la 1º función cerrando el segundo gui.

Código: Seleccionar todo

	Case $GUI_EVENT_CLOSE
				 GUIDelete($seg)
                gui1()
Espero que me haya explicado bien!

Saludos
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: ayuda al llamar nueva ventana

Mensaje por Ximorro »

Hum, pero así estás creando el GUI dos veces y haciendo llamadas recursivas.

Al llamar a otra() desde gui1(), deshabilitas $gui (que no es lo mismo que borrarlo).
Después vuelves a ejecutar gui1() con lo que se crea otra vez el gui que de todas maneras estaba ahí.
Una opción sería rehabilitar el gui en vez de recrearlo, o quizás borrarlo en vez de deshabilitarlo así cuando se crea ya no existe.

Pero aún así está el problema de las llamadas recursivas: en una ejecución normal gui1() se está ejecutando, entonces se llama a otra(), al finalizar esta segunda función lo normal sería que gui1() reanudara su ejecución desde donde lo dejó, o sea, justo después de la llamada a otra(). Pero eso no ocurre porque otra() no finaliza nunca, sino que vuelve a llamar a gui1(), eso no reanuda la ejecución sino que vuelve a ejecutar una instancia de esa función (que si finalizara volvería a otra(), y si esta finalizara volvería a gui1() original).
Es decir, cada vez que se aprieta el botón $btnCon se llama al par de funciones otra()-gui1() que nunca finalizan, y no finalizan el par anterior.
El programa termina por el Exit, que lo aborta todo...

Creo que la mejor solución, tomando como partida lo que tenéis, en vez de llamar a gui1() (función que en realidad no hace falta, se podría haber dejado en el código principal), simplemente se rehabilita el formulario $gui1 (con GUISetState(@SW_ENABLE, $gui1), o con $winH si se hace dentro de la función y $gui1 no es global) y ya está, al retornar otra() volverá solito al bucle de control de eventos del anterior $gui1, que sigue siendo el original porque nunca se ha recreado.

Otra opción para que parezca que el formulario no está es ocultarlo en vez de deshabilitarlo, se hace con GUISetState(@SW_HIDE, $gui1), luego se vuelve a mostrar con GUISetState(@SW_SHOW, $gui1), pero igual que antes la función del segundo formulario nunca debe llamar otra vez a la del primero, simplemente tiene que finalizar y el flujo del programa lo hará volver solo.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder