Terminal al estilo MS-DOS

Simular la entrada del usuario como una pantalla al estilo MS-DOS

 

Revisión del 10/Jun/98


Pues eso, no es nada del otro mundo, pero en un programilla que estoy haciendo me dio el punto de hacer que la entrada del usuario fuese al estilo de una terminal de esas de fósforo verde y aquí está el resultado.

Entre otras cosas interesantes, puedes encontrar aquí una revisión de hacer scroll en controles, ya que se usa un picture que hace de contenedor virtual del picture que se usa para "ennegrecer" la pantalla y donde se imprime lo que el usuario ha ido tecleando.
La entrada del usuario se hace en un TextBox normal y corriente, intenté hacerlo directamente en el Picture, pero era un trabajo extra que me recordaba a los tiempos de MS-DOS y la verdad es que no es necesario tomarse tanto trabajo cuando el textbox funciona medio bien.
Aunque en el ejemplo que adjunto no lo hago, todo lo que se muestre en "la pantalla del terminal" se puede almacenar en un listBox con idea de poder guardar el contenido en el disco, el código necesario para poder hacer eso está en el procedimiento ImprimirDOS, es un simple List1.Additem, pero puede ser interesante usarlo, así se podrá usar lo que se haya tecleado.

El programilla ese en el que he usado esto es una versión del programa Eliza para Visual Basic. No sé si sabes de que va esto de Eliza, pero es una especie de psiquiatra "electrónico", con el que se puede conversar y esas cosas... cuando lo tenga más "acabado" lo pondré por aquí...

Este es el código de esta utilidad y una imagen de cómo quedaría:


La pantalla en funcionamiento

El código.

Sólo se necesita un Form y este es el código necesario para hacerlo funcionar:

'------------------------------------------------------------------
'Prueba de una terminal de texto                        ( 8/Jun/98)
'
'©Guillermo 'guille' Som, 1998
'------------------------------------------------------------------
Option Explicit

Dim difSW As Long
Dim difSH As Long

'posiciones dentro del picDos
Private picX As Long
Private picY As Long
Private picTW As Long
Private picTH As Long


Private Sub cmdCls_Click()
    With picDOS
        .Cls
        .Top = 0
        .Left = 0
    End With
    'Borrar el contenido del ListBox
    'Si se quisiera guardar el contenido, aquí sería un buen sitio
    'para hacerlo, antes de borrarlo, por supuesto.
    'List1.Clear
    picX = 0
    picY = -picTH
    VScroll1.Value = 0
    HScroll1.Value = 0
    ImprimirDOS ""
    Text1.SetFocus
End Sub


Private Sub cmdSalir_Click()
    Unload Me
    End
End Sub


Private Sub Form_Load()
    'Inicialización
    picX = 0
    picY = 0

    'El contenedor visual debe estar contenido en el virtual
    Set picDOS.Container = picScroll1
    'El text1 contenido en el contenedor visual
    Set Text1.Container = picDOS

    'Diferencia entre el ScaleWidth con el Width
    difSW = ScaleWidth - Width
    'Diferencia entre el ScaleHeight con el Height
    difSH = ScaleHeight - Height

    With HScroll1
        .Left = 0
        .SmallChange = 120
        .LargeChange = 360
    End With
    With VScroll1
        .Top = 0
        .SmallChange = 120
        .LargeChange = 360
    End With
    With Text1
        .Left = 0
        .Text = "> "
        .SelStart = 2
        .TabIndex = 0
    End With
    With picDOS
        picTH = .TextHeight("H")
        picTW = .TextWidth("W")
        .CurrentX = 0
        .CurrentY = 0
        .Height = picTH * 20
        .Width = picTW * 200
        picScroll1.Height = .Height
    End With

    ImprimirDOS "Esto es un ejemplo de una simulación de terminal de caracteres", True

End Sub


Private Sub Form_Resize()
    On Local Error Resume Next

    If WindowState <> vbMinimized Then
        'posicionar los commands
        With cmdSalir
            .Top = ScaleHeight - 540
            .Left = ScaleWidth - 1335
        End With
        cmdCls.Top = ScaleHeight - 540

        If ScaleWidth - VScroll1.Width > 0 And ScaleHeight - HScroll1.Height > 0 Then
            picScroll1.Move 0, 0, ScaleWidth - VScroll1.Width, _
			ScaleHeight - HScroll1.Height - (cmdSalir.Height + 240)
            If picDOS.Height < picScroll1.Height Then
                picDOS.Height = picScroll1.Height
            End If
            If picDOS.Width < picScroll1.Width Then
                picDOS.Width = picScroll1.Width
            End If
            picDOS.Move 0, 0
        End If

        HScroll1.Top = picScroll1.Height
        HScroll1.Width = picScroll1.Width
        '
        VScroll1.Left = picScroll1.Width
        VScroll1.Height = picScroll1.Height
        '
        HScroll1.Max = picDOS.Width - picScroll1.Width
        VScroll1.Max = picDOS.Height - picScroll1.Height
        '
        VScroll1.Enabled = (picScroll1.Height < picDOS.Height)
        HScroll1.Enabled = (picScroll1.Width < picDOS.Width)
        'Ajustar el ancho del Text1
        Text1.Width = picScroll1.ScaleWidth
    End If

    Err = 0
End Sub


Private Sub picDOS_Click()
    'El TextBox siempre debe tener el foco
    Text1.SetFocus
End Sub


Private Sub HScroll1_Change()
    picDOS.Left = -HScroll1.Value
End Sub


Private Sub HScroll1_GotFocus()
    Text1.SetFocus
End Sub


Private Sub VScroll1_Change()
    picDOS.Top = -VScroll1.Value
End Sub


Private Sub VScroll1_GotFocus()
    Text1.SetFocus
End Sub


Private Sub Form_Unload(Cancel As Integer)
    Set Form1 = Nothing
End Sub


Private Sub ImprimirDOS(ByVal sText As String, Optional ByVal NuevaLinea As Boolean = True)
    'Imprimir el texto de entrada en el picDos
    'Si se NuevaLinea tiene un valor True (valor por defecto)
    'lo siguiente que se imprima se hará en una nueva línea
    '
    With picDOS
        .CurrentX = picX
        .CurrentY = picY
        picDOS.Print sText;
        If NuevaLinea Then
            .CurrentX = 0
            .CurrentY = .CurrentY + picTH
            'Si se quiere guardar el contenido de todo lo escrito,
            'hacerlo al cambiar de línea.
            'Se puede usar un ListBox oculto para contener el texto
            'List1.AddItem sText
            Text1 = "> "
            Text1.SelStart = 2
        End If
        picX = .CurrentX
        picY = .CurrentY
        Text1.Top = .CurrentY
        If Text1.Top + Text1.Height > .Height Then
            .Height = .Height + Text1.Height
            .Top = .Top - Text1.Height
            picScroll1.Height = .Height - cmdSalir.Height - difSH
            Form_Resize
            VScroll1.Value = VScroll1.Max
        End If
    End With
End Sub


Private Sub Text1_KeyPress(KeyAscii As Integer)
    If KeyAscii = 13 Then
        KeyAscii = 0
        ImprimirDOS Text1
    End If
End Sub

Si quieres bajarte los listados, pulsa este link. (TerminalDOS.zip 3.46 KB)


ir al índice