Página 1 de 1

Chat Básico

Publicado: 18 May 2010, 05:48
por Bethory
Hola muy buenas noches a todos los AutoIt-eros
mi dilema es el siguiente.
estoy haciendo un estilo de "chat" para comunicarnos entre mis amigos de la empresa sin tener que instalar ningún software adicional que pueda llevarnos a tener problemas
el problema consiste en mostrar el historial de conversación; ya que por mas que lo configuro siempre me reemplaza la primera linea :smt017
es decir que quiero que se muestren las lineas sin que se borren las ya escritas

a continuación posteo el código:

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <File.au3>

#Region ### START Koda GUI section ### Form=chatico.kxf
$Chatico = GUICreate("Chatico", 594, 377, 208, 145)
GUISetIcon("default.ico")
GUISetFont(12, 400, 2, "Segoe UI")
$Label1 = GUICtrlCreateLabel("NickName", 8, 320, 123, 42)
GUICtrlSetFont(-1, 18, 800, 0, "Papyrus")
$salida = GUICtrlCreateInput("", 8, 280, 577, 29) ;Cuadro de texto donde escribes
$entrada = GUICtrlCreateEdit(""& @CRLF, 8, 8, 577, 257, BitOR($WS_VSCROLL, $ES_MULTILINE, $ES_WANTRETURN)) ;Cuadro donde ves lo escrito
;~ GUICtrlSetData(-1, "")
$enviar = GUICtrlCreateButton("Enviar", 472, 312, 113, 49, $WS_GROUP) ;Boton "enviar"
GUICtrlSetFont(-1, 18, 800, 0, "Papyrus")
GUICtrlSetCursor(-1, 0)
$nick = GUICtrlCreateInput("Usuario X", 144, 328, 113, 29) ;NickName
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

If Not FileExists("log.txt") Then
	_FileCreate("log.txt")
	MsgBox(4096, "Aviso", "Log creado", 1 / 2)
EndIf

HotKeySet("{enter}", "enter_key")

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $enviar
			Call("enviar")
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd

Func enter_key()
	Opt("WinWaitDelay", 100)
	Opt("WinDetectHiddenText", 1)
	Opt("MouseCoordMode", 0)
	Opt("WinTitleMatchMode", 3)
	If WinActive("Chatico") Then
		Call("enviar")
	Else
		HotKeySet("{enter}")
		Send("{enter}")
		HotKeySet("{enter}", "enter_key")
	EndIf
EndFunc   ;==>enter_key

Func enviar()
	$file = FileOpen("log.txt", 1)
	If $file = -1 Then
		MsgBox(0, "Info", "Aguante mijo que el archivo no esta listo", 1)
		Exit
	EndIf

	FileWriteLine($file, GUICtrlRead($nick) & " Dice: " & GUICtrlRead($salida))

	FileClose($file)

	GUICtrlSetData($salida, "") ;borrar lo escrito

	$file = FileOpen("log.txt", 0)
	If $file = -1 Then
		MsgBox(0, "Info", "Aguante mijo que el archivo no esta listo", 1)
		Exit
	EndIf

	$line = FileReadLine($file, -1)
	FileClose($file)
	GUICtrlSetData($entrada, $line&@lf)
EndFunc   ;==>enviar

;tmb recibo con gusto ideas de como mejorar mi código ^^
de antemano muchísimas gracias por sus respuestas estaré al tanto de ellas

Re: Chat Básico

Publicado: 18 May 2010, 08:56
por Ximorro
Primero unas sugerencias...
Yo no pondría un HotKeySet para el ENTER, piensa que los hotkey son globales al sistema y esa es una tecla muy común. Haces muy bien lo de mirar si es tu ventana activa para actuar, pero de todas maneras aunque estés en otro programa cada vez que pulses Intro se irá al tuyo a ver si tiene que hacer algo.
Hay una manera de poner una tecla rápida a tu botón enviar, de tal manera que sólo mirará lo del ENTER si está en tu GUI, es como un hotkey local. Se hace con la función GUISetAccelerators, en este comentario explico un poco el asunto:
http://www.emesn.com/autoitforum/viewto ... a6a6#p8211

Tendrías que añadir:
$AccelKeys[1][2]=[["{ENTER}", $enviar]]
GUISetAccelerators($AccelKeys)

Con eso cada vez que presiones ENTER será lo mismo que pinchar $enviar con el ratón. Ya no hace falta eso de mirar si es tu ventana la activa, porque seguro que lo es, y no hay que desactivar el hotkey, reenviar la tecla, volver a activarlo... todo eso te lo ahorras. Es decir, ya no hace falta la función enter_key(). Una sugerencia para el futuro, es mejor no poner los OPT dentro de la función, puedes activar esas opciones al principio del programa y quedarán activas hasta que se cierre. Otra cosa es que las quieras modificar en medio de la ejecución, pero en este caso no hacía falta ponerlas cada vez que presionabas enter en cualquier aplicación.

Otra: es ineficiente llamar a tus funciones con Call, ¡simplemente llámalas directamente!. Mejor cambia el call("enviar") por enviar()

Y tu cuestión... pues sólo pone lo último porque es lo único que recuperas del archivo (el -1 de FileReadLine le está diciendo que sólo lea la última línea), lees la última línea y actualizas el editbox con esa línea, además borras exprésamente el control con lo que seguro que sólo tendrá esa línea.

Se me ocurren dos opciones:
1) No borrar el editbox, y vez de actualizar todo su contenido con esa línea, añadirla a lo que ya hay ¡fácil! ;-) Para eso quita el GUICtrlSetData($salida, "") y al final pon GUICtrlSetData($entrada, $line&@CRLF,1).
El 1 (en realidad sirve cualquier cosa diferente de una cadena vacía) le dice al editbox que añada el texto, en vez de sustituir todo. Fíjate que también he cambiado el @LF por @CRLF, a veces da lo mismo pero en este caso es mejor el último, que es el retorno de carro de Windows, y si no pones ese por ejemplo en XP me salen cuadraditos a final de línea en el edit...
2) No leer sólo la última línea, sino todo el archivo y actualizar el edit con toda la información cada vez.

Personalmente prefiero la primera, por no leer todo el archivo cada vez, aunque la segunda permitiría variaciones interesantes como mostrar sólo las últimas 10 líneas o cosas así.

Saludossss

Re: Chat Básico

Publicado: 19 May 2010, 00:27
por Bethory
Muchas gracias Ximorro por tu pronta respuesta voy a probar todos tus consejos tan pronto tenga acceso al script.
Por otra parte me podrías explicar ¿cómo hago para leer todo el archivo a la vez?

Re: Chat Básico

Publicado: 19 May 2010, 05:04
por Bethory
Rápidamente ... funcionaron tus sabios consejos ;) muchas gracias !! :smt023

Re: Chat Básico

Publicado: 19 May 2010, 09:19
por Ximorro
Me alegro de que lo hayas solucionado, supongo que esa pregunta de leer todo el fichero también lo has superado ya, aunque como te comentaba quizás sea mejor leer sólo la última línea y añadir sólo eso a la caja de texto, en vez de reescribir todo cada vez.

Cuando lo tengas acabado podías postearlo por si a alguien le interesa.

ciaooooooo

Re: Chat Básico

Publicado: 26 Jun 2010, 04:20
por Bethory
después de mucho rato posteo el código por si les sirve de algo ;)

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <File.au3>
;--------------------------------------------------->>Ventana de loggin<<----------------------------------------------------
$Loggin = GUICreate("Loggin", 210, 74, 349, 436)
GUISetBkColor(0x00000000)
GUISetIcon("Shell32.dll", 269)
$User = GUICtrlCreateInput("Usuario", 8, 8, 129, 21)
$Password = GUICtrlCreateInput("Password", 8, 40, 129, 21, $ES_PASSWORD)
$OK = GUICtrlCreateButton("OK", 144, 8, 57, 57, 0)
GUISetState(@SW_SHOW)
;---------------------------------------------------->>teclas<<-----------------------------------------------
Global $AccelKeys[1][2] = [["{enter}", $OK]]
GUISetAccelerators($AccelKeys)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $OK
			If GUICtrlRead($Password) = "dark123" Then
				; GUIDelete()
				GUISetState(@SW_HIDE)
				ExitLoop
			Else
				Exit 0
			EndIf
		Case $GUI_EVENT_CLOSE ;------------------------------------ cierra el chat
			Exit 0
	EndSwitch
WEnd
;-------------------------------------------------->>Ventana Principal<<----------------------------------------------------
$Chatico = GUICreate("Chatico V2.51 By Bett®Soft", 363, 210);997, 503
; GUISetBkColor(0x00000000)
GUISetIcon("Shell32.dll", 269)
GUISetFont(12, 400, 2, "Segoe UI")
$Label1 = GUICtrlCreateLabel("Nivel de Transparencia", 30, 180, 200, 35)
; GUICtrlSetColor(-1, 0xff0000)
GUICtrlSetFont(-1, 8, 800, 0, "Tahoma")
$salida = GUICtrlCreateInput("", 8, 128, 345, 29) ;Cuadro de texto donde escribes
$entrada = GUICtrlCreateEdit("", 8, 8, 345, 113, BitOR($WS_VSCROLL, $ES_MULTILINE, $ES_WANTRETURN)) ;Cuadro donde ves lo escrito
$enviar = GUICtrlCreateButton("Enviar", 264, 168, 90, 33, $WS_GROUP) ;Boton "enviar"
GUICtrlSetFont(-1, 18, 800, 0, "Papyrus")
GUICtrlSetCursor(-1, 0)
$borrar = GUICtrlCreateButton("Borrar", 172, 168, 90, 33, $WS_GROUP) ;Boton "borrar"
GUICtrlSetFont(-1, 18, 800, 0, "Papyrus")
GUICtrlSetCursor(-1, 0)
$mute = GUICtrlCreateCheckbox("Sonido", 2, 192, 80, 20)
; GUICtrlSetColor(-1, 0xff0000)
$slider1 = GUICtrlCreateSlider(2, 160, 170, 20)
GUICtrlSetLimit(-1, 254, 50)
GUICtrlSetData($slider1, 128)

GUISetState(@SW_SHOW)
WinSetTrans("Chatico V2.51 By Bett®Soft", "", GUICtrlRead($slider1))

If Not FileExists("i1310.txt") Then
	_FileCreate("i1310.txt")
	MsgBox(4096, "Aviso", "Log creado", 1 / 2)
EndIf
;------------------------------------------------->>ocultar archivo<<----------------------------------------------------
FileSetAttrib("i1310.txt", "+H")
$size_1 = FileGetSize("i1310.txt")
Global $number = 0
;---------------------------------------------->>Opciones para traymenu<<-----------------------------------------------
Opt("TrayAutoPause", 0)
Opt("TrayMenuMode", 1)
;------------------------------------------>>opciones generales para las ventanas<<----------------------------------
Opt("WinWaitDelay", 100)
Opt("WinDetectHiddenText", 1)
Opt("MouseCoordMode", 0)
Opt("WinTitleMatchMode", 3)
;------------------------------------------------->>incio de secion de un usuario<<----------------------------------------
$file = FileOpen("i1310.txt", 1)
If $file = -1 Then
	MsgBox(0, "Info", "Aguante mijo que el archivo no esta listo", 1)
EndIf
FileWriteLine($file, GUICtrlRead($User) & " ha conectado ");GUICtrlRead($User)
FileClose($file)

Global $AccelKeys[1][2] = [["{enter}", $enviar]]
GUISetAccelerators($AccelKeys)

HotKeySet("^!{space}", "boss_key")

While 1
	If WinActive("Chatico V2.51 By Bett®Soft") Then
		TraySetIcon("Shell32.dll", 16)
	EndIf
	$nMsg = GUIGetMsg()
	WinSetTrans("Chatico V2.51 By Bett®Soft", "", GUICtrlRead($slider1))
	Switch $nMsg
		Case $enviar ; -----------------------------------------accion cuando se oprime el boton "enviar"
			enviar()
		Case $GUI_EVENT_CLOSE ;------------------------------------ accion cuando se cierra el chat
			$file = FileOpen("i1310.txt", 1)
			If $file = -1 Then
				MsgBox(0, "Info", "Aguante mijo que el archivo no esta listo", 1)
			EndIf
			FileWriteLine($file, GUICtrlRead($User) & " ha desconectado ")
			FileClose($file)
			Exit
		Case $borrar
			FileDelete("i1310.txt")
			_FileCreate("i1310.txt")
			FileSetAttrib("i1310.txt", "+H")
	EndSwitch
	$size_2 = FileGetSize("i1310.txt"); ------------------------------secuencia de actualizacion del chat
	If $size_1 <> $size_2 Then
		$file = FileOpen("i1310.txt", 0)
		If $file = -1 Then
			MsgBox(0, "Info", "Aguante mijo que el archivo no esta listo", 1)
		EndIf
		$line = FileReadLine($file, -1)
		FileClose($file)
		GUICtrlSetData($entrada, $line & @CRLF, 1)
		$size_1 = $size_2
		TraySetIcon("Shell32.dll", 282)
		If GUICtrlRead($mute) = 1 Then
			SoundPlay(@WindowsDir & "\media\Barra de info de Windows XP.wav", 0)
		EndIf
		WinFlash("Chatico V2.51 By Bett®Soft", "", 2, 400)
	EndIf
WEnd
;---------------------------------------------------->>Funcion tecla jefe<<--------------------------------------------
Func boss_key()
	$x = Not $number
	$number = $x
	If $number = True Then
		WinSetState("Chatico V2.51 By Bett®Soft", "", @SW_HIDE)
		Opt("TrayIconHide", 1)
	Else
		WinSetState("Chatico V2.51 By Bett®Soft", "", @SW_SHOW)
		Opt("TrayIconHide", 0)
	EndIf
EndFunc   ;==>boss_key
;------------------------------------------------->>Funcion tesa<<----------------------------------------

Func enviar()
	$file = FileOpen("i1310.txt", 1)
	If $file = -1 Then
		MsgBox(0, "Info", "Aguante mijo que el archivo no esta listo", 1)
	EndIf

	FileWriteLine($file, GUICtrlRead($User) & " Dice: " & GUICtrlRead($salida))

	FileClose($file)

	GUICtrlSetData($salida, "") ;borrar lo escrito

	$file = FileOpen("i1310.txt", 0)
	If $file = -1 Then
		MsgBox(0, "Info", "Aguante mijo que el archivo no esta listo", 1)
	EndIf
	$line = FileReadLine($file, -1)
	FileClose($file)
	GUICtrlSetData($entrada, $line & @CRLF, 1)
	$size_1 = FileGetSize("i1310.txt")
;~ 	GUICtrlSetData($entrada, @lf)
EndFunc   ;==>enviar
solo quiero decir.... ADORO AUTOIT

Re: Chat Básico

Publicado: 26 Jun 2010, 18:48
por Juanchi
Una pregunta...
Como funciona el software para que uno lea lo que escribe el otro ?

Re: Chat Básico

Publicado: 29 Jul 2010, 03:59
por Bethory
Si aun está a tiempo te comento...
ésta aplicación la utilizaba para comunicarnos entre personas que tuvieran una localización en común en un servidor desde la cual se pueda acceder por medio de una unidad de red en este caso "X:\" la aplicación revisaba en tamaño del log de forma tal que cuando se encuentra una diferencia de peso del archivo lee la ultima linea escrita y la muestra en la caja de texto de todos los que tengan el chat abierto.

si tienes alguna otra pregunta por-favor realizala estaré pasando para responderla ;)