Chat Básico

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.

Chat Básico

Notapor Bethory » 18 May 2010, 05:48

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
Me gustaría arreglar el mundo.... pero no me han dado el código fuente xD
Avatar de Usuario
Bethory
 
Mensajes: 8
Registrado: 11 Feb 2009, 20:24

Re: Chat Básico

Notapor Ximorro » 18 May 2010, 08:56

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:
viewtopic.php?p=8237&sid=2e37d0144a1141a4d368b0e07229a6a6#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
Avatar de Usuario
Ximorro
Profesional del Autoit
 
Mensajes: 613
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Chat Básico

Notapor Bethory » 19 May 2010, 00:27

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?
Me gustaría arreglar el mundo.... pero no me han dado el código fuente xD
Avatar de Usuario
Bethory
 
Mensajes: 8
Registrado: 11 Feb 2009, 20:24

Re: Chat Básico

Notapor Bethory » 19 May 2010, 05:04

Rápidamente ... funcionaron tus sabios consejos ;) muchas gracias !! :smt023
Me gustaría arreglar el mundo.... pero no me han dado el código fuente xD
Avatar de Usuario
Bethory
 
Mensajes: 8
Registrado: 11 Feb 2009, 20:24

Re: Chat Básico

Notapor Ximorro » 19 May 2010, 09:19

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
Avatar de Usuario
Ximorro
Profesional del Autoit
 
Mensajes: 613
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Chat Básico

Notapor Bethory » 26 Jun 2010, 04:20

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
Me gustaría arreglar el mundo.... pero no me han dado el código fuente xD
Avatar de Usuario
Bethory
 
Mensajes: 8
Registrado: 11 Feb 2009, 20:24

Re: Chat Básico

Notapor Juanchi » 26 Jun 2010, 18:48

Una pregunta...
Como funciona el software para que uno lea lo que escribe el otro ?
Dicen que me parezco a Dante
Solo por el pelo porque el no podría ser mi contrincante (8)


Imagen
Avatar de Usuario
Juanchi
Aprendiz de Mago
 
Mensajes: 29
Registrado: 26 Mar 2010, 00:24

Re: Chat Básico

Notapor Bethory » 29 Jul 2010, 03:59

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 ;)
Me gustaría arreglar el mundo.... pero no me han dado el código fuente xD
Avatar de Usuario
Bethory
 
Mensajes: 8
Registrado: 11 Feb 2009, 20:24


Volver a Preguntas Sencillas. (Empieza aquí <Aprendiendo las bases y Comandos)

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron