program ejemplo_archivos;
uses crt,dos,sysutils;
{en este ejemplo se refleja el uso de registros con archivos
haciendo el uso de insercion, modificacion , y borrado fisico de los
registros}
type
TipoRegistro = Record
Numero : Longint;
Nombre : String[40];
Direccion : String[40];
Telefono : String[10];
End;
TipoArchivo = File Of TipoRegistro;
{*------|------|------|------|------|------|------|------|------|------|----*}
Procedure AperturaDeArchivo(var TArchivo:Tipoarchivo);
var
Error: Word;
Tecla:Char;
Begin
Assign(TArchivo,'c:Archivo.dat');
{$I-}
Reset(TArchivo);
Error:=IOResult;
{$I+}
If Error <> 0 Then
Begin
textattr:=14+4*16;
gotoxy(4,24);write('Creando Bases Temporal !! ');
rewrite(TArchivo);
End;
End;
{*------|------|------|------|------|------|------|------|------|------|----*}
procedure AperturaDeArchivoTemporal(var TTmpAArchivo:TipoArchivo);
var
Error: word;
Tecla:Char;
Begin
Assign(TTmpAArchivo,'c:Archivo.Tmp');
{$I-}
Reset(TTmpAArchivo);
Error:=IOResult;
{$I+}
If Error <> 0 Then
Begin
textattr:=14+4*16;
gotoxy(4,24);write('Creando Bases Temporal !! ');
rewrite(TTmpAArchivo);
End;
End;
{*------|------|------|------|------|------|------|------|------|------|----*}
function BuscaRegistro(Var AArchivo:tipoArchivo;Var TIRegistro:TipoRegistro;Numero:LongInt):longint;
Var
Encontrado:longint;
Begin
textattr:=14+4*16;
gotoxy(4,24);write('Buscando Registro..');
Encontrado :=-1; {inicializamos Encontrado a -1, valor inexistente}
Seek(AArchivo,0); {Posicionamos al inicio el puntero del archivo}
While not EOF(AArchivo) do {iniciamos ciclode recorrido del archivo}
Begin
Read(AArchivo,TIRegistro); {Leemos el Registro segun posicion del puntero}
IF TIRegistro.Numero = Numero then{Comparamos el n£mero de registo con el numero solicitado}
Begin {si es igual el registro encontrado}
Encontrado:=FilePos(AArchivo)-1; {se envia la posicion del registro hallado}
Seek(AARchivo,FileSize(AArchivo)); {se envia el puntero al final del archivo para terminar ciclo}
End;
End;
IF Encontrado <> -1 then {si Encontrado no es igual a -1 , mandamos el valor de la funcion}
Begin
BuscaRegistro:=Encontrado;
End
Else {si no fue encontrado regresamos -1 a la busqueda}
Begin
BuscaRegistro:=-1;
End;
textattr:=0+2*16;
gotoxy(4,24);write(' ');
End;
{*------|------|------|------|------|------|------|------|------|------|----*}
Procedure BorraRegistro(Var AArchivo:Tipoarchivo; TIRegistro:TipoRegistro;Numero:LongInt);
var
TmpArchivo:tipoArchivo;
TmpRegistro:tipoRegistro;
EncontradoB:longint;
Begin {Buscamos si existe el Registro a borrar}
EncontradoB:=BuscaRegistro(AArchivo,TIRegistro,Numero);
IF EncontradoB <> -1 then {Si existe}
Begin
seek(AArchivo,0); {nos posicionamos al inicio del archivo}
While not eof(AArchivo) do {hacemos un ciclo de vaciado de registros a un archivo temporal menos el eliminado}
Begin
Read(AArchivo,TIRegistro); {leemos el registro completo}
IF TIRegistro.Numero <> Numero then {comparamos el campo Registro.numero con el solicitado }
Begin
AperturaDeArchivoTemporal(TmpArchivo); {creamos el temporal}
seek (TmpArchivo,filesize(TmpArchivo)); {nos posicionamos al final del archivo temporal}
write(TmpArchivo,TIRegistro); {escribimos el registro}
Close(TmpArchivo);{cerramos el registro}
End;
End;
Close(AArchivo); {cerramos la bd de trabajo}
erase(AArchivo); {eliminamos la bd de trabajo}
{ se puede usar en caso de no contar con la utileria sysutils
Assign(TmpArchivo,'c:Archivo.Tmp');
Rename(TmpArchivo,'c:Archivo.dat'), en el caso de RenameFile }
If RenameFile ('c:Archivo.tmp','c:Archivo.dat') then
begin
Gotoxy(3,24);write('Registro Eliminado');
Delay(600);
End;
End {encontrado <> -1}
Else
Begin
textattr:=14+4*16;
gotoxy(27,12);write('No Hallado ......!! ');
Delay(1000);
Close(AArchivo); {cerramos la bd de trabajo}
End;
End;
{*------|------|------|------|------|------|------|------|------|------|----*}
Procedure InicializaRegistro(Var TiRegistro : TipoRegistro);
Begin
TiRegistro.Numero :=0;
TiRegistro.Nombre :='';
TiRegistro.Direccion:='';
TiRegistro.Telefono :='';
End;
{*------|------|------|------|------|------|------|------|------|------|----*}
Procedure Alta(TiRegistro:TipoRegistro;Var TiArchivo :TipoArchivo);
Var
Encontrado:Longint;
TmpNumero:Longint;
Salir:char;
Begin
Repeat
InicializaRegistro(TiRegistro);
textattr:=7+0*16;{atributos de pantalla}
Clrscr;
Gotoxy(25,4);write('Alta de Registro');
Gotoxy(25,10);write('Proporcione Numero : ');
readln(TmpNumero);
AperturaDeArchivo(TIArchivo); {aperturamos el archivo}
Encontrado:= BuscaRegistro(TiArchivo,TIRegistro,TmpNumero); {buscamos el registro}
Close(Tiarchivo); {cerramos el archivo}
If Encontrado = -1 Then {no existe}
Begin
textattr:=7+0*16;{atributos de pantalla}
Tiregistro.Numero:=TmpNumero;
Gotoxy(25,12);write('Proporcione Nombre : ');
readln(TiRegistro.Nombre );
Gotoxy(25,14);write('Proporcione Direccion : ');
readln(TiRegistro.Direccion );
Gotoxy(25,16);write('Proporcione Tel‚fono : ');
readln(TiRegistro.Telefono);
{posicionamos el puntero al final del archivo y guardamos}
AperturaDeArchivo(TIArchivo);
Seek (TIArchivo,filesize(TIArchivo));{posicionamos el puntero al final del archivo}
Write(TiArchivo,TiRegistro);{guardamos el registro al final del archivo}
Close(TiArchivo);
delay(100);
End
else {si existe}
begin
Gotoxy(15,17);write('Registro Existente,Pulse Enter');
readkey;
end;
gotoxy(20,22);write('Desea Continuar Almacenando Registros [S/N]');
Salir:=Readkey;
Until (Salir='n') or (Salir='N');
End;
{*------|------|------|------|------|------|------|------|------|------|----*}
Procedure Baja(TiRegistro:TipoRegistro;Var TiArchivo :TipoArchivo);
Var
Encontrado:Longint;
TmpNumero:Longint;
Salir:char;
Begin
Repeat
InicializaRegistro(TiRegistro);
textattr:=7+0*16;{atributos de pantalla}
Clrscr;
Gotoxy(25,4);write('Baja de Registro');
Gotoxy(25,10);write('Proporcione Numero : ');
readln(TmpNumero);
AperturaDeArchivo(TIArchivo); {aperturamos el archivo}
Encontrado:= BuscaRegistro(TiArchivo,TIRegistro,TmpNumero); {buscamos el registro}
Close(Tiarchivo); {cerramos el archivo}
If Encontrado <> -1 Then {existe}
Begin
AperturaDeArchivo(TIArchivo); {aperturamos el archivo}
BorraRegistro(Tiarchivo,TIRegistro,TmpNumero); {llamada al procedimiento de borrado fisico}
End
Else {si no esxiste el registro}
Begin
Gotoxy(15,17);write('Registro No Existe,Pulse Enter');
readkey;
End;
Gotoxy(20,22);Write('Desea Continuar Dando de Baja a Registros [S/N]');
Salir:=Readkey;
Until (Salir='n') or (Salir='N');
End;
{*------|------|------|------|------|------|------|------|------|------|----*}
Procedure Modificacion(TiRegistro:TipoRegistro;Var TiArchivo :TipoArchivo);
Var
Encontrado:Longint;
Salir:char;
Begin
Repeat
InicializaRegistro(TiRegistro);
textattr:=7+0*16;{atributos de pantalla}
Clrscr;
Gotoxy(25,4);write('Modificacion de Registro');
Gotoxy(25,10);write('Proporcione Numero : ');
readln(TiRegistro.Numero);
AperturaDeArchivo(TIArchivo); {aperturamos el archivo}
Encontrado:= BuscaRegistro(TiArchivo,TIRegistro,TiRegistro.Numero); {buscamos el registro}
Close(Tiarchivo); {cerramos el archivo}
If Encontrado <> -1 Then {existe}
Begin
textattr:=7+0*16;{atributos de pantalla}
Gotoxy(25,12);write('Proporcione Nombre : ');
readln(TiRegistro.Nombre );
Gotoxy(25,14);write('Proporcione Direccion : ');
readln(TiRegistro.Direccion );
Gotoxy(25,16);write('Proporcione Tel‚fono : ');
readln(TiRegistro.Telefono);
AperturaDeArchivo(TIArchivo); {aperturamos el archivo}
seek (TIArchivo,Encontrado);{posicionamos el p£ntero en la posici¢n donde se encontr¢ el registro en el archivo}
write(TiArchivo,TiRegistro);{escribimos el registor modificado}
close(TiArchivo);
End
Else
Begin
Gotoxy(15,17);write('Registro No Existe,Pulse Enter');
readkey;
End;
Gotoxy(20,22);Write('Desea Continuar Modificando Registros [S/N]');
Salir:=Readkey;
Until (Salir='n') or (Salir='N');
End;
{*------|------|------|------|------|------|------|------|------|------|----*}
Procedure Consulta(TiRegistro:TipoRegistro;Var TiArchivo :TipoArchivo);
Var
Encontrado:Longint;
Salir:char;
Begin
Repeat
InicializaRegistro(TiRegistro);
textattr:=7+0*16;{atributos de pantalla}
Clrscr;
Gotoxy(25,4);write('Consulta de Registro');
Gotoxy(25,10);write('Proporcione Numero : ');
readln(TiRegistro.Numero);
AperturaDeArchivo(TIArchivo); {aperturamos el archivo}
Encontrado:= BuscaRegistro(TiArchivo,TIRegistro,TiRegistro.Numero); {buscamos el registro}
Close(Tiarchivo); {cerramos el archivo}
If Encontrado <> -1 Then {existe}
Begin
textattr:=7+0*16;{atributos de pantalla}
Gotoxy(25,12);write('Nombre : ',TiRegistro.Nombre );
Gotoxy(25,14);write('Direccion : ',TiRegistro.Direccion );
Gotoxy(25,16);write('Tel‚fono : ',TiRegistro.Telefono);
End
Else {si no existe el registro}
Begin
Gotoxy(15,17);write('Registro No Existe,Pulse Enter');
readkey;
End;
Gotoxy(20,22);Write('Desea Continuar Consultando Registros [S/N]');
Salir:=Readkey;
Until (Salir='n') or (Salir='N');
End;
{*------|------|------|------|------|------|------|------|------|------|----*}
Procedure Listado(TiRegistro:TipoRegistro;var TiArchivo:tipoArchivo);
Var
Contador:integer;
Begin
textattr:=7+0*16;{atributos de pantalla}
Clrscr;
Gotoxy(2,2);write('Numero Nombre Direccion');
Seek(TiArchivo,0); {Posicionamos al inicio el puntero del archivo}
contador:=3;
While not eof(TiArchivo) do
Begin
Read(TiArchivo,TIRegistro); {Leemos el Registro segun posicion del puntero}
gotoxy(2,contador); Write(TIRegistro.Numero);
gotoxy(17,contador); Write(TIRegistro.Nombre);
gotoxy(47,contador); Write(TIRegistro.Direccion);
inc(contador);
End;
readkey;
End;
{*------|------|------|------|------|------|------|------|------|------|----*}
Procedure Menu(TiRegistro:TipoRegistro; Var TiArchivo:TipoArchivo);
Var
Tecla:Char;
Begin
ClrScr;
Repeat
textattr:=7+0*16;{atributos de pantalla}
ClrScr;
Gotoxy(25,6);Write('Alta de Registro ..............[1]');
Gotoxy(25,8);Write('Modificacion de Registro ......[2]');
Gotoxy(25,10);Write('Baja de Registro ..............[3]');
Gotoxy(25,12);Write('Consulta de Registro ..........[4]');
Gotoxy(25,14);Write('Listado de Registros...........[5]');
Gotoxy(25,16);Write('Salir .........................[6]');
Tecla:=Readkey;
Case Tecla of
'1':Begin
Alta(Tiregistro,TiArchivo);
End;
'2':Begin
Modificacion(TiRegistro,TiArchivo );
End;
'3':Begin
Baja(TiRegistro,TiArchivo );
End;
'4':Begin
Consulta(TiRegistro,TiArchivo );
End;
'5':Begin
AperturaDeArchivo(Tiarchivo);
Listado(TiRegistro,TiArchivo);
Close(TiArchivo);
End;
End;
Until Tecla = '6';
end;
{*------|------|------|------|------|------|------|------|------|------|----*}
{ Cuerpo del programa }
var
TiArchivo : TipoArchivo;
TiRegistro : TipoRegistro;
Begin
Menu(TiRegistro,TiArchivo);
end.