elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación Visual Basic / VideoTutorial - Como hacer un Reproductor con lista en Visual Basic 6 en: 13 Agosto 2012, 15:14 pm


Link: http://www.youtube.com/watch?v=gsfF-nUw2H4&feature=plcp

Hola, que tal amigos?, este es mi primer videotutorial en el cual les enseño a como hacer un reproductor de musica y video con visual basic.

Sepan perdonar los errores que tuve con este video, es el primero que hago, desde ya, gracias^^

Suscribanse!! :)

Aqui los códigos necesitados, solo lo copian y lo pegan ^^
http://tinypaste.com/ccfbe89c
2  Programación / .NET (C#, VB.NET, ASP) / (ayuda vb2008) en: 14 Diciembre 2011, 15:54 pm
Hola como están?... quería ver si no podrían aclararme una duda... estoy trabajando en un formulario de Vb .net conectado a una base de datos en Oracle... el tema es que cuando se realice una modificación en una de las filas de la grilla guarde la fecha y la hora de dicha modificación en los campos correspondientes, ya hice una clase para dicho proceso pero tengo problemas para que se guarde en la grilla
disculpen mi ignorancia soy algo nuevo en esto
Desde ya gracias

El codigo en el formulario

Código:
    #Region "para modificar"
    Private Function dt_modificar() As DataTable
    Dim myDataTable As DataTable = New DataTable()

    Dim myDataColumn As DataColumn

    myDataColumn = New DataColumn()
    myDataColumn.DataType = Type.GetType("System.String" )
    myDataColumn.ColumnName = "cod_empresa"
    myDataTable.Columns.Add(myDataColumn)

    myDataColumn = New DataColumn()
    myDataColumn.DataType = Type.GetType("System.String" )
    myDataColumn.ColumnName = "nro_perfil"
    myDataTable.Columns.Add(myDataColumn)

    myDataColumn = New DataColumn()
    myDataColumn.DataType = Type.GetType("System.String" )
    myDataColumn.ColumnName = "fecha_creacion"
    myDataTable.Columns.Add(myDataColumn)

    myDataColumn = New DataColumn()
    myDataColumn.DataType = Type.GetType("System.String" )
    myDataColumn.ColumnName = "cod_persona"
    myDataTable.Columns.Add(myDataColumn)

    myDataColumn = New DataColumn()
    myDataColumn.DataType = Type.GetType("System.String" )
    myDataColumn.ColumnName = "nro_matricula"
    myDataTable.Columns.Add(myDataColumn)

    myDataColumn = New DataColumn()
    myDataColumn.DataType = Type.GetType("System.String" )
    myDataColumn.ColumnName = "usr_alta"
    myDataTable.Columns.Add(myDataColumn)

    myDataColumn = New DataColumn()
    myDataColumn.DataType = Type.GetType("System.String" )
    myDataColumn.ColumnName = "usr_modif"
    myDataTable.Columns.Add(myDataColumn)

    myDataColumn = New DataColumn()
    myDataColumn.DataType = Type.GetType("System.String" )
    myDataColumn.ColumnName = "fec_modif"
    myDataTable.Columns.Add(myDataColumn)

    myDataColumn = New DataColumn()
    myDataColumn.DataType = Type.GetType("System.String" )
    myDataColumn.ColumnName = "observacion"
    myDataTable.Columns.Add(myDataColumn)


    myDataColumn = New DataColumn()
    myDataColumn.DataType = Type.GetType("System.String" )
    myDataColumn.ColumnName = "carga_operacion"
    myDataTable.Columns.Add(myDataColumn)

    myDataColumn = New DataColumn()
    myDataColumn.DataType = Type.GetType("System.String" )
    myDataColumn.ColumnName = "tipo_documento"
    myDataTable.Columns.Add(myDataColumn)

    myDataColumn = New DataColumn()
    myDataColumn.DataType = Type.GetType("System.String" )
    myDataColumn.ColumnName = "nro_documento"
    myDataTable.Columns.Add(myDataColumn)

    Return myDataTable
    End Function

    Private Function add_dt_modificar(ByVal cod_empresa As String, ByVal nro_perfil As String, ByVal cod_persona As String, ByVal nro_matricula As String, ByVal usr_modif As String, ByVal fec_modif As Date, ByVal observacion As String, ByVal carga_operacion As String, ByVal tipo_documento As String, ByVal nro_documento As String, ByVal myTable As DataTable)
    Dim row As DataRow
    row = myTable.NewRow()
    row("cod_empresa" ) = cod_empresa
    row("nro_perfil" ) = nro_perfil

    row("cod_persona" ) = cod_persona
    row("nro_matricula" ) = nro_matricula

    row("usr_modif" ) = usr_modif
    row("fec_modif" ) = fec_modif
    row("observacion" ) = observacion
    row("carga_operacion" ) = carga_operacion
    row("tipo_documento" ) = tipo_documento
    row("nro_documento" ) = nro_documento

    myTable.Rows.Add(row)
    Return 0
    End Function

    Private Sub CargarTablaActualizar()
    If txt_nro_perfil.Text <> String.Empty And txt_cod_persona.Text <> String.Empty And txt_nro_matricula.Text <> String.Empty And txt_observacion.Text <> String.Empty And txt_carga_operacion.Text <> String.Empty And cb_tipo_documento.SelectedValue <> String.Empty And txt_nro_documento.Text <> String.Empty And My.Settings.validacion = 3 Then

    Dim va As Boolean = False
    If para_modificar.Rows.Count < -1 Then
    add_dt_modificar(My.Settings.cod_empresa.Trim(), Me.txt_nro_perfil.Text.Trim(), Me.txt_cod_persona.Text.Trim(), Me.txt_nro_matricula.Text.Trim(), Me.txt_usr_modif.Text.Trim(), Me.txt_fec_modif.Text.Trim(), Me.txt_observacion.Text.Trim(), Me.txt_carga_operacion.Text.Trim(), Me.cb_tipo_documento.SelectedValue.ToString(), Me.txt_nro_documento.Text.Trim(), para_modificar)
    Else
    For i = 0 To para_modificar.Rows.Count - 1
    If va = False Then
    If para_modificar.Rows(i)("nro_perfil" ).ToString() = txt_nro_perfil.Text Then

    para_modificar.Rows(i)("cod_persona" ) = txt_cod_persona.Text
    para_modificar.Rows(i)("nro_matricula" ) = txt_nro_matricula.Text

    para_modificar.Rows(i)("usr_modif" ) = txt_usr_modif.Text
    para_modificar.Rows(i)("fec_modif" ) = txt_fec_modif.Text
    para_modificar.Rows(i)("observacion" ) = txt_observacion.Text
    para_modificar.Rows(i)("carga_operacion" ) = txt_carga_operacion.Text
    para_modificar.Rows(i)("tipo_documento" ) = cb_tipo_documento.SelectedValue
    para_modificar.Rows(i)("nro_documento" ) = txt_nro_documento.Text
    va = True
    End If
    End If
    Next
    If va = False Then
    add_dt_modificar(My.Settings.cod_empresa.Trim(), Me.txt_nro_perfil.Text.Trim(), Me.txt_cod_persona.Text.Trim(), Me.txt_nro_matricula.Text.Trim(), Me.txt_usr_modif.Text.Trim(), Me.txt_fec_modif.Text.Trim(), Me.txt_observacion.Text.Trim(), Me.txt_carga_operacion.Text.Trim(), Me.cb_tipo_documento.SelectedValue, Me.txt_nro_documento.Text.Trim(), para_modificar)
    End If
    End If
    End If
    End Sub
    #End Region


   ' El proceso de guardar


    ElseIf para_modificar.Rows.Count - 1 > -1 Or My.Settings.validacion = 3 Then
    Try
    Dim listas As List(Of ClassLibrary1.DLL.ClsSysDate) = SqlBSPERSOC.SysData()
    txt_usr_modif.Text = My.Settings.cod_usuario
    txt_fec_modif.DataBindings.Clear()
    txt_fec_modif.DataBindings.Add("Text", listas, "mSysDate" )
    Actualizar()
    mensaje()
    My.Settings.validacion = 0
    txt_nro_perfil.Text = String.Empty
    CargarDatos()
    Catch ex As Exception
    para_modificar.Rows.Clear()

    End Try
    End If
    'en todos los casos
    txt_nro_perfil.Focus()

    End Sub


   ' El Sub actualizar

    Private Sub Actualizar()
    Dim lista As String = ClassLibrary1.DAL.DataAccess.SqlPermisos.Pre_Update(My.Settings.vderecho)
    If Not lista.Equals("S", StringComparison.OrdinalIgnoreCase) Then
    MessageBox.Show(lista.ToString, "Problemas de Permiso", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1)
    Else
    Try
    For i = 0 To para_modificar.Rows.Count - 1

    SqlBSPERSOC.Modificar(My.Settings.cod_empresa, para_modificar.Rows(i)("nro_perfil" ).ToString, para_modificar.Rows(i)("cod_persona" ).ToString, para_modificar.Rows(i)("nro_matricula" ).ToString, para_modificar.Rows(i)("usr_modif" ).ToString, para_modificar.Rows(i)("fec_modif" ).ToString, para_modificar.Rows(i)("observacion" ).ToString, para_modificar.Rows(i)("carga_operacion" ).ToString, para_modificar.Rows(i)("tipo_documento" ).ToString, para_modificar.Rows(i)("nro_documento" ).ToString)
    Next
    para_modificar.Rows.Clear()
    Catch ex As Exception
    Throw New Exception
    End Try
    End If
    End Sub








El Sql
Código:
 #Region "Modificar"
    Public Shared Function Modificar(ByVal cod_empresa As String, ByVal nro_perfil As String, ByVal cod_persona As String, ByVal nro_matricula As String, ByVal usr_modif As String, ByVal fec_modif As Date, ByVal observacion As String, ByVal carga_operacion As String, ByVal tipo_documento As String, ByVal nro_documento As String) As Integer
    Dim filas As Integer = 0
    Try
    Dim cmd As New OracleCommand("PKG_BASE.MBSPERSOC", conn)
    cmd.Parameters.Add("p_cod_empresa", cod_empresa)
    cmd.Parameters.Add("p_nro_perfil", nro_perfil)
    cmd.Parameters.Add("p_cod_persona", cod_persona)
    cmd.Parameters.Add("p_nro_matricula", nro_matricula)
    cmd.Parameters.Add("p_usr_modif", usr_modif)
    cmd.Parameters.Add("p_fec_modif", fec_modif)
    cmd.Parameters.Add("p_observacion", observacion)
    cmd.Parameters.Add("p_carga_operacion", carga_operacion)
    cmd.Parameters.Add("p_tipo_documento", tipo_documento)
    cmd.Parameters.Add("p_nro_documento", nro_documento)

    cmd.Parameters.Add(New OracleParameter("p_mensaje", OracleDbType.NVarchar2, ParameterDirection.Output, "", ParameterDirection.Output))
    cmd.CommandType = CommandType.StoredProcedure
    conn.Open()
    filas = cmd.ExecuteNonQuery()
    If (conn.State <> ConnectionState.Closed) Then
    conn.Close()
    End If
    Catch ex As Exception
    MessageBox.Show(ex.Message, "Error en Actualización", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
    conn.Close()
    Throw New Exception
    Finally
    End Try
    Return filas
    End Function

    #End Region



El Cls




Código:
    Namespace DLL

    Public Class ClsBSPERSOC
    Dim f As Nullable(Of Date)
    Private cod_empresa As String
    Private nro_perfil As String
    Private fecha_creacion As Date
    Private cod_persona As String
    Private nro_matricula As String
    Private usr_alta As String
    Private usr_modif As String
    Private fec_modif As Date
    Private observacion As String
    Private carga_operacion As String
    Private tipo_documento As String
    Private nro_documento As String

    Public Property mcod_empresa()
    Get
    Return cod_empresa
    End Get
    Set(ByVal value)
    cod_empresa = value
    End Set
    End Property

    Public Property mnro_perfil()
    Get
    Return nro_perfil
    End Get
    Set(ByVal value)
    nro_perfil = value
    End Set
    End Property

    Public Property mfecha_creacion()
    Get
    Return If(fecha_creacion.ToString("dd/MM/yyyy" ) = "01/01/0001", f.ToString, fecha_creacion.ToString("dd/MM/yyyy" ))
    End Get
    Set(ByVal value)
    fecha_creacion = value
    End Set
    End Property

    Public Property mcod_persona()
    Get
    Return cod_persona
    End Get
    Set(ByVal value)
    cod_persona = value
    End Set
    End Property

    Public Property mnro_matricula()
    Get
    Return nro_matricula
    End Get
    Set(ByVal value)
    nro_matricula = value
    End Set
    End Property

    Public Property musr_alta()
    Get
    Return usr_alta
    End Get
    Set(ByVal value)
    usr_alta = value
    End Set
    End Property

    Public Property musr_modif()
    Get
    Return usr_modif
    End Get
    Set(ByVal value)
    usr_modif = value
    End Set
    End Property

    Public Property mfec_modif()
    Get
    Return If(fec_modif.ToString("dd/MM/yyyy" ) = "01/01/0001", f.ToString, fec_modif.ToString("dd/MM/yyyy" ))
    End Get
    Set(ByVal value)
    fec_modif = value
    End Set
    End Property

    Public Property mobservacion()
    Get
    Return observacion
    End Get
    Set(ByVal value)
    observacion = value
    End Set
    End Property

    Public Property mcarga_operacion()
    Get
    Return carga_operacion
    End Get
    Set(ByVal value)
    carga_operacion = value
    End Set
    End Property

    Public Property mtipo_documento()
    Get
    Return tipo_documento
    End Get
    Set(ByVal value)
    tipo_documento = value
    End Set
    End Property

    Public Property mnro_documento()
    Get
    Return nro_documento
    End Get
    Set(ByVal value)
    nro_documento = value
    End Set
    End Property

    Sub New()
    fecha_creacion = Now()

    End Sub

    Sub New(ByVal cod_empresa As String, ByVal nro_perfil As String, ByVal fecha_creacion As String, ByVal cod_persona As String, ByVal nro_matricula As String, ByVal usr_alta As String, ByVal usr_modif As String, ByVal fec_modif As String, ByVal observacion As String, ByVal carga_operacion As String, ByVal tipo_documento As String, ByVal nro_documento As String)
    Me.cod_empresa = cod_empresa
    Me.nro_perfil = nro_perfil
    Me.fecha_creacion = fecha_creacion
    Me.cod_persona = cod_persona
    Me.nro_matricula = nro_matricula
    Me.usr_alta = usr_alta
    Me.usr_modif = usr_modif
    Me.fec_modif = fec_modif
    Me.observacion = observacion
    Me.carga_operacion = carga_operacion
    Me.tipo_documento = tipo_documento
    Me.nro_documento = nro_documento

    End Sub
    End Class
    End Namespace



El Procedure del PL/SQL

   
Código:


    Procedure MBSPERSOC( p_cod_empresa in Varchar2,
    p_nro_perfil in Number,
    p_cod_persona in Varchar2,
    p_nro_matricula in Varchar2,
    p_usr_modif in Varchar2,
    p_fec_modif in Date,
    p_observacion in Varchar2,
    p_carga_operacion in Varchar2,
    p_tipo_documento in Varchar2,
    p_nro_documento in Varchar2,
    p_mensaje Out Varchar2) Is

    vcod_empresa Varchar2(5) := p_cod_empresa;
    vnro_perfil Number := p_nro_perfil;
    vcod_persona Varchar2(15) := p_cod_persona;
    vnro_matricula Varchar2(15) := p_nro_matricula;
    vusr_modif Varchar2(40) := p_usr_modif;
    vfec_modif Date := p_fec_modif;
    vobservacion Varchar2(1000) := p_observacion;
    vcarga_operacion Varchar2(1) := p_carga_operacion;
    vtipo_documento Varchar2(1) := p_tipo_documento;
    vnro_documento Varchar2(15) := p_nro_documento;


    Begin
    Update BS_PERFIL_CABECERA
    Set cod_persona = vcod_persona,
    nro_matricula = vnro_matricula,
    usr_modif = vusr_modif,
    fec_modif = vfec_modif,
    observacion = vobservacion,
    carga_operacion = vcarga_operacion,
    tipo_documento = vtipo_documento,
    nro_documento = vnro_documento


    Where cod_empresa = vcod_empresa and nro_perfil = vnro_perfil;

    If sql%Rowcount = 0 Then
    p_mensaje := ('No se ha actualizado ningún registro. ');
    Rollback;
    End If;
    Exception
    When Others Then
    p_mensaje := ('Error durante la actualización del registro. '||Sqlerrm);
    End;
3  Programación / Programación Visual Basic / Como hacer tu propio instalador (Setup.exe) en vb 6 y 2008 en: 4 Septiembre 2011, 23:04 pm
Bienvenidos...

En este post les doy los códigos y enseño como hacer un instalador sencillo en visual basic 6.0 o visual basic 2008, ya que e visto tantas personas preguntando la misma cosa ¿Como hago un instalador en Visual Basic?

bueno esto yo me lo pille solo (si es repost avisen)


Primero con el visual basic 2008:

Necesitamos 3 forms

form1: 2 botones (Siguiente, Cancelar)

código del botón Siguiente:

Código:
On Error GoTo labela
        GetAttr( "Dirección de tu programa" )
        If MsgBox( "El Programa se encuentra instalado. Desea reinstalarlo?", vbInformation + vbYesNo, "Setup Info" ) = vbYes Then
            Form2.Show()
            Me.Hide()
        Else
            MsgBox( "Se a cancelado la instalacion", vbInformation, "Setup end" )
            End
        End If
        Exit Sub
labela:
        Form2.Show()
        Me.Hide()
En donde dice "GetAttr("Dirección de tu programa" ) , en vez de Dirección de tu programa ponle la dirección de tu programa pero no le quiten las comillas
(recomiendo que no le pongan en disco local c: ya que yo no pude hacerlo asi, por que a la hora de instalar me manda un error)

Código Botón Cancelar:

Código:
If MsgBox( "Esta seguro que desea cancelar la instalacion?", vbInformation + vbYesNo, "Instalacion de Nombre de Tu Programa" ) = vbYes Then
End
Else
End If


Form2: 2 botones (Instalar y Cancelar)

Código Botón Instalar:

Código:
FileCopy( "Nombre Completo del Programa", "D:Nombre Completo del Programa" )

en donde dise Nombre Completo del Programa ponle el nombre completo de tu programa mas la extención. Ej.: "MyPrograma.exe"
y donde dice "D:Nombre Completo del Programa" ponganle la dirección de donde va a instalar o compiar el programa
al igual que al anterior ponganle el nombre completo del programa mas extensión, y la D: se le puede cambiar con la dirección del programa,
pero como antes mencione, no le pongan en el disco C ya que a veces producen errores

este codigo se alarga dependiendo de los archivos ejemplo:

Código:
FileCopy( "Nombre Completo del Programa", "D:Nombre Completo del Programa" )
FileCopy( "Otros archivos mas extensión", "D:Otros archivos mas extensión" )

al final de los códigos le ponemos el siguiente código:
Código:
me.hide
form2.show
y si quieren que el cursor (flechita del mouse) cambie al modo de cargando o algo por el estilo el siguiente codigo ensima del código anterior

Código:
me.cursor = 11

y el codigo terminaria siendo asi:
Código:
me.cursor = 11
FileCopy( "Nombre Completo del Programa", "D:Nombre Completo del Programa" )
FileCopy( "Otros archivos mas extensión", "D:Otros archivos mas extensión" )
me.hide
form2.show

Código Botón Cancelar:

Código:
If MsgBox( "Esta seguro que desea cancelar la instalacion?", vbInformation + vbYesNo, "Instalacion de Nombre de Tu Programa" ) = vbYes Then
End
Else
End If

Form3: 1 Botón (Salir), 1 CheckedBox(Abrir el Programa al Salir)

botón salir:

Código:
If CheckBox1.CheckState = CheckState.Checked Then
            Shell("Dirección en donde se instalo el programa mas su extensión y nombre" )
            Me.Close()
        Else
            Me.Close()
        End If

Para generar su proyecto en los menus busca "Generar" y darle click en Generar "Mas nombre de tu proyecto"
bueno una vez que generamos el proyecto vamos a la carpeta de release y copiamos los archivos del instalador y lo pegamos junto a la carpeta
de los archivos a instalar






ahora pasamos al visual basic 6

3 forms

form1: 2 comandbuttons o botones (siguiente y cancelar)

código boton siguiente:

Citar
On Error GoTo labela
a  = GetAttr( "Dirección de tu programa" )
        If MsgBox( "El Programa se encuentra instalado. Desea reinstalarlo?", vbInformation + vbYesNo, "Setup Info" ) = vbYes Then
Form2.Show
          Unload Me
        Else
           a = MsgBox( "Se a cancelado la instalacion", vbInformation, "Setup end" )
            End
        End If
        Exit Sub
labela:
        Form2.Show
        Unload Me


En donde dice "GetAttr("Dirección de tu programa" ), en vez de Dirección de tu programa ponle la dirección de tu programa pero no le quiten las comillas
este si acepta guardar los archivos en disco local c: y en cualquier carpeta de ella menos por supuesto los que ni siquiera el usuario tiene permiso a entrar

Botón Cancelar:

Código:
If MsgBox( "Esta seguro que desea cancelar la instalacion?", vbInformation + vbYesNo, "Instalacion de Nombre de Tu Programa" ) = vbYes Then
End
Else
End If

Form2: 2 command (Instalar y Cancelar)

Botón Instalar:

Código:
 Me.MousePointer = 11
            On Error Resume Next
            FileCopy App.Path + "Nombre de Tu programa con extención", "Dirección mas Nombre de Tu programa con extención"
 Unload Me
            Form3.Show

En donde dice "Nombre de Tu programa con extención" ingresa el nombre de tu programa mas extenció. Ej.: MiPrograma.exe
y donde dice "Dirección mas Nombre de Tu programa con extención" ponle la dirección de tu programa mas su nombre ej.: "C : Program FilesMiPrograma.exe"
y en ninguna de las dos quiten las comillas ya que asi el código no funciona.
y como el anterior este tambien se puede duplicar con la cantidad de archivos ej.:

Código:
 Me.MousePointer = 11
            On Error Resume Next
            FileCopy App.Path + "Nombre de Tu programa con extención", "Dirección mas Nombre de Tu programa con extención"
            FileCopy App.Path + "Otros Archivos", "Dirección mas Otros Archivos con extención"
Unload Me
            Form3.Show

botón cancelar:

Código:
If MsgBox( "Esta seguro que desea cancelar la instalacion?", vbInformation + vbYesNo, "Instalacion de Nombre de Tu Programa" ) = vbYes Then
End
Else
End If

Y por último el Form3 : 1 comand (Salir) y un CheckBox(Abrir el Programa al Salir)

Código del Botón Salir:

Código:
If Check1.Value = Checked Then
            Shell("Dirección en donde se instalo el programa mas su extensión y nombre" )
Unload Me
Else
Unload Me
End If

Para guardar en un .exe (ejecutable) van a archivo y guardar o generar "mas el nombre de su proyecto o programa"
Esto va lo mismo lo generan y guardan en la carpeta de donde quedan los archivos a instalar



Bueno Ahora a por un truquillo Para sus programas a instalar.
este código sirve para que cuando el programa no este instalado salte un error y que diga que el programa no esta instalado

Código para Vb 2008 (esto deben pegarlo en el codigo del form o class form ) :

Código:
 On Error GoTo labela
        GetAttr( "Dirección de tu programa" )
        Me.Show()
        Exit Sub
labela:
        MsgBox("El Programa no se encuentra Instalado en su Sistema", vbCritical, "Error" )
        End


Y para el VB 6 (esto lo pegan en el codigo del form o ensima del codigo del form ) :

Código:
On Error GoTo labela
      a = GetAttr( "Dirección de tu programa" )
   Me.Show
              Exit Sub
labela:
        a = MsgBox( "El Programa no se encuentra Instalado en su Sistema", vbCritical, "Error" )
        End


Bueno espero haberles servido en algo


Perdonen por que el post no este tan decorado es que lo hice primero en un bloc de notas

---------------------------------------------------------------------------------------------------

Fuente: http://www.taringa.net/posts/hazlo-tu-mismo/10598125/Como-hacer-tu-propio-instalador-_Setup_exe_-en-vb-6-y-2008.html
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines