Página 1 de 1

Combo con unidades y actualización automática

Publicado: 13 Abr 2014, 02:53
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

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

Publicado: 13 Abr 2014, 18:29
por Dany
Gracias por compartir con el foro lo que has aprendido.

saludos

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

Publicado: 23 Abr 2014, 17:23
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

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

Publicado: 23 Abr 2014, 18:08
por yasmany
Alguien Disponible?

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

Publicado: 23 Abr 2014, 21:50
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