Hola a todos.
Hoy les traigo un programa hecho en Visual Basic .Net el cual es un tipo "agenda" que más bien es un control detrabajadores con su respectivos salarios y departamentos. Lo mejor aquí es que aprendes como se manejan los archivos de accesso secuencial en VB.Net
El programa se ve así:

y la manera de usarse es esta:
- Primero tienes que crear un nuevo archivo, para esto ve a "Archivo" y presiona "Abrir"; entonces en vez de seleccionar un archivo ya existente, lo que haces es que escribes en el cuadro de texto del OpenFileDialog el nombre de tu nuevo archivo (por ejemplo file.txt) y presionas aceptar, esto lo que hará es crear un nuevo archivo llamado file.txt y abrirlo al mismo tiempo.
- Después de crearlo y abrirlo, entonces ve al menú "Registros" y presiona "Nuevo", entonces los cuadros de texto se limpiaran y le dará el foco al campo "# de trabajador", entonces llenas los campos y presionas el botón "Guardar" que aparecerá ahí. Sino pues presionas "Cancelar". Esto lo que hará será crearte un nuevo registro y guardarlo en un structure. Ojo aquí: durante el tiempo de ejecución del programa, para agregar, modificar y eliminar registros, NO se trabaja con el archivo secuencial; lo que se hace es estar trabajando con un Structure llamado "datos", de esta manera te facilitas muchísimo las cosas. Solo trabajas con el archivo secuencial al abrir un archivo con contenido, o al presionar "Guardar".
El código está debidamente comentado:
VB.NET:
-
Imports System.IO
-
Public Class Form1
-
Structure datos
-
Dim numtra As Integer
-
Dim nombre As String
-
Dim dep As String
-
Dim salario As Single
-
End Structure
-
-
Dim archivo As String = ""
-
Dim vdatos(1000) As datos
-
Dim registro As Integer = 0 'total de registros
-
Dim registronow As Integer = 0 'registro actual
-
Dim banmodificar As Integer = 0
-
-
Private Sub AbrirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AbrirToolStripMenuItem.Click
-
Dim dlgopen As New OpenFileDialog
-
dlgopen.CheckFileExists = False
-
If dlgopen.ShowDialog() = Windows.Forms.DialogResult.OK Then
-
'creamos flujo
-
Dim flujoopen As New FileStream(dlgopen.FileName, FileMode.OpenOrCreate, FileAccess.ReadWrite)
-
Dim leerfile As New BinaryReader(flujoopen)
-
archivo = dlgopen.FileName
-
'leemos
-
If leerfile.PeekChar <> -1 Then 'si si existe texto
-
'obtenemos total de registros
-
registro = CType(Math.Ceiling(flujoopen.Length / 70), Integer)
-
-
Dim a As Integer
-
For a = 0 To registro - 1
-
leerfile.BaseStream.Seek(70 * a, SeekOrigin.Begin) '70 bytes de largo por cada registro
-
vdatos(a).numtra = leerfile.ReadInt32.ToString
-
vdatos(a).nombre = leerfile.ReadString.ToString
-
vdatos(a).dep = leerfile.ReadString.ToString
-
vdatos(a).salario = leerfile.ReadSingle.ToString
-
Next
-
-
mnunuevo.Enabled = True
-
verregistro(0)
-
'habilitamos menus de navegacion respecto a la posicion actual
-
If registro> 1 Then 'si hay mas de un registro
-
If registronow = registro - 1 Then 'si esta en la ultima posicion
-
mnuanterior.Enabled = True
-
mnuprimero.Enabled = True
-
ElseIf registronow = 0 Then 'si esta en la primer posicion
-
mnuultimo.Enabled = True
-
mnusiguiente.Enabled = True
-
Else 'si cae aki es porke es un registro de en medio
-
mnuanterior.Enabled = True
-
mnuprimero.Enabled = True
-
mnuultimo.Enabled = True
-
mnusiguiente.Enabled = True
-
End If
-
End If
-
-
Else
-
mnunuevo.Enabled = True
-
sblabel.Text = "Sin registros"
-
txtnumtra.Text = ""
-
txtnombre.Text = ""
-
txtdep.Text = ""
-
txtsalario.Text = ""
-
registro = 0 'inicializamos los registros
-
End If
-
GuardarToolStripMenuItem.Enabled = True
-
leerfile.Close()
-
flujoopen.Close()
-
'ponemos nombre de archivo
-
lblfile.Text = Path.GetFileName(dlgopen.FileName)
-
txtnumtra.Focus()
-
End If
-
End Sub
-
-
Private Sub GuardarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GuardarToolStripMenuItem.Click
-
If registro> 0 Then
-
Dim flujosave As New FileStream(archivo, FileMode.Create, FileAccess.Write)
-
Dim escribirfile As New BinaryWriter(flujosave)
-
Dim a As Integer
-
-
For a = 0 To registro - 1
-
escribirfile.BaseStream.Seek(70 * a, SeekOrigin.Begin) '70 bytes de largo por cada registro
-
escribirfile.Write(CType(vdatos(a).numtra, Integer))
-
escribirfile.Write(CType(vdatos(a).nombre, String))
-
escribirfile.Write(CType(vdatos(a).dep, String))
-
escribirfile.Write(CType(vdatos(a).salario, Single))
-
Next
-
-
escribirfile.Close()
-
flujosave.Close()
-
End If
-
End Sub
-
-
Private Sub SalirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SalirToolStripMenuItem.Click
-
Me.Close()
-
End Sub
-
-
Private Sub mnunuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnunuevo.Click
-
'limpiamos
-
txtnumtra.Text = ""
-
txtnombre.Text = ""
-
txtdep.Text = ""
-
txtsalario.Text = ""
-
txtnumtra.Focus()
-
-
'habilitamos botones
-
cmdguardar.Visible = True
-
cmdcancelar.Visible = True
-
-
'deshabilitamos menus
-
mnumodificar.Enabled = False
-
mnueliminar.Enabled = False
-
mnunuevo.Enabled = False
-
mnuprimero.Enabled = False
-
mnusiguiente.Enabled = False
-
mnuanterior.Enabled = False
-
mnuultimo.Enabled = False
-
End Sub
-
-
Private Sub cmdguardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdguardar.Click
-
If txtnumtra.Text = "" Or txtnombre.Text = "" Or txtdep.Text = "" Or txtsalario.Text = "" Then
-
MessageBox.Show("Llena correctamente todoos los campos", "Cuidado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
-
Else
-
If banmodificar = 1 Then 'si estaba modificando entonces guardamos en la posicion que estaba
-
banmodificar = 0
-
'guardamos en vector pero en la posicion actual
-
vdatos(registronow).numtra = CType(txtnumtra.Text, Integer)
-
vdatos(registronow).nombre = txtnombre.Text
-
vdatos(registronow).dep = txtdep.Text
-
vdatos(registronow).salario = CType(txtsalario.Text, Single)
-
-
Else 'significa que esta guardando un nuevo registro
-
-
'guardamos en vector
-
vdatos(registro).numtra = CType(txtnumtra.Text, Integer)
-
vdatos(registro).nombre = txtnombre.Text
-
vdatos(registro).dep = txtdep.Text
-
vdatos(registro).salario = CType(txtsalario.Text, Single)
-
-
registronow = registro 'el registro actual sera el recientemente creado
-
registro += 1
-
End If
-
-
cmdcancelar.Visible = False
-
cmdguardar.Visible = False
-
txtnumtra.Focus()
-
sblabel.Text = "Registro " & registronow + 1 & "/" & registro
-
-
'habilitamos menus de navegacion respecto a la posicion actual
-
If registro> 1 Then 'si hay mas de un registro
-
If registronow = registro - 1 Then 'si esta en la ultima posicion
-
mnuanterior.Enabled = True
-
mnuprimero.Enabled = True
-
ElseIf registronow = 0 Then 'si esta en la primer posicion
-
mnuultimo.Enabled = True
-
mnusiguiente.Enabled = True
-
Else 'si cae aki es porke es un registro de en medio
-
mnuanterior.Enabled = True
-
mnuprimero.Enabled = True
-
mnuultimo.Enabled = True
-
mnusiguiente.Enabled = True
-
End If
-
End If
-
-
'habilitamos botones de edicion
-
mnumodificar.Enabled = True
-
mnueliminar.Enabled = True
-
mnunuevo.Enabled = True
-
End If
-
End Sub
-
-
Private Sub cmdcancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdcancelar.Click
-
cmdcancelar.Visible = False
-
cmdguardar.Visible = False
-
mnunuevo.Enabled = True
-
If banmodificar = 1 Then 'si estaba modificando pero cancelo
-
banmodificar = 0
-
verregistro(registronow)
-
Else
-
txtnumtra.Text = ""
-
txtnombre.Text = ""
-
txtdep.Text = ""
-
txtsalario.Text = ""
-
End If
-
-
If registro> 0 Then 'si minimo existe un registro
-
mnumodificar.Enabled = True
-
mnueliminar.Enabled = True
-
End If
-
-
'habilitamos menus de navegacion respecto a la posicion actual
-
If registro> 1 Then 'si hay mas de un registro
-
If registronow = registro - 1 Then 'si esta en la ultima posicion
-
mnuanterior.Enabled = True
-
mnuprimero.Enabled = True
-
ElseIf registronow = 0 Then 'si esta en la primer posicion
-
mnuultimo.Enabled = True
-
mnusiguiente.Enabled = True
-
Else 'si cae aki es porke es un registro de en medio
-
mnuanterior.Enabled = True
-
mnuprimero.Enabled = True
-
mnuultimo.Enabled = True
-
mnusiguiente.Enabled = True
-
End If
-
End If
-
End Sub
-
-
Sub verregistro(ByVal numreg) 'esta funcion nos desplaza entre los registros en memoria
-
registronow = numreg
-
txtnumtra.Text = vdatos(registronow).numtra
-
txtnombre.Text = vdatos(registronow).nombre
-
txtdep.Text = vdatos(registronow).dep
-
txtsalario.Text = vdatos(registronow).salario
-
sblabel.Text = "Registro " & registronow + 1 & "/" & registro
-
txtnumtra.Focus()
-
End Sub
-
-
Private Sub mnuprimero_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuprimero.Click
-
verregistro(0)
-
'si le dio primero, significa que a fuerzas minimo hay 2 registros
-
mnuprimero.Enabled = False
-
mnuanterior.Enabled = False
-
mnusiguiente.Enabled = True
-
mnuultimo.Enabled = True
-
End Sub
-
-
Private Sub mnuanterior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuanterior.Click
-
verregistro(registronow - 1) 'despues de mandar llamar este procedimiento, el valor de registronow cambia
-
If registronow = 0 Then 'si ya llego al principio
-
mnuprimero.Enabled = False
-
mnuanterior.Enabled = False
-
Else
-
mnuprimero.Enabled = True
-
mnuanterior.Enabled = True
-
End If
-
-
'si presionó anterior, significa que minimo hay 2 registros, entonces como ya te cambio a uno anterior ps habilitamos sin preguntar, "siguiente" y "ultimo"
-
mnusiguiente.Enabled = True
-
mnuultimo.Enabled = True
-
End Sub
-
-
Private Sub mnusiguiente_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnusiguiente.Click
-
verregistro(registronow + 1) 'despues de mandar llamar este procedimiento, el valor de registronow cambia
-
If registronow = registro - 1 Then 'si ya llego al ultimo registro
-
mnuultimo.Enabled = False
-
mnusiguiente.Enabled = False
-
Else
-
mnuultimo.Enabled = True
-
mnusiguiente.Enabled = True
-
End If
-
-
'si presionno siguiente signifiica que mminimo hay 2 regsitros, entonces habilitamos sin preguntar, "anterior" y "primero"
-
mnuprimero.Enabled = True
-
mnuanterior.Enabled = True
-
End Sub
-
-
Private Sub mnuultimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuultimo.Click
-
verregistro(registro - 1)
-
'si presiono el ultimo signifiica que mminimo hay 2 registros asi que habilitamos "anterior" y "primero" sin preguntar
-
mnuanterior.Enabled = True
-
mnuprimero.Enabled = True
-
mnuultimo.Enabled = False
-
mnusiguiente.Enabled = False
-
End Sub
-
-
Private Sub mnumodificar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnumodificar.Click
-
cmdguardar.Visible = True
-
cmdcancelar.Visible = True
-
-
banmodificar = 1 'habilitamos bandera que nos dice que esta modificando un registro
-
-
'deshabilitamos menus
-
mnumodificar.Enabled = False
-
mnueliminar.Enabled = False
-
mnunuevo.Enabled = False
-
mnuprimero.Enabled = False
-
mnusiguiente.Enabled = False
-
mnuanterior.Enabled = False
-
mnuultimo.Enabled = False
-
txtnumtra.Focus()
-
End Sub
-
-
Private Sub mnueliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnueliminar.Click
-
If MessageBox.Show("¿Esta seguro que desea eliminar este registro?", "Cuidado", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = Windows.Forms.DialogResult.Yes Then
-
vdatos(registronow).numtra = CType(0, Integer)
-
vdatos(registronow).nombre = ""
-
vdatos(registronow).dep = ""
-
vdatos(registronow).salario = CType(0, Single)
-
-
If registro = 1 Then 'si el registro eliminado era el uniko ke habia
-
mnueliminar.Enabled = False
-
mnumodificar.Enabled = False
-
mnuprimero.Enabled = False
-
mnusiguiente.Enabled = False
-
mnuanterior.Enabled = False
-
mnuultimo.Enabled = False
-
-
'limpiamos cuadros de text
-
txtnumtra.Text = ""
-
txtnombre.Text = ""
-
txtdep.Text = ""
-
txtsalario.Text = ""
-
-
sblabel.Text = "Sin registros"
-
registro = 0
-
registronow = 0
-
Else
-
If registronow <> registro - 1 Then 'si cae aki es porke habia por lo menos dos registros y el eliminado no fue el ultimo
-
'recorremos vector
-
Dim a As Integer
-
For a = registronow To registro - 2
-
vdatos(a).numtra = vdatos(a + 1).numtra
-
vdatos(a).nombre = vdatos(a + 1).nombre
-
vdatos(a).dep = vdatos(a + 1).dep
-
vdatos(a).salario = vdatos(a + 1).salario
-
Next
-
verregistro(registronow)
-
Else
-
registronow -= 1
-
verregistro(registronow)
-
End If
-
'decrementamos contadores
-
registro -= 1
-
sblabel.Text = "Registro " & registronow + 1 & "/" & registro
-
End If
-
-
'habilitamos menus de navegacion respecto a la posicion actual
-
If registro> 1 Then 'si hay mas de un registro
-
If registronow = registro - 1 Then 'si esta en la ultima posicion
-
mnuanterior.Enabled = True
-
mnuprimero.Enabled = True
-
ElseIf registronow = 0 Then 'si esta en la primer posicion
-
mnuultimo.Enabled = True
-
mnusiguiente.Enabled = True
-
Else 'si cae aki es porke es un registro de en medio
-
mnuanterior.Enabled = True
-
mnuprimero.Enabled = True
-
mnuultimo.Enabled = True
-
mnusiguiente.Enabled = True
-
End If
-
End If
-
-
End If
-
End Sub
-
End Class
Y aquí están los archivos.