Super Guia de Programacion



  • Como bien dije en el otro thread, la idea es hacer la guia mas completa y organizada entre todos, cada uno va a postear lo que quiera cuando quiera, cuales son las condiciones para organizar bien esto?

    • Cada post debe contener un unico tema de un unico lenguaje.
    • El tema no debe ser repetido en un post anterior, en caso de ser repetido se debera llegar a un acuerdo entre todos para mejorar el primer post q se hizo con ese tema.
    • Puede ser un tema de un lenguaje, como tambien conceptos generales de programacion.

    Aca mismo en el primer post, va a estar el indice con el link a cada tema de cada lenguaje, de esta manera va a quedar todo mucho mas organizado y a la vez dia a dia podemos mejorar la guia y completarla mas.

    Indice:

    Conceptos Generales de la Programacion

    ¿Que es la Programacion?
    Paradigmas: "tipos de lenguajes"

    Visual Basic 6.0

    Controles, Propiedades y Eventos
    Winsock, Aplicacion cliente/servidor
    Base de Datos (Access 2003)
    MsgBox

    Delphi 7

    C

    C++

    C#

    VB.net

    Html

    Introduccion

    Java

    Javascript

    Css (Hojas de estilo)

    Action Script

    Asp.net

    Php

    Lisp

    SQL Server

    MySql

    Aviso: recuerden que si hacen 2 post seguidos automaticamente se les junta, asi q para aportar mas de una cosa deberan esperar que otro postee despues de ustedes, o avisarme a mi y yo lo posteo.



  • ¿Que es la Programacion?

    Podemos comparar a la programacion con muchas cosas como por ejemplo artes manuales, cocina, pintura, mecanica, medicina, cualquier cosa que se les ocurra.

    Por que digo esto se preguntaran?

    Cuando un cheff realiza un plato de comida, este necesita saber que ingredientes usar, como usarlos, cuanto tiempo lleva de coccion y muchas cosas mas para lograr obtener un buen resultado. Hay mucha cantidad de cheffs, no todos cocinan igual, algunos recien empiezan, otros llevan tiempo cocinando, algunos usan ingredientes extra… etc...

    Un programador, aunque no parezca, tambien tiene que saber que "ingredientes" va a usar y como va a usarlos. Para programar se necesita hacer si o si un estudio previo de que es a lo que se busca llegar, como podria hacerse para llegar a eso, y esta es una de las partes divertidas de la programacion, pensar.

    En mi tiempo que llevo en el foro y programando, conoci mucha gente, gente que decia que sabia mucho y no sabia, gente que lo decia y si sabia, gente que no sabia nada y era sincera, y gente que decia que no sabia cuando realmente sabia mas de lo que pensaba.
    Un programador tiene la obligacion de saber que es lo que esta programando, imaginense que un cheff cocine sin saber lo que esta cocinando, que pasaria?

    En conclusion, la programacion, no es solo el saber hacer un IF o un WHILE sino que es poder tener la capacidad de plantearse un problema y encontrarle una solucion que luego de ya pensada, se pasaria a codigo.



  • Paradigmas: "tipos de lenguajes"

    Que es un paradigma? como lo indica el subtitulo que invente, seria una especie de tipo de lenguaje, mas puntualmente un tipo de pensamiento a la hora de aplicar una resolucion.

    En programacion podemos encontrar 3 que son los principales: estructurado, orientado a objetos y funcional.

    Paradigma Estructurado: como su palabra lo indica, se basa en seguir una estructura, ejecuta paso a paso cada sentencia. Algunos lenguajes estructurados serian C, Pascal, Visual Basic 6, etc.

    Paradigma Orientado a Objetos (POO): este tipo de lenguajes se basa en abstraer lo mas que se pueda a la realidad, surgiendo asi la utilizacion de clases (tipos de objetos) , sus instancias (los objetos propiamente dichos) y la interaccion de las mismas. Un claro ejemplo de este tipo podrian ser Java o .net.
    Aclaracion, un objeto no quiere decir "un boton", el Visual Basic 6 tiene botones pero no es orientado a objetos (aunque puedan utilizarse)

    Paradigma Funcional: es el basado totalmente en el uso de funciones, todo lo que se haga es una funcion, se utiliza mucha recursividad y sinceramente para mi punto de vista es de los mejores para agilizar la mente. Lisp es el mejor ejemplo de este tipo de paradigmas.



  • Controles, propiedades y eventos

    Ya que en visual basic 6 se trabaja mayormente con este tipo de cosas, es bueno tener bien en claro estos conceptos para poder empezar.

    Controles: Un control es un elemento que encontramos en el cuadro de herramientas ( ). Podemos encontrar varios comunes como botones y cajas de texto asi como tambien podemos crear controles propios o importar algunos externos.

    Aca dejo un videito que hice hace mucho y esta por el foro, a modo de introduccion a algunos de los elementos disponibles.

    6o0c0xdZ57E

    Propiedades: Una propiedad es una caracteristica de un determinado control, muchas de ellas son comunes para varios controles pero hay otras que no. Por ejemplo el 'height' y 'width' (alto y ancho) son propiedades bastante comunes, en cambio el 'interval' es una propiedad que tiene solo el control Timer. Una propiedad entonces posee un nombre y un valor, y es lo que hace que cada control utilizado se pueda diferenciar de otro de su mismo tipo. Si cuando elijen un control no ven el cuadro de propiedades, clickeen su icono en la parte superior ( )

    Eventos: Un evento es una accion que se produce al interactuar con un control, por ejemplo al clickear un boton se lanza el evento Button_Click, al cargar un formulario se produce el evento Form_Load, etc. Todo control tiene por defecto un evento, es decir que cuando yo arrastro un control al formulario y le hago doble click, me va a llevar al codigo del evento de ese control, en el caso del boton, al hacer doble click nos va a llevar a programar el codigo que se ejecutaria cuando el usuario clickee dicho boton.

    Un simple ejemplo para entender todos estos conceptos seria, en un nuevo proyecto vamos a poner un Boton. En sus propiedades vamos a ponerle un alto de 600 un ancho de 1500 y en el Caption (texto a mostrar del boton) ponemos un "Clickeame" sin las comillas. Damos doble click al boton y se nos abre la parte del codigo, ahi agregamos el siguiente codigo: MsgBox ("Esto se ejecuto con el evento click del boton")

    Private Sub Command1_Click()
    MsgBox ("Esto se ejecuto con el evento click del boton")
    End Sub

    El resultado final seria:

    El resto es cuestion de abrir ustedes el visual meter controles por todos lados, jugar con sus propiedades y ver que eventos tienen.



  • Lenguaje: Visual Basic.
    Bueno, como dije, voy a aportar la guía teórico-práctica, la misma consta de 41 hojas.
    Es con la que yo estoy trabajando actualmente en el colegio.

    http://www.megaupload.com/?d=WA2NOJB0

    Saludos gente!
    Espero que sea útil.



  • Perdon si no se entendio la idea del post, pero la idea es aportar UN TEMA EN PARTICULAR de cada lenguaje, y la idea es a modo texto plano, nada de links de descarga, cosa de que a medida q vayamos avanzando con los aportes se vaya formando una super guia comoda y practica, un link es como ir a buscar en google y bajar cosas, la gente lo veria como algo comun y no como a lo q estamos apuntando, si podes bajarla, y ver si algun tema es interesante para aportarlo, hacelo.

    Aprovecho para aclarar, que aca se puede postear tranquilamente, como en el primer post esta el indice, no estariamos ensuciando el thread asi que esta permitido postear dudas, comentarios, todo dentro de lo permitido.



  • Winsock, Aplicacion cliente/servidor

    Posteo esta guía que hice hace bastante con mi otra cuenta "wipudark", es lo único que puedo rescatar de las guías que hice y creo que a más de uno le va a servir 🙂

    Terribles dudas en Verde
    Introducción
    Bueno en este tutorial voy a explicar y demostrar el uso de el componente winsock, que van a necesitar usar. (components…>Winsock Control 6.0)
    Vamos a ver una demostración de 1 coneccion y de multiconeccion, que en criollo quiere decir con una coneccion o varias a la ves 😃

    Ehhh? Y que mierda es cliente? El cliente es cliente del servidor? el servidor le sirve jugo mientras el cliente ta tirado re pancho en una reposera?😕😕😕

    Algo parecido. Bueno para empezar. El Cliente es toda aplicación que se conecta (por medio de socket) a una aplicacion servidor, la cual le brinda datos.
    y el Servidor, como ya dije, es la aplicacion que le brinda los datos al cliente. Esta (Siempre que esta prendido) a la espera de un cliente por medio de un socket de escucha.(Digamos en criollo que el cliente le dice "Che servidor mandame alguna info" y el servidor que esta a la escucha de cliente lo conecta y le brinda datos.")
    EJEMPLO: El servidor de tds le brinda informacion al cliente de tds, le manda las caracteristicas del personaje, la vida, la energia, etc
    Sera posible conectarse a 10000 servers con un solo cliente?
    Nada de eso :S Cada servidor tiene sus propias características y host, por lo tanto se debe ingresar la direccion de ip para poder entrar.
    Ahhh, No entendi nada :S
    Bueno en resumen:
    • Un programa Cliente (el que solicita la información)
    • Un programa Servidor (el que sirve la información que necesitamos)
    • Una dirección hacia el servidor (para poder saber a donde conectar)

    ! Con ese 3 elementos se puede concretar con la coneccion cliente/servidor.🍌

    Bueno menciono que la direccion esta formada por una ip y un puerto.
    PREPARANDO EL VISUAL BASIC - Wiiii voy a empezar a programar!!!Eh? Como hago ? :$
    Es muy Simple, Abris visual basic y pones en standard EXE.

    ahora en la tabla de elementos de mendeleiev (?) donde estan los timers y eso click izquierdo, le das a components y buscas winsock control 6.0
    Que es un componente wskisnmjdfljsljfgps?😕
    Un winsock es un componente que nos permite realizar conecciones entre uun cliente y un servidor.

    Propiedades del winsock
    Property BytesReceived As Long (Solo lectura)
    Retorna el número de Bytes recibidos en la conexión.
    Property Index As Integer (Solo lectura)
    Retorna/Asigna el numero que identifica al control en un arreglo de controles.
    Property LocalHostName As String (Solo lectura)
    Retorna el nombre de la maquina local.
    Property LocalIP As String (Solo lectura)
    Retorna la dirección IP de la maquina local.
    Property LocalPort As Long (Solo lectura)
    Retorna el puerto usado en la maquina local.
    Property Protocol As ProtocolConstants
    Retorna/Asigna el tipo de protocolo que usara el Socket
    Estos valores pueden ser dos: sckTCPProtocol y sckUDPProtocol.
    Property RemoteHost As String
    Retorna/Asigna el nombre (dirección) usado para identificar a la maquina remota.
    Property RemoteHostIP As String (Solo lectura)
    Retorna la dirección IP del Host Remoto.
    Property RemotePort As Long
    Retorna/Asigna el puerto al cual se conectara en el computador remoto.
    Property SocketHandle As Long (Solo lectura)
    Retorna el manejador (Handle) del Socket. (Solo para usuarios avanzados)
    Property State As Integer (Solo lectura)
    Retorna el estado de la conexion del Socket.

    MÉTODOS Del Winsock

    Sub Accept(requestID As Long)
    Acepta un petición de conexión entrante.
    Sub Bind([LocalPort], [LocalIP])
    Amarra un socket a un específico puerto y adaptador.
    Sub Close()
    Cierra la conexión actual.
    Sub Connect([RemoteHost], [RemotePort])
    Conecta a un computador remoto.
    Sub GetData(data, [type], [maxLen])
    Recibe datos enviados por el computador remoto.
    Sub Listen()
    Se pone a la escucha de peticiones de conexión entrantes.
    Sub PeekData(data, [type], [maxLen])
    Mira los datos entrantes sin removerlos desde el buffer.
    Sub SendData(data)
    Envía datos al computador remoto.

    Y esto de sub y nos data ke mierda la re concha de la lora no se una mierda :@:angry2:
    Son propiedades y metodos que se van a usar para indicar cuando ocurren algunas funciones o que pasa si ocurren.
    ahhhhhh 😛 ya entendi:D

    Eventos
    Event Close()
    Ocurre cuando la conexión a sido cerrada remotamente.
    Event Connect()
    Ocurre cuando la operación de conexión se ha completo.
    Event ConnectionRequest(requestID As Long)
    Ocurre cuando un cliente remoto se intenta conectar.
    Event DataArrival(bytesTotal As Long)
    Ocurre cuando se reciben datos desde un computador remoto.
    Event Error(Number As Integer, Description As String, Scode As Long, Source As String, HelpFile As String, HelpContext As Long, CancelDisplay As Boolean)
    Se dispara cuando ocurre algún error.
    Event SendComplete()
    Ocurre después que una operación de envio se haya completado.
    Event SendProgress(bytesSent As Long, bytesRemaining As Long)
    Ocurre mientras se esta enviando un dato.

    CONSTANTES
    Constante Descripción
    sckClosed El socket se encuentra cerrado.(Server Ofline)
    sckClosing El socket esta cerrando la conexión al computador remoto.
    sckConnected El socket ha conectado al computador remoto.
    sckConnecting El socket esta conectando al computador remoto.
    sckConnectionPending El socket tiene una petición pendiente
    sckError Se ha producido un error
    sckHostResolved El socket ha resuelto el nombre del equipo remoto.
    sckListening El socket esta a la escucha de peticiones entrantes.
    sckOpen El socket esta actualmente abierto.
    sckResolvingHost El socket esta resolviendo el nombre del computador remoto.

    Ayuda!! que mierda es una constante
    Recibe ese nombre ya que siempre se mantiene con un mismo valor "Constante"

    Algunos errores que pueden aparecer a la hora de conectarse

    Tambien pueden haber errores en la coneccion como por ejemplo server lleno, pasa a menudo en algunos servers de ao pero eso lo dejo para otro tutorial.

    Armando La primera aplicacion clienteArmando Esteban Quito (?)

    Bueno a un form le agregan: (con nombres y todo)
    text1 con scrolbars vertical y multiline = true
    Winsock1
    text2
    command1 y de caption enviar
    text3 y de text ip
    text4 y de text puerto
    command2 y de caption enviar
    Command3 y de caption desconectar

    Bueno las P, E y S que vamos a usar son las siguientes:

    Propiedades necesarias

    • RemoteHost: Asignamos la dirección a la que deseamos conectar.
    • RemotePort: Asignamos el puerto al que deseamos conectar en RemoteHost.
      Métodos necesarios
    • Connect(): Conecta al servidor.
    • Close(): Cierra la conexión al servidor.
      Eventos involucrados
    • Connect(): Ocurre cuando hemos establecido con éxito la conexión al servidor
    • Close(): Ocurre cuando el servidor nos cierra la conexión.
    • Error(): Ocurre en caso de errores.

    Para realizar la conexión utilizamos el siguiente código:

    Private Sub Command2_Click()
    'asignamos los datos de conexion
    Winsock1.RemoteHost = Text3.Text
    Winsock1.RemotePort = Text4.Text
    'conectamos el socket
    Winsock1.Close
    Winsock1.Connect
    End Sub
    
    ```como ven aca esto lo que hace es elegir al text4 como pueto y al text3 como ip y conectarse.
    Nota: También se puede especificar los datos de conexión (IP y Puerto) directamente en el comando "Connect" como parámetros, de la sig. Forma: Winsock1.Connect(Host, Puerto).
    
    Si la conexión se realiza con éxito se dispara un evento para tal fin, en donde podemos realizar acciones inmediatas en el momento preciso en que se logra establecer la conexión con el servidor. El evento es el siguiente:
    
    

    Private Sub Winsock1_Connect()
    'desplegamos un mensaje en la ventana
    Text1.Text = Text1.Text & _
    "*** Conexion establecida." & vbCrLf
    'desplazamos el scroll
    Text1.SelStart = Len(Text1.Text)
    End Sub

    Eso es lo ke hace ke el text1 sea como lo ke seria la consola de ao.
    en caso de querer cerrar la coneccion el codigo seria asi
    

    Private Sub Winsock1_Close()
    'cierra la conexion
    Winsock1.Close
    'desplegamos un mensaje en la ventana
    Text1.SelStart = Len(Text1.Text)
    Text1.Text = Text1.Text & "*** Conexion cerrada por el servidor." & vbCrLf
    Text1.SelStart = Len(Text1.Text)
    End Sub

    Private Sub Command3_Click()
    'cierra la conexion
    Winsock1.Close
    'desplegamos un mensaje en la ventana
    Text1.Text = Text1.Text & _
    "*** Conexion cerrada por el usuario." & vbCrLf
    'desplazamos el scroll
    Text1.SelStart = Len(Text1.Text)
    End Sub

    **.Enviando/recibiendo datos:**Wou lo ke mas me gusta! No entiendo un sorete :S
    ahra explico.
    
    Métodos necesarios
    - SendData: Envía datos al otro extremo de la conexión (socket remoto).
    - GetData: Recibe datos enviados por el extremo remoto (socket remoto).
    Eventos involucrados
    - DataArrival(): Ocurre cuando el socket remoto nos esta enviando datos.
    - Error(): Ocurre en caso de errores.
    
    Para enviar datos utilizamos el método "SendData" de la sig. forma:
    

    Private Sub Command1_Click()
    'enviamos el contenido de Text2
    Winsock1.SendData Text2.Text & vbCrLf
    'apuntamos al final del contenido del TextBox e
    'insertamos los nuevos datos obtenidos
    Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
    Text1.Text = Text1.Text & "Cliente >" & Text2.Text & vbCrLf 'mostramos los datos
    Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
    'borramos Text2
    Text2.Text = ""
    End Sub

    Dejame ver si entedi algo: Al método SendData solo se le pasa como parámetro el dato a enviar (en este caso el contenido de un TextBox + los caracteres de nueva línea y retorno de carro) y este lo envía inmediatamente al socket remoto. Vamos progresando! xD
    
    Cuando el socket remoto nos envía un dato (de la misma forma que realizamos anteriormente) se nos genera el evento "DataArrival()" indicando que tenemos nueva información disponible, y esta información la cogemos con el método "GetData":
    

    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim Buffer As String 'variable para guardar los datos
    'obtenemos los datos y los guardamos en una variable
    Winsock1.GetData Buffer
    'apuntamos al final del contenido del TextBox e
    'insertamos los nuevos datos obtenidos
    Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
    Text1.Text = Text1.Text & "Servidor >" & Buffer 'mostramos los datos
    Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
    End Sub

    **Manejo de errores**
    

    Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
    'cerramos la conexion
    Winsock1.Close
    'mostramos informacion sobre el error
    MsgBox "Error numero " & Number & ": " & Description, vbCritical
    End Sub

    **Ahora solo nos queda probar la aplicacion**WIII uh necesito el server todavia :S
    no necesariamente, se peude probar con paginas web.
    Toma te kb server (?)
    
    [http://img150.imageshack.us/img150/9840/g4nz4.th.png](http://img150.imageshack.us/img150/9840/g4nz4.th.png[IMG)
    
    **APLICACIÓN SERVIDOR**
    Vamos a realizar una aplicación que se mantenga a la escucha de una conexión entrante y la acepte, podrá enviar y recibir datos desde el cliente.
    
    **Creando la interfaz del usuario**
    bueno crear nuevo proyecto y hacer algo parecido a esto:
    [![](http://img514.imageshack.us/img514/8906/g5kr5.th.png)](http://img514.imageshack.us/my.php?image=g5kr5.png)
    
    **Implementando la conexión**
    
    Propiedades necesarias
    - LocalPort: Asignamos el puerto local en el cual deseamos recibir conexiones.
    Métodos necesarios
    - Listen(): Escucha peticiones entrantes.
    - Close(): Cierra la conexión al servidor.
    Eventos involucrados
    - ConnectionRequest(): Ocurre cuando un cliente nos solicita una conexión al servidor.
    - Close(): Ocurre cuando el servidor nos cierra la conexión.
    - Error(): Ocurre en caso de errores.
    
    El código utilizado para el botón "Escuchar" es el siguiente:
    

    Private Sub Command2_Click()
    'cerramos cualquier conexion previa
    Winsock1.Close
    'asignamos el puerto local que abriremos
    Winsock1.LocalPort = Text3.Text
    'deja el socket esuchando conexiones
    Winsock1.Listen
    'desplegamos un mensaje en la ventana
    Text1.SelStart = Len(Text1.Text)
    Text1.Text = Text1.Text & "*** Esuchando conexiones." & vbCrLf
    Text1.SelStart = Len(Text1.Text)
    End Sub

    La primera línea de código cierra la conexión actual, para luego poder modificar los datos y crear una nueva conexión sin que nos de errores.
    
    La siguiente línea le dice en que puerto deseamos recibir conexiones, y luego llama al socket para que quede a la escucha de conexiones en ese puerto.
    
    Hasta aquí el socket solo esta "escuchando" conexiones, es decir aun nadie se puede conectar al servidor completamente porque no se ha implementado esa parte por el momento.
    
    Esto solo nos permite avisarnos cada vez que un cliente se quiera conectar o bien cada vez que un cliente "Solicita una conexión entrante". Cuando este sucede se genera el evento "ConnectionRequest()":
    
    

    Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
    'mostramos un mensaje en la ventana
    Text1.SelStart = Len(Text1.Text)
    Text1.Text = Text1.Text & "*** Peticion numero " & requestID & vbCrLf
    Text1.SelStart = Len(Text1.Text)
    'cerramos previamente el socket
    Winsock1.Close
    'aceptamos la conexion
    Winsock1.Accept requestID
    'desplegamos un mensaje en la ventana
    Text1.SelStart = Len(Text1.Text)
    Text1.Text = Text1.Text & "*** Conexion aceptada, listo para interactuar." & vbCrLf
    Text1.SelStart = Len(Text1.Text)
    End Sub

    Lo primero que habíamos realizado es dejar el socket a la escucha de conexiones (para esto utilizamos el método "Listen"). Con esto ya tenemos un puerto abierto y atento a toda actividad
    
    Cuando un "Cliente" se intenta conectar a ese puerto, el socket lo detectara y para ello generara el evento "ConnectionRequest()" que significa "Petición de conexión" y además le asigna una identidad a esa "Petición" que identifica al "Cliente" remoto. Esta identidad es pasada como parámetro en el evento "ConnectionRequest()" con el nombre de "requestID" y es de tipo "Long".
    
    Para cerrar la conexión basta con usar el método "Close" en cualquier momento:
    
    

    Private Sub Command3_Click()
    'cierra la conexion
    Winsock1.Close
    'desplegamos un mensaje en la ventana
    Text1.SelStart = Len(Text1.Text)
    Text1.Text = Text1.Text & "*** Conexion cerrada por el usuario." & vbCrLf
    Text1.SelStart = Len(Text1.Text)
    End Sub

    Private Sub Winsock1_Close()
    'cierra la conexion
    Winsock1.Close
    'desplegamos un mensaje en la ventana
    Text1.SelStart = Len(Text1.Text)
    Text1.Text = Text1.Text & "*** Conexion cerrada por el Cliente." & vbCrLf
    Text1.SelStart = Len(Text1.Text)
    End Sub

    **Enviando/recibiendo datos**
    
    Esto es idéntico al explicado en la parte del cliente:
    

    Private Sub Command1_Click()
    'enviamos el contenido de Text2
    Winsock1.SendData Text2.Text & vbCrLf
    'apuntamos al final del contenido del TextBox e
    'insertamos los nuevos datos obtenidos
    Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
    Text1.Text = Text1.Text & "Servidor >" & Text2.Text & vbCrLf 'mostramos los datos
    Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
    'borramos Text2
    Text2.Text = ""
    End Sub

    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim Buffer As String 'variable para guardar los datos
    'obtenemos los datos y los guardamos en una variable
    Winsock1.GetData Buffer
    'apuntamos al final del contenido del TextBox e
    'insertamos los nuevos datos obtenidos
    Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
    Text1.Text = Text1.Text & "Cliente >" & Buffer 'mostramos los datos
    Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
    End Sub
    
    ```
    **Manejo de errores**Esto lo vi en algun lado :| ah si en el cliente!!
    ```
    Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
    'cerramos la conexion
    Winsock1.Close
    'mostramos informacion sobre el error
    MsgBox "Error numero " & Number & ": " & Description, vbCritical
    End Sub
    
    ```
    Solo queda probar la aplicacion =)
    
    ahoraaa si keiro conectar dos clientes no se que mierda hacer :S me tira error
    claro, eso esta arreglado para aceptar solo una coneccion.
    voy a enseñar laaplicacion multi-coneccion
    
    **Creando el arreglo de WinSocks**
    
    debemos seguir los sig. pasos:
    1. Agregar un nuevo Winsock al formulario (Winsock2)
    2. Copiar el control (Clic derecho sobre este y seleccionar "Copiar")
    3. Pegar el control en el formulario, y cuando pregunte por si deseas crear el arreglo dile que "Si". (Clic derecho sobre el formulario y seleccionar "Pegar")
    4. Borramos el nuevo Winsock que se ha creado (Winsock2(1)).
    La razón de borrar este último Winsock es porque no nos hace falta, como mencionamos en un principio, nosotros crearemos los Winsocks necesarios de forma dinámica, solo necesitamos tener existente el Winsock2 de índice cero.
    
    **Limpiando código innecesario**
    En realidad no hay código innecesario pero si código que debe cambiar de lugar, como veremos en su momento, por ahora solo nos limitaremos a borrar todo el código del evento "Winsock1_DataArrival" ya que nunca lo usaremos en este Winsock porque solo trabajara como repartidor de trabajo y "Winsock1_ConnectionRequest" que será implementada mas adelante, lo mismo para la acción del botón "Enviar" (Command1_Click).
    
    **Enviando/recibiendo datos**
    Para enviar datos (mediante el botón "enviar") podemos hacerlo directamente con algún socket específico, definiendo su identidad, o bien con todos los sockets recorriendo el arreglo. Esto último es lo que haremos a modo de ejemplo:
    
    ```
    Private Sub Command1_Click()
    Dim numElementos As Integer 'numero de sockets
    Dim i As Integer 'contador
    'obtiene la cantidad de Winsocks que tenemos
    numElementos = Winsock2.UBound
    'recorre el arreglo de sockets
    For i = 0 To numElementos
    'si el socket se encuentra conectado...
    If Winsock2(i).State = sckConnected Then
    'enviamos el contenido de Text2
    Winsock2(i).SendData Text2.Text & vbCrLf
    'apuntamos al final del contenido del TextBox e
    'insertamos los nuevos datos obtenidos
    Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
    Text1.Text = Text1.Text & "Sock" & i & ":Servidor >" & Text2.Text & vbCrLf 'mostramos los datos
    Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
    End If
    Next
    'borramos Text2
    Text2.Text = ""
    End Sub
    
    ```
    Y cuando recibamos datos desde el cliente se nos generara el evento "Winsock2_DataArrival" que ahora incluye un nuevo parámetro "Index" de tipo "Integer" y contiene el número o índice del socket que genera el evento (todo en relación al arreglo de sockets).
    Para recibir datos solo tenemos que tomar en cuenta ese "Index" y el resto es igual a lo visto en el servidor de conexión mono-usuario:
    ```
    Private Sub Winsock2_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    Dim Buffer As String 'variable para guardar los datos
    'obtenemos los datos y los guardamos en una variable
    Winsock2(Index).GetData Buffer
    'apuntamos al final del contenido del TextBox e
    'insertamos los nuevos datos obtenidos
    Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
    Text1.Text = Text1.Text & "Sock" & Index & ":Cliente >" & Buffer 'mostramos los datos
    Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
    End Sub
    
    ```
    **Evento Error y Close**
    El código para los eventos "Error" y "Close" del arreglo de sockets es muy simple:
    ```
    Private Sub Winsock2_Close(Index As Integer)
    'cierra la conexion
    Winsock2(Index).Close
    'desplegamos un mensaje en la ventana
    Text1.SelStart = Len(Text1.Text)
    Text1.Text = Text1.Text & "Sock" & Index & ":*** Conexion cerrada por el Cliente." & vbCrLf
    Text1.SelStart = Len(Text1.Text)
    End Sub
    
    ```
    ```
    Private Sub Winsock2_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
    'cerramos la conexion
    Winsock2(Index).Close
    'mostramos informacion sobre el error
    MsgBox "Error numero " & Number & ": " & Description, vbCritical
    End Sub
    
    ```
    **Escuchando y atendiendo a las conexiones**
    Para facilitar las cosas nosotros haremos una función que se encargue de crear los sockets y que además devuelva el número del nuevo socket creado:
    ```
    'Carga un nuevo socket al arreglo y devuelve su indice
    Private Function NuevoSocket() As Integer
    Dim numElementos As Integer 'numero de sockets
    Dim i As Integer 'contador
    'obtiene la cantidad de Winsocks que tenemos
    numElementos = Winsock2.UBound
    'recorre el arreglo de sockets
    For i = 0 To numElementos
    'si algun socket ya creado esta inactivo
    'utiliza este mismo para la nueva conexion
    If Winsock2(i).State = sckClosed Then
    NuevoSocket = i 'retorna el indice
    Exit Function 'abandona la funcion
    End If
    Next
    'si no encuentra sockets inactivos
    'crea uno nuevo y devuelve su identidad
    Load Winsock2(numElementos + 1) 'carga un nuevo socket al arreglo
    'devuelve el nuevo indice
    NuevoSocket = Winsock2.UBound
    End Function
    
    ```Ahora nos situamos en el evento "ConnectionRequest()" del "Winsock1" (el que hará de recepción) y escribimos el siguiente código:
    
    ```
    Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
    Dim numSocket As Integer 'el numero del socket
    'mostramos un mensaje en la ventana
    Text1.SelStart = Len(Text1.Text)
    Text1.Text = Text1.Text & "*** Peticion numero " & requestID & vbCrLf
    Text1.SelStart = Len(Text1.Text)
    'creamos un nuevo socket
    numSocket = NuevoSocket
    'aceptamos la conexion con el nuevo socket
    Winsock2(numSocket).Accept requestID
    'desplegamos un mensaje en la ventana
    Text1.SelStart = Len(Text1.Text)
    Text1.Text = Text1.Text & "Sock" & numSocket & ":*** Conexion aceptada, listo para interactuar." & vbCrLf
    Text1.SelStart = Len(Text1.Text)
    End Sub
    
    ```
    bueno este es el fin de mi pequeño xD aporte. Espero que les haya gustado, luego potearé muchas cosas mas.esto es bastante complejo pero divertido :D:beer:
    
    Cualquier cosa me avisan,
    Juanpa.-


  • Html - Introduccion

    Segun Wikipedia: HTML, siglas de HyperText Markup Language (Lenguaje de Marcado de Hipertexto), es el lenguaje de marcado predominante para la elaboración de páginas web.

    Particularmente mi opinion respecto de HTML es la de compararlo con Assembler, por que? en una aplicacion de escritorio, cualquier lenguaje se codifica a lenguaje de maquina (asm) y viendolo asi, en la web, cualquier lenguaje termina mostrando un HTML, obviamente hablando desde el lado del cliente, ya que en el servidor puede correr con lenguajes como php, .net, etc.

    El HTML esta basado en una estructura de TAGs encerrados entre los simbolos de menor y mayor. Esta formado por un documento, con cabecera y cuerpo, que a su vez cada uno esta formado por otros elementos.

    Una estructura basica de web seria esta:

    
    .. Aca van caracteristicas como el titulo de la pagina, estilos, scripts, etc ..
    
    .. Aca va el contenido visual de la web ..
    
    

    Teniendo ya una idea de como se va a trabajar con HTML podemos empezar a investigar los TAG que trae. Los mas comunes son:

    	Inserta comentarios ocultos
    	Establece el tipo de documento
     <a>Inserta vínculos o marcadores
     <abbr>Explica abreviaciones
     <acronym>Explica acrónimos
    
    <address>	Provee información de contacto
     <applet>Inserta un applet (scripts)
    <area>		Define sectores para mapas de imagen
     **Texto en negrita
    <base>		URI base para resolver URIs relativas
    <basefont>	Tamaño de la fuente predeterminado
     <bdo>Suprime el algoritmo bidireccional
     <big>Texto en tamaño "grande".
    
    > Citar párrafos
    > 	  	Contiene los elementos a mostrar
    > 
    > 		Fuerza un quiebre de línea</big></bdo>**</applet> </address></acronym></abbr></a> 
    


  • Guía Base de datos con VB6 por Juanpa

    Bueno hoy vengo un con nuevo manual hecho por mi para enseñarles la construccion de un programa que consuma una base de datos y de paso aporto para la super guia :P. Antes que nada les digo que cualquier duda que tengan me pueden consultar. Vamos a empezar por el principio (y si bldo no vamos a empezar por el final xD).

    REQUISITOS PARA SEGUIR ESTE MANUAL

    • Tener instalado Access
    • Tener instalado Visual Basic 6.0
    • Saber un mínimo de programación y razonamiento lógico-matemático
    • Saber usar las herramientas y propiedades del Visual Basic 6.0
    • Saber prender un calefón (?)

    El primer paso consiste en crear una base de datos.

    ¿Qué es una base de datos?
    Una base de datos o banco de datos es un conjunto de datos pertenecientes a un mismo contexto y almacenados sistemáticamente para su posterior uso. En este sentido, una biblioteca puede considerarse una base de datos compuesta en su mayoría por documentos y textos impresos en papel e indexados para su consulta. En la actualidad, y debido al desarrollo tecnológico de campos como la informática y la electrónica, la mayoría de las bases de datos están en formato digital (electrónico), que ofrece un amplio rango de soluciones al problema de almacenar datos. Por supuesto, nosotros nos vamos a inclinar por la base de datos informatica (y si, cla)

    Existen distintos tipos de bases de datos: MySql, Access, etc; en este manual vamos a usar base de datos de access, por lo cual, necesitamos el Access que viene con el paquete que office de Windows. Yo personalmente voy a usar el Microsoft Office Access 2007, porque es el que tengo en esta maquina xD.

    Vamos a abrir el Access 2007 para crear la base de datos. Una vez que está abierto vamos a crear una Base de datos en Blanco y la vamos a llamar "database.mdb" (es decir, la vamos a guardar en formato access 2002-2003 :$)

    Ahora hay que pensar el tipo de programa que queremos para orientar la base de datos a ese programa. Uy me voy a bañar ahora vengo. Bueno volví y estuve pensando en empezar por algo no muy complejo, una tipica demostración para que a partir de esto ustedes mortales hagan cosas mejores. Vamos a hacer un programa que registre los datos básicos de una persona. Entonces vamos a hacer lo siguiente, vamos a crear una tabla (Nota: Access 2007 te crea la primera automaticamente. Nota2: Pueden haber varias tablas en una base de datos) y la vamos a llamar 'Personas'. Vamos a editar los campos con los datos requeridos, para los que usan access 2002-2003 recomiendo usar la vista de diseño. Vamos a usar los datos: Nombre, Apellido, Edad, Telefono. Algo bien simple, no usen tildes para nombrar estos campos porque puede tener repercusiones en el futuro viteh. Una vez terminado esto vamos a agregar algunos registros para ya ir teniendo e ir probando cosas. Yo voy a agregar 5. Entonces quedaría más o menos así:

    Bueno, ahora cerramos esa mier… emm... agradable aplicación y abrimos el Visual Basic 6.0. Vamos a crear un proyecto 'EXE Standard' y digo 'standard' porque me la re banco (?) y se nos va a abrir un formulario. Vamos a hacer lo siguiente, ir a la barra de herramientas> Componentes... > Vamos a buscar Microsoft ADO Data Control 6.0 (OLEDB) > Aceptar.

    Vamos a insertar 4 controles textbox y les vamos a dejar los nombres que vienen por default, una vez hecho eso vamos a insertar el ADODC que es el control que buscamos antes.

    REALIZAR LA CONEXIÓN A LA BASE DE DATOS
    Lo que tenemos que hacer ahora es crear un puente entre el programa y la base de datos para que los habiantes de Baselandia puedan ir de vacaciones al la republica ejecutable (?)
    Lo primero que vamos a hacer es que cada Textbox muestre los datos Nombre, Apellido, Edad y Telefono de la base de datos respectivamente. Hay 2 formas de hacerlo, la primera es la forma manual, es decir, desde propiedades, no la voy a explicar a menos que alguien me lo pida, la idea es hacer que se conecte desde el código.

    Vamos a hacer lo siguiente, vamos a colocar el siguiente código en el Form_Load() y lo voy a explicar línea por línea de ser necesario:

    
    Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & App.Path & "\database.mdb;" & _
    "Persist Security Info=False"
    
    Adodc1.RecordSource = "Select * From Personas"
    
    Set Text1.DataSource = Adodc1
    Text1.DataField = "Nombre"
    Set Text2.DataSource = Adodc1
    Text2.DataField = "Apellido"
    Set Text3.DataSource = Adodc1
    Text3.DataField = "Edad"
    Set Text4.DataSource = Adodc1
    Text4.DataField = "Telefono"
    
    

    Cosa de que nos quede así:

    
    Private Sub Form_Load()
    
    Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & App.Path & "\database.mdb;" & _
    "Persist Security Info=False"
    
    Adodc1.RecordSource = "Select * From Personas"
    
    Set Text1.DataSource = Adodc1
    Text1.DataField = "Nombre"
    Set Text2.DataSource = Adodc1
    Text2.DataField = "Apellido"
    Set Text3.DataSource = Adodc1
    Text3.DataField = "Edad"
    Set Text4.DataSource = Adodc1
    Text4.DataField = "Telefono"
    
    End Sub
    
    

    Con eso ya tendríamos la conexion hecha, si ejecutamos el programa con F5 vamos a ver que ya el programa muestra todos los datos que teníamos en la base de datos a medida que cambiamos con de registro con el control ADODC (NOTA: LOS TEXTBOX FIJENSÉ QUE LOS PUEDEN MODIFICAR, PARA BLOQUEARLOS HAY QUE PONERLE EN TRUE LA PROPIEDAD 'Locked') y NOS EVITAMOS HACER LA CONEXIÓN DE FORMA MANUAL. ¿Cuál es el problema de la conexión de forma manual? El problema es que dentro del control ADODC se establece una RUTA ESPECIFICA, por lo que si queremos instalar el programa en otra maquina o movemos la base de datos del lugar en donde estaba nos va a tirar un desagradable error :P. Ahora paso a explicar Línea por línea qué es cada cosa.

    Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & App.Path & "\database.mdb;" & _
    "Persist Security Info=False"
    

    Odio dar las cosas sin fundamento, pero esto es mas avanzado. ¿De dónde mierda salió esto? Lo que hice fue crear un archivo de tipo .UDL a partir de un simple .TXT, configure todo para que conduzca a la base de datos, luego abrí el UDL que es un archivo de texto plano y copié eso que generó windows y lo pegue como ConnectionString. Reemplazé el C://documents and settings/juanpa/nosequeponer/nosequeotracosaponer/ …. por App.Path, bueno no importa mucho xD, lo impotante de esa línea es que de ahí cambian la ruta. En este caso la base de datos está en la carpeta de el ejecutable.

    Adodc1.RecordSource = "Select * From Personas"
    
    

    Es el comando de consulta Sql, con esa línea le indicamos al programa que lea todos los datos de la tabla 'Personas' (Que en este caso es la única que tenemos).

    Set Text1.DataSource = Adodc1
    Text1.DataField = "Nombre"
    Set Text2.DataSource = Adodc1
    Text2.DataField = "Apellido"
    Set Text3.DataSource = Adodc1
    Text3.DataField = "Edad"
    Set Text4.DataSource = Adodc1
    Text4.DataField = "Telefono"
    
    

    El Datasource le indica al Textbox de donde va a sacar la información, no se olviden que pueden haber varios ADODC entonces les indicamos a todos los textbox que van a sacar los datos del mismo lugar, y en el DataField indica dentro de la base de datos consumida el dato que se va a mostrar, uno va a mostrar el nombre, otro apellido, otro edad y otro teléfono. Ahi ya tenemos la conección a la base de datos.

    ELIMINAR UN REGISTRO DE LA BASE DE DATOS
    Vamos a agregar un botón de comando en el formuulario y adentro del código le vamos a poner:

    If IsNull(Adodc1.Recordset) Then 'Se fija que no sea un registro vacío
    	MsgBox "El registro está vacio y no puede ser borrado"
    Else
    	Adodc1.Recordset.Delete 'Lo borra
    	Adodc1.Recordset.MoveFirst 'Vuelve al primero cambiando de lugar para que no se vea todo blanco y en caso de que no hayan mas registros quede el adodc como Locked
    End If
    
    

    Ahora ya sabemos eliminar un registro de nuestra base de datos, lamentablemente mientras hacia esto borre todos para probarlo xD asi que voy a tener que tipear algunos registros denuevo y me da paja xD.NOTA: si se les acabaron los registros y aprietan en Eliminar obviamente les va a tirar un error en tiempo de ejecucion porque la instruccion es borrar algo que no existe.

    AGREGAR REGISTROS A LA BASE DE DATOS

    Es a mi gusto la parte más didáctica del programa, en cuanto a diseño se puede hacer de diferentes formas, lo mas común es un form aparte con controles textbox, estoy haciendo un programa simple asi que voy a usar inputbox. Colocamos otro boton de comando y agregamos como código:

    Dim A As String, B As String, C As String, D As String 'Variables que pueden no declararse pero las uso para tener todo mas organizado y todas String para no tener problemas con los caracteres que ingresa el usuario
    
    If Adodc1.Recordset.RecordCount <> 0 Then 'Si no hay ningun registro
        Adodc1.Recordset.MoveLast
    End If
    
    Adodc1.Recordset.AddNew 'Agregamos un registro en blanco
    
    'Pedimos Datos
    A = InputBox("Ingrese el Nombre")
    B = InputBox("Ingrese el Apellido")
    C = InputBox("Ingrese la Edad")
    D = InputBox("Ingrese el Teléfono")
    
    'Completamos el registro con los datos que ingresó el usuario
    Adodc1.Recordset("Nombre") = A
    Adodc1.Recordset("Apellido") = B
    Adodc1.Recordset("Edad") = C
    Adodc1.Recordset("Telefono") = D
    
    Adodc1.Recordset.MoveLast
    
    

    Listo, con ese codigo nuestro programa agrega registros a la base de datos. A partir de esto se pueden hacer cosas bastante más complejas y útiles. Si los datos los quieren mostrar en una tabla corte excel buscan en componentes el control Microsoft DataGrid Control (OLEDB). Bueno este es el fin de esta guia, si alguno tiene una pregunta que no dude en consultarme, pero no en este post, por MP. Emm, otra cosa… esta guia la hice especialmente para la super guía de TDS, si lo ven en algún otro lugar les agradecería que me manden un MP avisándome.

    Saludos, Juanpa.



  • Muy buena guia juanpa, aprovecho para comentar que esta permitido realizar consultas en este mismo post siempre y cuando sean consultas reales y sobre temas ya posteados. No ensuciarian el thread ya que esta indexado en el primer post, es decir que postear esta permitido. No abusen porque me voy a dar cuenta si su intencion es robar o comentar, conozco quienes postean en esta seccion, asi q mi punto de vista puede variar para cada user.

    Espero que entre todos hagamos que dia a dia esta guia crezca mas y mas, va a quedar muy buena.



  • MSGBOX

    Yo voy a explicar la funcion MSGBOX.
    Antes que nada, estoy ampliando lo que dijo kenny el primer post ^^

    Bueno, para comenzar se abre el VB (la version que tengan, en mi caso 6), y se crean un proyecto nuevo "exe estandar".
    Todo lo que vamos a necesitar es un command button, al cual le vamos a ir agregando informacion.
    Los MsgBox, poseen el siguiente orden:
    Msgbox "Contenido de mensaje", funion/es,"titulo"

    Para crear un MsgBox simple, se le agrega al Command1 el siguiente codigo:

    Private sub command1_click()

    Msgbox "¿Desea guardar el proyecto"

    End sub

    Ahora, si uno le quiere agregar un icono al Msgbox, se lo puede hacer con una de las siguientes funciones:

    Vbcritical –----> Error
    Vbinformation -------> Informacion
    Vbexclamation ------> Advertencia
    VBQuestion -------> Pregunta

    Ademas, si uno desea puede ponerle el titulo que desee, entre comillas.

    Por lo cual, nuestro Msgbox quedaria asi:

    Private sub command1_click()

    Msgbox "¿Desea guardar el proyecto?", vbquestion, "Guardar Proyecto"

    End sub

    Las funciones mas utilizadas, generalmente, son:

    VbYesNo –---------> Msgbox con opcion de clickear Si o No
    VbYesNoCancel------------> Msgbox con opcion de clickear Si, No o Cancelar
    VbOkonly --------------> Msgbox con opcion de clikear unicmanete Aceptar (el comun)

    Para los 2 primeros Msgbox, se necesitaria un condicional, debido a que si se clickea "Si", pase una accion, y si se clickea "no", pase otra.

    Nuestro Msgbox, quedaria asi:

    Private sub command1_click()

    If msgbox ("¿Desea guardar el archivo?", vbyesno + vbquestion, "Guardar proyecto") = vbyes then
    Msgbox "Proyecto guardado con exito",vbinformation, "Guardar Proyecto"
    Else
    Msgbox "No se guardara su proyecto",vbexclamation, "Guardar Proyecto"
    end if
    End sub

    Lo que hice resien fue poner que, si se clickeaba la opcion Si en el Msgbox, te saltara un cartel diciendote que se guardo el proyecto; y si clickeabas no ("Else"), te saltaba un cartel diferente diciendote que no se iba a guardar tu proyecto.

    Nota: Para poner 2 funciones distintas en el mismo mensaje hay que ponerle un "+" en el medio.

    –-----------------------------------------------------------------------------------

    Ahora voy a explicar algo muy simple, que se trata de poner un msgbox con renglones, en ves de todo en un mismo renglon.
    Los pasos son los mismos:
    Se abre el VB, se crea un proyecto que sea exe estandar y se crea un commmand button.

    A este, le vamos a poner el siguiente codigo:

    Private sub command1_click()

    Msgbox "Usted accedio al centro de ayuda" & vbcrlf & "Para mas información, comuniquese con el mali prueba@hotmail.com"

    end sub

    Y a este boton le ponemos todos los detalles que uno quiera de los explicados anteriormente, como por ejemplo:

    Private Sub Command1_Click()

    MsgBox "Usted a accedido al centro de ayuda" & vbCrLf & "Para mas info. comuniquese con prueba@hotmail.com", vbInformation, "Ayuda"

    End Sub


Log in to reply