Pascal: Fichero y Listbox

-

Os cuento, tengo un fichero que contiene registros con los siguientes campos: Código, Nombre, Apellidos y Provincia.

El tema es que tengo un Menú creado con una opción en la que pone "Modificar".

Al darle a esa opción, quiero que un listbox que tengo en el formulario 1 se me llene con los apellidos de cada uno de los registros que tengo guardados en el fichero.

Una vez que me consiga eso, necesito que al pinchar en uno de los apellidos del listbox, me aparezcan en los edit correspondientes los datos del registro en el que se encuentra el apellido.

Los datos de los registros junto con sus campos:

RClientes = RECORD
Codigo:string[10];
Nombre:string[10];
Apellidos:string[10];
NProvincias:string[10];

Y las variables:

FC: File of RClientes;
C: RClientes;

Ahora el código que he hecho para leer todo el fichero y añadir el campo apellido de cada uno al listbox1:

for a:=0 to filesize(FC)-1 do
begin
listbox1.items.add (c.apellidos);
end

Ahora es cuando selecciono uno de los apellidos del listbox y automáticamente se me tienen que rellenar los edits correspondientes con los datos de cada campo.

if listbox1.items[listbox1.itemindex] <> -1 then
begin
seek (FC,listbox1.itemindex);
read (FC,C);
edit1.text := c.codigo;
edit2.text := c.nombre;
edit3.text := c.apellidos;
combobox1.text := c.NProvincias;
seek (FC,filepos(FC)-1);
end;

Soy algo novato en ésto de la programación, haber si me podéis hechar un cable :P

Un saludo ^^

BLZKZ

Pon algo más de codigo para que te podamos ayudar.
salu2

EDIT: hay sintaxis que en la vida he usado en pascal y que creo que es propia de poo (es que a mi me falta codigo para terminar de entenderlo). Por ejemplo nunca usé seek, y lo que si usaba para ver fin de fichero era end of file (y end of line en caso de que fuera fichero de texto)

Ok acabo de ver que lo haces con GUI (por lo de formularios) en pascal nunca lo hice asi xD

Magnnus

yo tp he dado lo de seek..

y una pregunta... a q t refieres con ListBox?? te refires a la tipica estructura de Listas creadas cn Registros y Arrays??

Y a ver ... "Os cuento, tengo un fichero que contiene registros con los siguientes campos: Código, Nombre, Apellidos y Provincia."

Un fichero no contiene registros.. un fichero lo unico q tiene son lineas de caracteres, luego vas leyendo el fichero linea a linea con el Readln y lo vas volcando a un Registro q hayas creado..

me lo leo d nuevo y a ver si t puedo ayudar..

grivcon

#3 en pascal hay ficheros de datos que contienen registros, o cualquier tipo de datos. Los que mencionas tu son ficheros textuales.

Magnnus

#4 Tienes razon, supongo q te referiras a los archivos binarios.. esos no dimos este año U_U

y bueno, he hecho un programa con un fichero .txt q seria del formato como has dicho #1

Nombre del fichero: Archivo.txt
Formato del fichero:
15 {codigo}
Pepe {Nombre}
Ruiz {Apellidos}
Sevilla {Provincia}
20
carlos
Garcia
Madrid

El programa hace lo q pides, seleccionar un Apellido y automaticamente devolver toda la informacion relacionada con ese apellido
OJO: Si no encuentra apellido, sale mal
OJO: el apellido es Garcia, si se pone garcia no se encuentra, tiene q poner exactamnt lo mismo.

Program MV;

Uses crt;

Const
     Max_Clientes=50;

Type
    TInfo_Cliente = Record
                          Codigo:String;
                          Nombre:String;
                          Apellidos: String;
                          Provincias: String;
                           End;

TClientes = Array [1..Max_Clientes] of TInfo_Cliente;

TLista = Record
               Cuantos: Integer;
               Clientes:TClientes;
          End;




Procedure Visualizar_Menu;
Begin
        Write ('1. Modificar > ');
End;


Procedure Inicializar_lista(var Lista:Tlista);
Begin {Inicializar_lista}
     Lista.cuantos:=0;
End; {Inicializar_lista}


Procedure Leer_Archivo (Var Lista:TLista);
Var
   F:Text;
   Cont: Integer;

Begin {Leer_Archivo}
     Cont:=1;
     Assign (F, 'D:\Archivo.txt');
     {$I-}
     Reset (F);
     {$I+}
     If IOresult = 0 Then {Se ha cargado bien el archivo}
     Begin{If}
             While not eof(f) And (Cont<= Max_Clientes) Do
              Begin{While}
                      Readln(F, Lista.Clientes[cont].codigo);
                      Readln(F, Lista.Clientes[cont].Nombre);
                      Readln(F, Lista.Clientes[cont].Apellidos);
                      Readln(F, Lista.Clientes[cont].Provincias);
                      Cont:= Succ(Cont);
              End;{While}
     End{If}
     Else
     Writeln('No se cargo bien el archivo');
     Lista.Cuantos:= Cont;
     Close(F);
End;{Leer_Archivo}


Procedure Modificar (Lista:Tlista);

     Procedure Selecciona_Apellido(Var Apellido:String);
     Begin{Selecciona_Apellido}
             Write ('Introduce el apellido > ');
             Readln(apellido);
     End;{Selecciona_Apellido}

     Procedure Busqueda_Secuencial(Lista:Tlista; Apellido:String; Var Posicion:Integer);
     Var
        Cont: Integer;

     Begin {Busqueda_Secuencial}
          Cont:=1;
          While (Cont <= Lista.Cuantos) And (Lista.Clientes[Cont].Apellidos <> Apellido) Do
          Cont:= Succ(cont);
          IF (Cont <= Lista.cuantos) Then
          Posicion:= Cont
          Else
          Posicion:=0;{Si no lo encuentra, devuelve un 0}
     End; {Busqueda_Secuencial}


     Procedure Mostrar_Pantalla (Posicion:Integer; Lista:TLista);
     Begin
             Writeln(Lista.Clientes[Posicion].codigo);
             Writeln(Lista.Clientes[Posicion].Nombre);
             Writeln(Lista.Clientes[Posicion].Provincias);
             Readln;
     End;


Var {Modificar}
   Apellido: String;
   Posicion: Integer;

Begin{Modificar}
        Selecciona_Apellido(Apellido);
        Busqueda_Secuencial(Lista,Apellido,Posicion);
        Mostrar_pantalla(Posicion, Lista);
End;{Modificar}

Var{Programa Principal}
     Lista:Tlista;
     Opcion:char;
 
Begin{Programa Principal}
       Clrscr;
       Visualizar_menu;
       Readln(Opcion);
       Case Opcion Of
             '1':Begin
                          Inicializar_Lista(Lista);
                          Leer_Archivo(Lista);
                          Modificar(Lista);
                  End
     End;{Case}
End.{Programa Principal}
BLZKZ

#5 la diferencia de los archivos binarios es que los escribes por bloques (si tiene registros, lee de golpe cada registro) y no tienes control de salto de linea (logicamente) por lo que solo puedes usar read, y write. Para controlar el final yo usaba eof.

salu2

Magnnus

vale, ya lo puse bonito...

el programa esta hecho para un fichero de texto, no binario.. pero igual t puede ayudar.. Simplemente hace una busqueda secuencial y una vez lo encuentra el elemento q busca, devuelve la posicion en la q esta, y luego imprime los otros campos de esta misma posicion.

Usuarios habituales

  • Magnnus
  • BLZKZ
  • grivcon
  • -Willyam-