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:
  1. Imports System.IO
  2. Public Class Form1
  3.     Structure datos
  4.         Dim numtra As Integer
  5.         Dim nombre As String
  6.         Dim dep As String
  7.         Dim salario As Single
  8.     End Structure
  9.  
  10.     Dim archivo As String = ""
  11.     Dim vdatos(1000) As datos
  12.     Dim registro As Integer = 0  'total de registros
  13.     Dim registronow As Integer = 0  'registro actual
  14.     Dim banmodificar As Integer = 0
  15.  
  16.     Private Sub AbrirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AbrirToolStripMenuItem.Click
  17.         Dim dlgopen As New OpenFileDialog
  18.         dlgopen.CheckFileExists = False
  19.         If dlgopen.ShowDialog() = Windows.Forms.DialogResult.OK Then
  20.             'creamos flujo
  21.             Dim flujoopen As New FileStream(dlgopen.FileName, FileMode.OpenOrCreate, FileAccess.ReadWrite)
  22.             Dim leerfile As New BinaryReader(flujoopen)
  23.             archivo = dlgopen.FileName
  24.             'leemos
  25.             If leerfile.PeekChar <> -1 Then 'si si existe texto
  26.                 'obtenemos total de registros
  27.                 registro = CType(Math.Ceiling(flujoopen.Length / 70), Integer)
  28.  
  29.                 Dim a As Integer
  30.                 For a = 0 To registro - 1
  31.                     leerfile.BaseStream.Seek(70 * a, SeekOrigin.Begin)   '70 bytes de largo por cada registro
  32.                     vdatos(a).numtra = leerfile.ReadInt32.ToString
  33.                     vdatos(a).nombre = leerfile.ReadString.ToString
  34.                     vdatos(a).dep = leerfile.ReadString.ToString
  35.                     vdatos(a).salario = leerfile.ReadSingle.ToString
  36.                 Next
  37.  
  38.                 mnunuevo.Enabled = True
  39.                 verregistro(0)
  40.                 'habilitamos menus de navegacion respecto a la posicion actual
  41.                 If registro> 1 Then 'si hay mas de un registro
  42.                     If registronow = registro - 1 Then 'si esta en la ultima posicion
  43.                         mnuanterior.Enabled = True
  44.                         mnuprimero.Enabled = True
  45.                     ElseIf registronow = 0 Then 'si esta en la primer posicion
  46.                         mnuultimo.Enabled = True
  47.                         mnusiguiente.Enabled = True
  48.                     Else 'si cae aki es porke es un registro de en medio
  49.                         mnuanterior.Enabled = True
  50.                         mnuprimero.Enabled = True
  51.                         mnuultimo.Enabled = True
  52.                         mnusiguiente.Enabled = True
  53.                     End If
  54.                 End If
  55.  
  56.             Else
  57.                 mnunuevo.Enabled = True
  58.                 sblabel.Text = "Sin registros"
  59.                 txtnumtra.Text = ""
  60.                 txtnombre.Text = ""
  61.                 txtdep.Text = ""
  62.                 txtsalario.Text = ""
  63.                 registro = 0  'inicializamos los registros
  64.             End If
  65.             GuardarToolStripMenuItem.Enabled = True
  66.             leerfile.Close()
  67.             flujoopen.Close()
  68.             'ponemos nombre de archivo
  69.             lblfile.Text = Path.GetFileName(dlgopen.FileName)
  70.             txtnumtra.Focus()
  71.         End If
  72.     End Sub
  73.  
  74.     Private Sub GuardarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GuardarToolStripMenuItem.Click
  75.         If registro> 0 Then
  76.             Dim flujosave As New FileStream(archivo, FileMode.Create, FileAccess.Write)
  77.             Dim escribirfile As New BinaryWriter(flujosave)
  78.             Dim a As Integer
  79.  
  80.             For a = 0 To registro - 1
  81.                 escribirfile.BaseStream.Seek(70 * a, SeekOrigin.Begin)   '70 bytes de largo por cada registro
  82.                 escribirfile.Write(CType(vdatos(a).numtra, Integer))
  83.                 escribirfile.Write(CType(vdatos(a).nombre, String))
  84.                 escribirfile.Write(CType(vdatos(a).dep, String))
  85.                 escribirfile.Write(CType(vdatos(a).salario, Single))
  86.             Next
  87.  
  88.             escribirfile.Close()
  89.             flujosave.Close()
  90.         End If
  91.     End Sub
  92.  
  93.     Private Sub SalirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SalirToolStripMenuItem.Click
  94.         Me.Close()
  95.     End Sub
  96.  
  97.     Private Sub mnunuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnunuevo.Click
  98.         'limpiamos
  99.         txtnumtra.Text = ""
  100.         txtnombre.Text = ""
  101.         txtdep.Text = ""
  102.         txtsalario.Text = ""
  103.         txtnumtra.Focus()
  104.  
  105.         'habilitamos botones
  106.         cmdguardar.Visible = True
  107.         cmdcancelar.Visible = True
  108.  
  109.         'deshabilitamos menus
  110.         mnumodificar.Enabled = False
  111.         mnueliminar.Enabled = False
  112.         mnunuevo.Enabled = False
  113.         mnuprimero.Enabled = False
  114.         mnusiguiente.Enabled = False
  115.         mnuanterior.Enabled = False
  116.         mnuultimo.Enabled = False
  117.     End Sub
  118.  
  119.     Private Sub cmdguardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdguardar.Click
  120.         If txtnumtra.Text = "" Or txtnombre.Text = "" Or txtdep.Text = "" Or txtsalario.Text = "" Then
  121.             MessageBox.Show("Llena correctamente todoos los campos", "Cuidado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
  122.         Else
  123.             If banmodificar = 1 Then 'si estaba modificando entonces guardamos en la posicion que estaba
  124.                 banmodificar = 0
  125.                 'guardamos en vector pero en la posicion actual
  126.                 vdatos(registronow).numtra = CType(txtnumtra.Text, Integer)
  127.                 vdatos(registronow).nombre = txtnombre.Text
  128.                 vdatos(registronow).dep = txtdep.Text
  129.                 vdatos(registronow).salario = CType(txtsalario.Text, Single)
  130.  
  131.             Else 'significa que esta guardando un nuevo registro
  132.  
  133.                 'guardamos en vector
  134.                 vdatos(registro).numtra = CType(txtnumtra.Text, Integer)
  135.                 vdatos(registro).nombre = txtnombre.Text
  136.                 vdatos(registro).dep = txtdep.Text
  137.                 vdatos(registro).salario = CType(txtsalario.Text, Single)
  138.  
  139.                 registronow = registro 'el registro actual sera el recientemente creado
  140.                 registro += 1
  141.             End If
  142.  
  143.             cmdcancelar.Visible = False
  144.             cmdguardar.Visible = False
  145.             txtnumtra.Focus()
  146.             sblabel.Text = "Registro " & registronow + 1 & "/" & registro
  147.  
  148.             'habilitamos menus de navegacion respecto a la posicion actual
  149.             If registro> 1 Then 'si hay mas de un registro
  150.                 If registronow = registro - 1 Then 'si esta en la ultima posicion
  151.                     mnuanterior.Enabled = True
  152.                     mnuprimero.Enabled = True
  153.                 ElseIf registronow = 0 Then 'si esta en la primer posicion
  154.                     mnuultimo.Enabled = True
  155.                     mnusiguiente.Enabled = True
  156.                 Else 'si cae aki es porke es un registro de en medio
  157.                     mnuanterior.Enabled = True
  158.                     mnuprimero.Enabled = True
  159.                     mnuultimo.Enabled = True
  160.                     mnusiguiente.Enabled = True
  161.                 End If
  162.             End If
  163.  
  164.             'habilitamos botones de edicion
  165.             mnumodificar.Enabled = True
  166.             mnueliminar.Enabled = True
  167.             mnunuevo.Enabled = True
  168.         End If
  169.     End Sub
  170.  
  171.     Private Sub cmdcancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdcancelar.Click
  172.         cmdcancelar.Visible = False
  173.         cmdguardar.Visible = False
  174.         mnunuevo.Enabled = True
  175.         If banmodificar = 1 Then 'si estaba modificando pero cancelo
  176.             banmodificar = 0
  177.             verregistro(registronow)
  178.         Else
  179.             txtnumtra.Text = ""
  180.             txtnombre.Text = ""
  181.             txtdep.Text = ""
  182.             txtsalario.Text = ""
  183.         End If
  184.  
  185.         If registro> 0 Then 'si minimo existe un registro
  186.             mnumodificar.Enabled = True
  187.             mnueliminar.Enabled = True
  188.         End If
  189.  
  190.         'habilitamos menus de navegacion respecto a la posicion actual
  191.         If registro> 1 Then 'si hay mas de un registro
  192.             If registronow = registro - 1 Then 'si esta en la ultima posicion
  193.                 mnuanterior.Enabled = True
  194.                 mnuprimero.Enabled = True
  195.             ElseIf registronow = 0 Then 'si esta en la primer posicion
  196.                 mnuultimo.Enabled = True
  197.                 mnusiguiente.Enabled = True
  198.             Else 'si cae aki es porke es un registro de en medio
  199.                 mnuanterior.Enabled = True
  200.                 mnuprimero.Enabled = True
  201.                 mnuultimo.Enabled = True
  202.                 mnusiguiente.Enabled = True
  203.             End If
  204.         End If
  205.     End Sub
  206.  
  207.     Sub verregistro(ByVal numreg) 'esta funcion nos desplaza entre los registros en memoria
  208.         registronow = numreg
  209.         txtnumtra.Text = vdatos(registronow).numtra
  210.         txtnombre.Text = vdatos(registronow).nombre
  211.         txtdep.Text = vdatos(registronow).dep
  212.         txtsalario.Text = vdatos(registronow).salario
  213.         sblabel.Text = "Registro " & registronow + 1 & "/" & registro
  214.         txtnumtra.Focus()
  215.     End Sub
  216.  
  217.     Private Sub mnuprimero_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuprimero.Click
  218.         verregistro(0)
  219.         'si le dio primero, significa que a fuerzas minimo hay 2 registros
  220.         mnuprimero.Enabled = False
  221.         mnuanterior.Enabled = False
  222.         mnusiguiente.Enabled = True
  223.         mnuultimo.Enabled = True
  224.     End Sub
  225.  
  226.     Private Sub mnuanterior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuanterior.Click
  227.         verregistro(registronow - 1) 'despues de mandar llamar este procedimiento, el valor de registronow cambia
  228.         If registronow = 0 Then 'si ya llego al principio
  229.             mnuprimero.Enabled = False
  230.             mnuanterior.Enabled = False
  231.         Else
  232.             mnuprimero.Enabled = True
  233.             mnuanterior.Enabled = True
  234.         End If
  235.  
  236.         'si presionó anterior, significa que minimo hay 2 registros, entonces como ya te cambio a uno anterior ps habilitamos sin preguntar, "siguiente" y "ultimo"
  237.         mnusiguiente.Enabled = True
  238.         mnuultimo.Enabled = True
  239.     End Sub
  240.  
  241.     Private Sub mnusiguiente_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnusiguiente.Click
  242.         verregistro(registronow + 1) 'despues de mandar llamar este procedimiento, el valor de registronow cambia
  243.         If registronow = registro - 1 Then 'si ya llego al ultimo registro
  244.             mnuultimo.Enabled = False
  245.             mnusiguiente.Enabled = False
  246.         Else
  247.             mnuultimo.Enabled = True
  248.             mnusiguiente.Enabled = True
  249.         End If
  250.  
  251.         'si presionno siguiente signifiica que mminimo hay 2 regsitros, entonces habilitamos sin preguntar, "anterior" y "primero"
  252.         mnuprimero.Enabled = True
  253.         mnuanterior.Enabled = True
  254.     End Sub
  255.  
  256.     Private Sub mnuultimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuultimo.Click
  257.         verregistro(registro - 1)
  258.         'si presiono el ultimo signifiica que mminimo hay 2 registros asi que habilitamos "anterior" y "primero" sin preguntar
  259.         mnuanterior.Enabled = True
  260.         mnuprimero.Enabled = True
  261.         mnuultimo.Enabled = False
  262.         mnusiguiente.Enabled = False
  263.     End Sub
  264.  
  265.     Private Sub mnumodificar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnumodificar.Click
  266.         cmdguardar.Visible = True
  267.         cmdcancelar.Visible = True
  268.  
  269.         banmodificar = 1 'habilitamos bandera que nos dice que esta modificando un registro
  270.  
  271.         'deshabilitamos menus
  272.         mnumodificar.Enabled = False
  273.         mnueliminar.Enabled = False
  274.         mnunuevo.Enabled = False
  275.         mnuprimero.Enabled = False
  276.         mnusiguiente.Enabled = False
  277.         mnuanterior.Enabled = False
  278.         mnuultimo.Enabled = False
  279.         txtnumtra.Focus()
  280.     End Sub
  281.  
  282.     Private Sub mnueliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnueliminar.Click
  283.         If MessageBox.Show("¿Esta seguro que desea eliminar este registro?", "Cuidado", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = Windows.Forms.DialogResult.Yes Then
  284.             vdatos(registronow).numtra = CType(0, Integer)
  285.             vdatos(registronow).nombre = ""
  286.             vdatos(registronow).dep = ""
  287.             vdatos(registronow).salario = CType(0, Single)
  288.  
  289.             If registro = 1 Then 'si el registro eliminado era el uniko ke habia
  290.                 mnueliminar.Enabled = False
  291.                 mnumodificar.Enabled = False
  292.                 mnuprimero.Enabled = False
  293.                 mnusiguiente.Enabled = False
  294.                 mnuanterior.Enabled = False
  295.                 mnuultimo.Enabled = False
  296.  
  297.                 'limpiamos cuadros de text
  298.                 txtnumtra.Text = ""
  299.                 txtnombre.Text = ""
  300.                 txtdep.Text = ""
  301.                 txtsalario.Text = ""
  302.  
  303.                 sblabel.Text = "Sin registros"
  304.                 registro = 0
  305.                 registronow = 0
  306.             Else
  307.                 If registronow <> registro - 1 Then 'si cae aki es porke habia por lo menos dos registros y el eliminado no fue el ultimo 
  308.                     'recorremos vector
  309.                     Dim a As Integer
  310.                     For a = registronow To registro - 2
  311.                         vdatos(a).numtra = vdatos(a + 1).numtra
  312.                         vdatos(a).nombre = vdatos(a + 1).nombre
  313.                         vdatos(a).dep = vdatos(a + 1).dep
  314.                         vdatos(a).salario = vdatos(a + 1).salario
  315.                     Next
  316.                     verregistro(registronow)
  317.                 Else
  318.                     registronow -= 1
  319.                     verregistro(registronow)
  320.                 End If
  321.                 'decrementamos contadores
  322.                 registro -= 1
  323.                 sblabel.Text = "Registro " & registronow + 1 & "/" & registro
  324.             End If
  325.  
  326.             'habilitamos menus de navegacion respecto a la posicion actual
  327.             If registro> 1 Then 'si hay mas de un registro
  328.                 If registronow = registro - 1 Then 'si esta en la ultima posicion
  329.                     mnuanterior.Enabled = True
  330.                     mnuprimero.Enabled = True
  331.                 ElseIf registronow = 0 Then 'si esta en la primer posicion
  332.                     mnuultimo.Enabled = True
  333.                     mnusiguiente.Enabled = True
  334.                 Else 'si cae aki es porke es un registro de en medio
  335.                     mnuanterior.Enabled = True
  336.                     mnuprimero.Enabled = True
  337.                     mnuultimo.Enabled = True