Combo con unidades y actualización automática

y programas personales para otros como tu, puede que te corrijan ;)
Responder
Avatar de Usuario
yasmany
Hacker del Foro
Mensajes: 249
Registrado: 06 Sep 2011, 21:30

Combo con unidades y actualización automática

Mensaje por yasmany »

Hola a todos, este es un pequeño aporte (EJEMPLO)dedicado para los que estamos iniciándonos en Autoit.
Consiste en una pequeña ventana con un combo en el cual contiene las unidades extraibles de la PC y un botón como ejemplo.
Funcionalidad: Cada vez que introduzcamos una unidad extraible esta se agregará al combo y en caso de que haya sido expulsada la flash/PenDrive se eliminará del combo deshabilitando el botón.
Es un ejemplo prácticamente sencillo para algunos, pero me ha dado dolor de cabeza realizarlo, pero gustosamente lo comparto para que se puedan guiar aquellos que inician con autoit al igual que yo y lo puedan utilizar/modificar, existen algunas otras formas de hacer lo mencionado, pero esto se me ha hecho mas entendible leyendo la descripción de algunos códigos en algunos foros en Ingles.
Cabe agradecer que también me he basado en la ayuda que muy buenamente me han brindado en este enlace hace casi un año. juantxo y Chefito
http://www.emesn.com/autoitforum/viewto ... des#p15366

Codigo: Si existe alguna sugerencia al respecto, la acepto gracias

Código: Seleccionar todo

#NoTrayIcon
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIComboBox.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <GuiConstantsEx.au3>
#include <EditConstants.au3>
#include <GuiButton.au3>
#include <StaticConstants.au3>

Global $unidad, $cbUnidades, $sText, $resultado, $var, $val

$interfaz = GUICreate("Actualizar combo", 250, 140, -1, -1)
$btnObtenerUnidad = GUICtrlCreateButton("Obtener Unidad", 95, 100, 80, 25)
$cbUnidades = GUICtrlCreateCombo("BUSCAR UNIDAD...", 25, 15, 193, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL, $CBS_UPPERCASE))
GUISetState(@SW_SHOW)

While 1
	actualizarComboDeUnidades()
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE

			If $nMsg = $GUI_EVENT_CLOSE Then
				Exit
			EndIf
		Case $btnObtenerUnidad
			obtenerLetraDeUnidad()

	EndSwitch
WEnd

Func actualizarComboDeUnidades()
	Local $i, $var, $dato, $count, $val

	For $i = 0 To _GUICtrlComboBox_GetCount($cbUnidades) - 1
		$dato = _GUICtrlComboBox_GetLBText($cbUnidades, $i, $sText)

		If $sText <> "BUSCAR UNIDAD..." Then
			valordefinido()
			If DriveStatus($unidad) <> "READY" Then
				If GUICtrlRead($cbUnidades) = $sText Then
					GUICtrlSetState($btnObtenerUnidad, $GUI_DISABLE)
					_GUICtrlComboBox_DeleteString($cbUnidades, $i)
					deshabilitarEncerar()
				Else
					_GUICtrlComboBox_DeleteString($cbUnidades, $i)
				EndIf
			EndIf
		EndIf
		$val = DriveGetDrive("removable")
		If Not @error Then
			For $count = 1 To $val[0]
				If DriveStatus($val[$count]) <> "READY" Then
				Else
					$resultado = StringUpper(DriveGetLabel($val[$count]) & "(" & $val[$count] & ")")
					If _GUICtrlComboBox_FindStringExact($cbUnidades, $resultado) = "-1" Then
						_GUICtrlComboBox_AddString($cbUnidades, $resultado)
					EndIf
				EndIf
			Next
		EndIf
	Next
EndFunc   ;==>actualizarComboDeUnidades


Func deshabilitarEncerar()
	GUICtrlSetData($cbUnidades, "BUSCAR UNIDAD...")
	GUICtrlSetState($btnObtenerUnidad, $GUI_DISABLE)
EndFunc   ;==>deshabilitarEncerar

Func valordefinido()
	$contenidocombo1 = StringReplace($sText, "(", "<unidad>")
	$contenidocombo = StringReplace($contenidocombo1, ")", "</unidad>")
	$unidad1 = StringRegExp($contenidocombo, "<(?i)unidad>(.*?)</(?i)unidad>", 1, 1)
	$unidad = $unidad1[0]
EndFunc   ;==>valordefinido

Func obtenerLetraDeUnidad()
	If GUICtrlRead($cbUnidades) <> "BUSCAR UNIDAD..." Then
		$contenidocombo = StringReplace(GUICtrlRead($cbUnidades), "(", "<unidad>")
		$contenidocombo = StringReplace($contenidocombo, ")", "</unidad>")
		$unidad = StringRegExp($contenidocombo, "<(?i)unidad>(.*?)</(?i)unidad>", 1, 1)
		$unidad = $unidad[0]
		MsgBox(64, "Mensaje", "La unidad es " & $unidad)
	EndIf
EndFunc   ;==>obtenerLetraDeUnidad
Última edición por yasmany el 23 Abr 2014, 17:25, editado 1 vez en total.
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
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Combo con unidades y actualización automática[SOLUCIONAD

Mensaje por Dany »

Gracias por compartir con el foro lo que has aprendido.

saludos
  • ............................................Imagen
    ......................................Imagen
Avatar de Usuario
yasmany
Hacker del Foro
Mensajes: 249
Registrado: 06 Sep 2011, 21:30

Re: AYUDA Combo con unidades y actualización automática

Mensaje por yasmany »

Me he percatado de un detalle sucede que cuando ejecuto el script una vez ya establecida la interfaz hago clic en el combo manteniendo visible todo el contenido del combo e introduzco una memoria/flash esta no se agrega en en el combo y si despues hago clic en otro lado de la interfaz aun continua sin agregarse. :smt017
Imagen
Alguien puede brindarme una ayuda, desde ya muchas gracias. :smt024
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
yasmany
Hacker del Foro
Mensajes: 249
Registrado: 06 Sep 2011, 21:30

Re: Combo con unidades y actualización automática

Mensaje por yasmany »

Alguien Disponible?
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
yasmany
Hacker del Foro
Mensajes: 249
Registrado: 06 Sep 2011, 21:30

Re: Combo con unidades y actualización automática [SOLUCIONA

Mensaje por yasmany »

Bueno está solucionado, el problema en si era que cuando tenia visible el ListBox del ComboBox no se agregaba a vista del usuario solo en interno y no aparecía la nueva unidad insertada. para realizar aquello hice que oculte el listBox del comboBox cuando este lo tenga visible.
_GUICtrlComboBox_ShowDropDown($cbUnidades, False)
Fueron mas de 15 horas :smt015 que estaba craneando :smt021 y buscando en la ayuda de Autoit... pero al final resultó.

Código: Seleccionar todo

#NoTrayIcon
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIComboBox.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <GuiConstantsEx.au3>
#include <EditConstants.au3>
#include <GuiButton.au3>
#include <StaticConstants.au3>

Global $unidad, $cbUnidades, $sText, $resultado, $var, $val, $i,  $dato, $count

$interfaz = GUICreate("Actualizar combo", 250, 140, -1, -1)
$btnObtenerUnidad = GUICtrlCreateButton("Obtener Unidad", 95, 100, 80, 25)
$cbUnidades = GUICtrlCreateCombo("", 25, 15, 193, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL, $CBS_UPPERCASE))
_GUICtrlComboBox_SetCueBanner($cbUnidades, "BUSCAR UNIDAD..")
GUISetState(@SW_SHOW)

While 1
	actualizarComboDeUnidades()
	$nMsg = GUIGetMsg()

	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			If $nMsg = $GUI_EVENT_CLOSE Then
				Exit
			EndIf
		Case $btnObtenerUnidad
			obtenerLetraDeUnidad()
	EndSwitch
WEnd

Func actualizarComboDeUnidades()

	For $i = 0 To _GUICtrlComboBox_GetCount($cbUnidades) - 1
		$dato = _GUICtrlComboBox_GetLBText($cbUnidades, $i, $sText)

		If $sText <> "BUSCAR UNIDAD..." Then
			valordefinido()
			If DriveStatus($unidad) <> "READY" Then
				If GUICtrlRead($cbUnidades) = $sText Then
					GUICtrlSetState($btnObtenerUnidad, $GUI_DISABLE)
					_GUICtrlComboBox_DeleteString($cbUnidades, $i)
					deshabilitarEncerar()
				Else
					_GUICtrlComboBox_DeleteString($cbUnidades, $i)
				EndIf
			EndIf
		EndIf
	Next
	$val = DriveGetDrive("removable")
		If Not @error Then
			For $count = 1 To $val[0]
				If DriveStatus($val[$count]) <> "READY" Then
				Else
					$resultado = StringUpper(DriveGetLabel($val[$count]) & "(" & $val[$count] & ")")
					If _GUICtrlComboBox_FindStringExact($cbUnidades, $resultado) = "-1" Then
						_GUICtrlComboBox_ShowDropDown($cbUnidades,False)
						_GUICtrlComboBox_AddString($cbUnidades, $resultado)
						ConsoleWrite($resultado&@CRLF)
					EndIf

				EndIf
			Next
		EndIf
EndFunc   ;==>actualizarComboDeUnidades

Func deshabilitarEncerar()
	GUICtrlSetState($btnObtenerUnidad, $GUI_DISABLE)
EndFunc   ;==>deshabilitarEncerar

Func valordefinido()
	$contenidocombo1 = StringReplace($sText, "(", "<unidad>")
	$contenidocombo = StringReplace($contenidocombo1, ")", "</unidad>")
	$unidad1 = StringRegExp($contenidocombo, "<(?i)unidad>(.*?)</(?i)unidad>", 1, 1)
	$unidad = $unidad1[0]
EndFunc   ;==>valordefinido

Func obtenerLetraDeUnidad()
	If GUICtrlRead($cbUnidades) <> "BUSCAR UNIDAD..." Then
		$contenidocombo = StringReplace(GUICtrlRead($cbUnidades), "(", "<unidad>")
		$contenidocombo = StringReplace($contenidocombo, ")", "</unidad>")
		$unidad = StringRegExp($contenidocombo, "<(?i)unidad>(.*?)</(?i)unidad>", 1, 1)
		$unidad = $unidad[0]
		MsgBox(64, "Mensaje", "La unidad es " & $unidad)
	EndIf
EndFunc   ;==>obtenerLetraDeUnidad
Disponible para el que desee usarlo :smt024
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
Responder