Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Delphi no me abre el archivo (https://www.clubdelphi.com/foros/showthread.php?t=86262)

Valee 09-07-2014 02:04:14

Delphi no me abre el archivo
 
Hola, estoy estudiando análisis en sistemas, y tengo que hacer un proyecto para programación en delphi. El tema es hacer un fixture, la primer parte consiste en que el usuario cargue los países que fueron clasificados. Una vez cargados se tienen que mostrar.
Resulta que la carga me la hace bien, abriendo y cerrando el método, pero a la hora de mostrar me salta con un error de asignación de archivos que no me permite abrir el método, por lo tanto se corta ahí.
Lo revise por completo, una y mil veces y no le encuentro el error. Si necesitan el código para revisarlo, me dicen y se los mando por privado, o en su defecto por acá. Muchas gracias. Espero que me puedan ayudar. Saludos =)

Ferrari 09-07-2014 03:15:55

Pienso que es lo mas lógico....que pongas tu código y así la comunidad te pueda apoyar.

Saludos
:cool:

Valee 09-07-2014 03:27:55

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;
//Function BuscarBandera (var Me:TipoMe; Pais: cadena): TImage;

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);
  //seek (Me.D, RD.Enlace);
  //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); //VER, CREO QUE ES RD
  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); //Lee Archivo Control
  read (Me.C, RC);
  if RC.Borrado= _PosNula //Descolgamos el campo Borrado
  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 //Inserto en Me vacio
  then
    begin
      RC.Primero:= PosNueva;
      RC.Ultimo:= PosNueva;
      RD.Enlace:= _PosNula; //Al estar vacio, el enlace queda en -1
    end
  else
    if posicion= _PosNula // Insertar al principio
    then
      begin
        RD.Enlace:= RC.Primero;
        RC.Primero:= PosNueva;
      end
    else
      if posicion= RC.Ultimo //Incertar al final
      then
        begin
          RD.Enlace:= _PosNula;
          seek (Me.D, Posicion);
          read (Me.D, RDAnterior);
          RDAnterior.Enlace:= PosNueva;
          RC.Ultimo:= PosNueva;
        end
      else // Insertar al medio
        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); // Leo cabecera
  read (Me.C, RC);
  if posicion= _PosNula
  then
    begin
      if RC.Primero = RC.Ultimo //Elimino y queda Pos vacio
      then
        begin
          PosBorrado:= RC.Primero;
          RC.Primero:= _PosNula;
          RC.Ultimo:= _PosNula;
        end
      else
        begin //Elimino al principio
          PosBorrado:= RC.Primero;
          seek (Me.D, PosBorrado);
          read (Me.D, RX);
          RC.Primero:= RX.Enlace;
        end;
    end
  else
    begin //Elimino al medio o al final
      seek (Me.D, posicion);
      read (Me.D, RD);
      PosBorrado:= RD.Enlace;
      if RD.Enlace= RC.Ultimo //Elimino ultimo elemento
      then
        begin
          RD.Enlace:= _PosNula;
          RC.Ultimo:= posicion;
          seek (Me.D, posicion);
          write (Me.D, RD);
        end
      else
        begin //Elimino al medio
          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); // Insertar al registro en la pila de borrados
  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;

{Function BuscarBandera (var Me:TipoMe; Pais: cadena): TImage;
var
  enc: boolean;
  RB: TipoRegBandera;
  Nro: TipoBandera;
begin
  enc:= false;
  Nro:= 1;
  seek (Me.B, Nro);
  read (Me.B, RB);
  while (not enc) or (Nro= _CantidadMaxima) do
    begin
      seek (Me.B, Nro);
      read (Me.B,RB);
      if RB.Nombre = Pais
      then
          enc:= true
      else
        Nro:= Nro+1;
    end;
  BuscarBandera:= RB.Imagen;
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
    { Private declarations }
  public
    { Public declarations }
  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.

ecfisa 09-07-2014 07:59:38

Hola Valee.

Por favor, cuando incluyas código en tus mensajes usa los TAG's para hacer mas clara la lectura.

Uso:


En cuanto al error, sería muy bueno que hubieras puesto textualmente el mensaje que te arroja, eso circunscribe mucho la búsqueda del mismo.

Pero dado que mencionas que: "salta con un error de asignación de archivos", noto que que en el método TForm3.Button1Click llamas al procedimiento AbrirMe sin llamar previamente a CrearMe, que es donde son asignados los nombres de archivo a las variables de tipo file.

Por otro lado, en Delphi para realizar la asignación de nombres de archivo, no se usa el procedimiento Assign como en Pascal sino AssignFile.

En principio, eso es lo que alcanzo a percibir sobre la causa del error que mencionas. A menos que estes asígnando los archivos en otra parte (no publicada) del código.

Saludos :)

Valee 09-07-2014 17:42:06

Hola Ecfisa, el crear método lo creo en el formulario principal, por eso no lo creo antes del abrir método, sino me reescribe y me borra los datos que fueron guardados. El error que me tira es EInOutError I/O error 102.
La carga de los países me lo hace perfecto, por eso no comprendo porque me tira error. Si puede abrir el método cuando se carga porque no se puede abrir cuando se muestra¿?

Valee 09-07-2014 22:56:33

Error de Delphi
 
Hola a todos. Tengo que hacer un proyecto para programacion. Hay que hacer el fixture del mundial. La primer parte consiste en cargar los paises que fueron clasificados y ademas hay que mostrarlos.
Cuando cargo los datos lo hace perfecto, pero cuando quiero mostrar me tira un error de asignacion de archivo "I/O 102 error". El error me lo marca en el abrir metodo, pero la verdad es que nose porque. Si se pudo abrir cuando se cargo, porque no se puede cuando hay que mostrar¿?
Espero que me puedan ayudar. Aca les dejo adjunto los codigos mas una foto del error que me tira. Muchas gracias! Saludos :)

Casimiro Notevi 09-07-2014 23:35:15

Por favor, no crees nuevos hilos para un mismo tema. Síguelo en el que empezaste.
Además, no olvides pone títulos descriptivos a tus preguntas, gracias.
No olvides nuestra guía de estilo.

ecfisa 10-07-2014 18:59:09

Hola Valee.
Cita:

Empezado por Valee (Mensaje 478853)
Hola Ecfisa, el crear método lo creo en el formulario principal, por eso no lo creo antes del abrir método, sino me reescribe y me borra los datos que fueron guardados. El error que me tira es EInOutError I/O error 102.

Ahora viendo el código de error (que podes revisar aquí: Input-Output Errors), te puedo afirmar que los archivos no están asignados al momento de intentar abrirlos con el procedimiento AbrirMe.

Lamento no haber podido abrir el adjunto con el código pero te sugiero hacer un seguimiento poniendo un Break Point y usar Trace Into (F7) para verificar que se estén asignando los archivos al momento de ser abiertos.

Aunque sin dudas, ese error se eliminaría agregando sólo una línea:
Código Delphi [-]
...
begin
  ListBox1.Clear;
  CrearMe(Me); // <- ESTA LÍNEA
  AbrirMe(Me);
  ...
Sólo proba agregando esa línea y comentanos si el error 102 sigue apareciendo.

Saludos :)

Valee 12-07-2014 22:24:25

Hola Ecfisa, no era eso. Era un problema de libreria. De todas formas gracias por la ayuda!!!
Saludos =)

ecfisa 13-07-2014 10:36:02

Hola Valee.

Pude abrir tu archivo en este equipo, aunque tuve que quitar algunas referencias a unidades y archivos que no estaban en el comprimido para poder ejecutarlo. Y tál como te mencioné en el mensaje anterior, el error 102 desapareció al llamar al procedimiento CrearMe antes de AbrirMe.

Saludos :)

Casimiro Notevi 13-07-2014 10:57:19

Cita:

Empezado por ecfisa (Mensaje 478932)
el error 102 desapareció al llamar al procedimiento CrearMe antes de AbrirMe.

Es lógico ^\||/

duilioisola 13-07-2014 12:09:47

Mas allá de lo que mencionan con respecto a abrir y cerrar archivos con los métodos AssignFile/CloseFile, lo que yo veo es que el método AbrirMe confía en que el archivo está asignado y solo hace un Reset para poner el puntero al principio.
El método CrearMe asigna el archivo y al final lo cierra, por lo que cualquier operación posterior daría un error.

En este caso, si se llama primero a CrearMe y luego a Abrirme, el Reset se tratará de realizar sobre un archivo cerrado.

Código Delphi [-]
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);
[...]
  // Luego de crear los archivos, se cierran
  close (Me.B);
  close (Me.D);
  close (Me.C);
  {$I+}
end;

Procedure AbrirMe (var Me: TipoMe);
begin
  // En este punto no podemos asegurar si se el archivo está abierto o no
  // Confiamos en que si
  reset (Me.B);
  reset (Me.D);
  reset (Me.C);
end;

procedure TForm3.Button1Click(Sender: TObject);
var
  X: TipoPosicion;
  Cant: TipoCantidad;
  RD: TipoRegDatos;
begin
  ListBox1.Clear;
  // En este punto no podemos asegurar si se el archivo está abierto o no
  // El método CrearMe lo habría cerrado si fue llamado anteriormente
  // Esto generará un error.
  AbrirMe (Me);
  [...]
  CerrarMe (Me);
end;


La franja horaria es GMT +2. Ahora son las 18:09:02.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi