El error me lo tira en el procedimiento de abrir método, pero solo cuando listo. Acá les dejo el código de la librería y del listado
La Libreria principal:
Código Delphi
[-]
unit LibreriaArchivosEnlace;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, Banderas_Imagen;
const
_RutaArchivo= 'C:\Users\Valee\Desktop\TPO\';
_ArchivoDatos= 'Paises.dat';
_ArchivoControl= 'Paises.con';
_ArchivoBanderas= 'Banderas.dat';
_PosNula= -1;
_ClaveNula= 'A00';
_CantidadMaxima= 32;
_Torneo= 2014;
_Nulo= 0;
type
TipoMensaje= 0..20;
TipoBandera= 1..32;
Cadena= string [15];
TipoPosicion= longint;
TipoCantidad= integer;
TipoClave= string[3];
TipoPuesto= 0..8;
TipoGrupos= 'A'..'H';
TipoRegDatos= record
Clave: TipoClave;
Pais: Cadena;
Puesto_Anterior: TipoPuesto;
Bandera: TImage;
Enlace: TipoPosicion;
end;
TipoArchivoDatos= file of TipoRegDatos;
TipoRegControl= record
Primero: TipoPosicion;
Ultimo: TipoPosicion;
Cantidad: TipoCantidad;
Cantidad_Grupos: TipoGrupos;
Editable: Boolean;
Borrado: TipoPosicion;
end;
TipoArchivoControl= file of TipoRegControl;
TipoRegBandera = record
Nombre: Cadena;
Imagen: TImage;
Numero: TipoBandera;
end;
TipoArchivoBandera = file of TipoRegBandera;
TipoMe= record
B: TipoArchivoBandera;
D: TipoArchivoDatos;
C: TipoArchivoControl;
end;
var
Me:TipoMe;
Procedure CrearMe (var Me: TipoMe);
Procedure AbrirMe (var Me: TipoMe);
Procedure CerrarMe (var Me: TipoMe);
Procedure CapturarMe (var Me: TipoMe; pos:TipoPosicion; var RD: TipoRegDatos);
Procedure ModificarMe (var Me: TipoMe; pos: TipoPosicion; RD: TipoRegDatos);
Procedure Insertar (var Me:TipoMe; RD: TipoRegDatos; posicion: TipoPosicion);
Procedure Eliminar (var Me: TipoME; posicion: TipoPosicion);
function Buscar(Var Me:TipoMe; Clave:TipoClave; Var PosAnterior:TipoPosicion):Boolean;
Function MeVacio (var Me: TipoMe):boolean;
Function Primero (var Me: TipoMe):TipoPosicion;
Function Ultimo (var Me: TipoMe):TipoPosicion;
Function Proximo (var Me: TipoMe; pos: TipoPosicion): TipoPosicion;
Function Cant_elem (var Me: TipoMe): TipoCantidad;
implementation
Procedure CrearMe (var Me: TipoMe);
var
RC: TipoRegControl;
RB: TipoRegBandera;
begin
assign (Me.B,_RutaArchivo+_ArchivoBanderas);
assign (Me.D,_RutaArchivo+_ArchivoDatos);
assign (Me.C,_RutaArchivo+_ArchivoControl);
{$I-}
reset (Me.D);
If (IORESULT <> 0)
then
rewrite (Me.D);
reset (Me.C);
If (IORESULT <> 0)
then
begin
rewrite (Me.C);
RC.Primero:= _PosNula;
RC.Ultimo:= _PosNula;
RC.Borrado:= _PosNula;
RC.Cantidad:= _Nulo;
write (Me.C,RC);
end;
reset (Me.B);
If (IORESULT <> 0)
then
begin
rewrite (Me.B);
while RB.Numero <= _CantidadMaxima do
begin
case RB.Numero of
1: begin
RB.Nombre:= 'Japon';
RB.Imagen:= Form4.Image1;
end;
2: begin
RB.Nombre:= 'Italia';
RB.Imagen:= Form4.Image2;
end;
3: begin
RB.Nombre:= 'Iran';
RB.Imagen:= Form4.Image3;
end;
4: begin
RB.Nombre:= 'Inglaterra';
RB.Imagen:= Form4.Image4;
end;
5: begin
RB.Nombre:= 'Honduras';
RB.Imagen:= Form4.Image5;
end;
6: begin
RB.Nombre:= 'Grecia';
RB.Imagen:= Form4.Image6;
end;
7: begin
RB.Nombre:= 'Ghana';
RB.Imagen:= Form4.Image7;
end;
8: begin
RB.Nombre:= 'Francia';
RB.Imagen:= Form4.Image8;
end;
9: begin
RB.Nombre:= 'España';
RB.Imagen:= Form4.Image9;
end;
10: begin
RB.Nombre:= 'EEUU';
RB.Imagen:= Form4.Image10;
end;
11: begin
RB.Nombre:= 'Chile';
RB.Imagen:= Form4.Image11;
end;
12: begin
RB.Nombre:= 'Argelia';
RB.Imagen:= Form4.Image12;
end;
13: begin
RB.Nombre:= 'Colombia';
RB.Imagen:= Form4.Image13;
end;
14: begin
RB.Nombre:= 'Argentina';
RB.Imagen:= Form4.Image14;
end;
15: begin
RB.Nombre:= 'Corea del Sur';
RB.Imagen:= Form4.Image15;
end;
16: begin
RB.Nombre:= 'Australia';
RB.Imagen:= Form4.Image16;
end;
17: begin
RB.Nombre:= 'Costa de Marfil';
RB.Imagen:= Form4.Image17;
end;
18: begin
RB.Nombre:= 'Belgica';
RB.Imagen:= Form4.Image18;
end;
19: begin
RB.Nombre:= 'Costa Rica';
RB.Imagen:= Form4.Image19;
end;
20: begin
RB.Nombre:= 'Bosnia';
RB.Imagen:= Form4.Image20;
end;
21: begin
RB.Nombre:= 'Alemania';
RB.Imagen:= Form4.Image21;
end;
22: begin
RB.Nombre:= 'Croacia';
RB.Imagen:= Form4.Image22;
end;
23: begin
RB.Nombre:= 'Brasil';
RB.Imagen:= Form4.Image23;
end;
24: begin
RB.Nombre:= 'Camerun';
RB.Imagen:= Form4.Image24;
end;
25: begin
RB.Nombre:= 'Ecuador';
RB.Imagen:= Form4.Image25;
end;
26: begin
RB.Nombre:= 'Holanda';
RB.Imagen:= Form4.Image26;
end;
27: begin
RB.Nombre:= 'Mexico';
RB.Imagen:= Form4.Image27;
end;
28: begin
RB.Nombre:= 'Uruguay';
RB.Imagen:= Form4.Image28;
end;
29: begin
RB.Nombre:= 'Suiza';
RB.Imagen:= Form4.Image29;
end;
30: begin
RB.Nombre:= 'Rusia';
RB.Imagen:= Form4.Image30;
end;
31: begin
RB.Nombre:= 'Portugal';
RB.Imagen:= Form4.Image31;
end;
32: begin
RB.Nombre:= 'Nigeria';
RB.Imagen:= Form4.Image32;
end;
end;
write (Me.B);
RB.Numero:= RB.Numero+1;
end;
end;
close (Me.B);
close (Me.D);
close (Me.C);
{$I+}
end;
Procedure AbrirMe (var Me: TipoMe);
begin
reset (Me.B);
reset (Me.D);
reset (Me.C);
end;
Procedure CerrarMe (var Me: TipoMe);
begin
close (Me.B);
close (Me.D);
close (Me.C);
end;
Procedure CapturarMe (var Me: TipoMe; pos:TipoPosicion; var RD: TipoRegDatos);
begin
seek (Me.D, pos);
read (Me.D, RD);
end;
Procedure ModificarMe (var Me: TipoMe; pos: TipoPosicion; RD: TipoRegDatos);
var
RDAux: TipoRegDatos;
begin
seek (Me.D, pos);
read (Me.D, RDAux);
seek (Me.D, RDAux.Enlace);
read (Me.D, RDAux); RD.Enlace:= RDAux.Enlace;
seek (Me.D, RDAux.Enlace);
write (Me.D, RD);
end;
Procedure Insertar (var Me:TipoMe; RD: TipoRegDatos; posicion: TipoPosicion);
var
RC: TipoRegControl;
RX, RDAnterior: TipoRegDatos;
PosNueva: TipoPosicion;
begin
seek (Me.C, _Nulo); read (Me.C, RC);
if RC.Borrado= _PosNula then
PosNueva:= filesize (Me.D)
else
begin
PosNueva:= RC.Borrado;
seek (Me.D, PosNueva);
read (Me.D, RX);
RC.Borrado:= RX.Enlace;
end;
if RC.Primero= _PosNula then
begin
RC.Primero:= PosNueva;
RC.Ultimo:= PosNueva;
RD.Enlace:= _PosNula; end
else
if posicion= _PosNula then
begin
RD.Enlace:= RC.Primero;
RC.Primero:= PosNueva;
end
else
if posicion= RC.Ultimo then
begin
RD.Enlace:= _PosNula;
seek (Me.D, Posicion);
read (Me.D, RDAnterior);
RDAnterior.Enlace:= PosNueva;
RC.Ultimo:= PosNueva;
end
else begin
seek (Me.D, posicion);
read (Me.D, RDAnterior);
RD.Enlace:= RDAnterior.Enlace;
RDAnterior.Enlace:= PosNueva;
end;
RC.Cantidad:= RC.Cantidad+1;
seek (Me.C, _Nulo);
write (Me.C, RC);
seek (Me.D, PosNueva);
write (Me.D, RD);
end;
Procedure Eliminar (var Me: TipoME; posicion: TipoPosicion);
var
RC: TipoRegControl;
RX,RD: TipoRegDatos;
PosBorrado: TipoPosicion;
begin
seek (Me.C, _Nulo); read (Me.C, RC);
if posicion= _PosNula
then
begin
if RC.Primero = RC.Ultimo then
begin
PosBorrado:= RC.Primero;
RC.Primero:= _PosNula;
RC.Ultimo:= _PosNula;
end
else
begin PosBorrado:= RC.Primero;
seek (Me.D, PosBorrado);
read (Me.D, RX);
RC.Primero:= RX.Enlace;
end;
end
else
begin seek (Me.D, posicion);
read (Me.D, RD);
PosBorrado:= RD.Enlace;
if RD.Enlace= RC.Ultimo then
begin
RD.Enlace:= _PosNula;
RC.Ultimo:= posicion;
seek (Me.D, posicion);
write (Me.D, RD);
end
else
begin seek (Me.D, RD.Enlace);
read (ME.D, RX);
RD.Enlace:= RX.Enlace;
seek (Me.D, posicion);
write (Me.D, RD);
end;
end;
seek (Me.D, PosBorrado); read (Me.D, RD);
RD.Enlace:= RC.Borrado;
RC.Borrado:= posicion;
RC.Cantidad:= RC.Cantidad-1;
seek (Me.D,_Nulo);
write (Me.D, RD);
seek (Me.C,_Nulo);
write (Me.C, RC);
end;
function Buscar(Var Me:TipoMe;Clave:TipoClave;Var PosAnterior:TipoPosicion):Boolean;
Var
Enc,Corte:Boolean;
RC:TipoRegControl;
RD:TipoRegDatos;
Primero:Tipoposicion;
Begin
Seek(Me.C,_Nulo);
Read(Me.C,RC);
Enc:=False;
Corte:=False;
PosAnterior:=_PosNula;
Primero:=RC.Primero;
While (Not Enc) and (Not Corte) and (Primero<>_PosNula) do
Begin
Seek(Me.D,Primero);
Read(Me.D,RD);
If RD.Clave=Clave Then
Enc:=True
else
If RD.Clave > Clave then
Corte:=True
else
Begin
PosAnterior:=Primero;
Primero:=RD.Enlace;
End;
End;
Buscar:=Enc;
End;
Function MeVacio (var Me: TipoMe):boolean;
var
RC: TipoRegControl;
begin
seek (Me.C, _Nulo);
read (Me.C, RC);
if RC.Primero= _PosNula
then
MeVacio:= true
else
MeVacio:= false;
end;
Function Primero (var Me: TipoMe):TipoPosicion;
var
RC: TipoRegControl;
begin
seek (Me.C, _Nulo);
read (Me.C, RC);
Primero:= RC.Primero;
end;
Function Ultimo (var Me: TipoMe):TipoPosicion;
var
RC: TipoRegControl;
begin
seek (Me.C, _Nulo);
read (Me.C, RC);
Ultimo:= RC.Ultimo;
end;
Function Proximo (var Me: TipoMe; pos: TipoPosicion): TipoPosicion;
var
RD: TipoRegDatos;
begin
seek (Me.D, pos);
read (Me.D, RD);
Proximo:= RD.Enlace;
end;
Function Cant_elem (var Me: TipoMe): TipoCantidad;
var
RC: TipoRegControl;
begin
Cant_elem:= RC.Cantidad;
end;
end.
Listado que tira error de asignacion de archivo:
unit Listado_Total;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, LOAux, LibreriaArchivosEnlace;
type
TForm3 = class(TForm)
Panel1: TPanel;
ListBox1: TListBox;
Panel2: TPanel;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
var
X: TipoPosicion;
Cant: TipoCantidad;
RD: TipoRegDatos;
begin
ListBox1.Clear;
AbrirMe (Me);
Cant:= 1;
X:= Primero (Me);
if MeVacio (Me)
then
MostrarMensaje (11)
else
begin
while Cant<= Cant_elem (Me) do
begin
CapturarMe (Me,X,RD);
ListBox1.AddItem('CLAVE: '+ RD.Clave+' PAIS: '+RD.Pais+ inttostr (RD.Puesto_Anterior),ListBox1);
Cant:= Cant+1;
X:= Proximo(Me,X);
end;
end;
CerrarMe (Me);
end;
end.