Ir al contenido


Foto

aplicacion en delphi


  • Por favor identifícate para responder
28 respuestas en este tema

#1 cflowers

cflowers

    Member

  • Miembros
  • PipPip
  • 12 mensajes

Escrito 02 agosto 2010 - 04:42

Desarrolle una aplicación Delphi  ORIENTADA A OBJETOS que permita administrar los alumnos y calificaciones de la asignatura Matemática Básica de cierta Facultad. La información de los alumnos de la materia se debe organizar en un archivo de acceso directo cuyos registros se componen de los campos: DNI, Apellido, nombres, Nota1, Nota2, Nota3. 

Menú Archivo: 
Nuevo, Abrir,  Guardar,  Agregar Alumno,  Eliminar Alumno,  Cerrar
Donde
Nuevo: crea un nuevo archivo a través de un cuadro de diálogo para almacenar la lista de alumnos.
Abrir:  abre un archivo existente para agregar nuevos alumnos o procesar su información.
Guardar: abre un cuadro de diálogo para guardar el archivo con otro nombre o en otro lugar (Guardar como).
Agregar Alumno: actualiza el archivo con los datos de un nuevo alumno.
Eliminar alumno: elimina un alumno del archivo.  Al elegir esta opción se deben “apagar” los edit del Formulario a excepción del correspondiente al DNI. Al hacer clik en ACEPTAR se elimina el alumno.
Cerrar: cierra el archivo.
Menú Herramientas: 
Buscar Alumno x DNI, Lista c/Promedios,  Lista de Regulares, Lista de Libres Donde
Buscar Alumno x DNI: anula (apaga) los EDIT a excepción del DNI y permite al usuario buscar en el archivo a dicho alumno al hacer click en ACEPTAR. Si lo encuentra coloca sus datos en cada Eidt y aparecen su promedio y condición: REGULAR si el promedio supera 60 y LIBRE si no lo supera. Observe las Figuras 3 y 4
Lista c/Promedios: Lista en un componente Memo los apellidos y Nombres de los alumnos del archivo con sus pro medios.

quisiera saber si estoy haciendo bien la unit 2



delphi
  1. unit Unit2;
  2.  
  3. interface
  4. uses Dialogs, StdCtrls, SysUtils, Grids;
  5.  
  6. type
  7. alumno = Record
  8.   Apellido, nombres: string[20];
  9.   DNI, saldo: double;
  10. end;
  11. TArchivo = class
  12. private
  13.   Archi:File of alumno;
  14.   datos: alumno;
  15.   Ver: TStringGrid;
  16. public
  17.   procedure CrearArchivo(ArchiFisico:string);
  18.   procedure AbrirArchivo(ArchiFisico:string);
  19.   procedure Agregaralumno(c:alumno;var b:byte);
  20.   procedure GuardarArchivo(ArchiFisico:string);
  21.   procedure Eliminaralumno(var h:longint; e10: string);
  22.   procedure CerrarArchivo;
  23.   function Buscar_X_DNI(var h:longint; var c:alumno):boolean;
  24.   procedure MostrarLista(var ver:TStringGrid);
  25. end;
  26. implementation
  27.  
  28. procedure TArchivo.CrearArchivo;
  29.   begin
  30.     AssignFile(Archi,ArchiFisico);
  31.     Rewrite(Archi);
  32.   end;
  33. procedure TArchivo.AbrirArchivo(ArchiFisico:string);
  34.   begin
  35.     AssignFile(Archi,ArchiFisico);
  36.     Reset(Archi)
  37.   end;
  38. procedure TArchivo.Agregaralumno(c:alumno;var b:byte);
  39.   begin
  40.   {$I-}
  41.   Seek(Archi, FileSize(archi));
  42.   {$I+};
  43.   b:=IOResult;
  44.     If b=0 then
  45.       Write(Archi, c);
  46.   end;
  47. procedure TArchivo.GuardarArchivo(ArchiFisico:string);
  48.   begin
  49.     AssignFile(Archi,ArchiFisico);
  50.     Rewrite(Archi);
  51.   end;
  52. procedure TArchivo.Eliminaralumno(var h:longint; e10: string);
  53. var
  54.   aux: file of alumno;
  55. begin
  56.   assignfile(aux,'temp.dat');
  57.   {$I-}
  58.   reset(archi);
  59.   rewrite(aux);
  60.   {$I+}
  61.  
  62.     if ioresult<>0 then
  63.     showmessage('Error en Archivo')
  64.     else
  65.       Begin
  66.       while not eof (archi) do begin
  67.       read(archi,datos);
  68.           if datos.dni <> h then
  69.           write(aux,datos);
  70.       end;
  71.   closefile (archi);
  72.   closefile(aux);
  73.   erase(Archi);
  74.     if not
  75.     RenameFile('temp.dat', e10)
  76.     then
  77.     Showmessage('Error renombrando Archivos!');
  78.     end;
  79.     Showmessage ('Se eliminó correctamente el alumno con DNI'+ inttostr(h));
  80. end;
  81. procedure TArchivo.CerrarArchivo;
  82.   begin
  83.       if IOresult = 0 then
  84.       begin
  85.       closefile(Archi);
  86.       end
  87.  
  88.  
  89.   end;
  90. function TArchivo.Buscar_X_DNI(var h:longint;var c: alumno):boolean;
  91. begin
  92.   reset(archi);
  93.   while not eof (archi) do
  94.   begin
  95.     read(archi, c);
  96.     if c.dni = h then
  97.       begin
  98.       Result := True;
  99.       Exit;
  100.       end;
  101.   end;
  102.   // alumno no encontrado
  103.   Result := False;
  104. end;
  105.   procedure TArchivo.MostrarLista(var ver:TStringGrid);
  106.   var fila, columna: integer;
  107.   begin
  108.     Reset(Archi);
  109.     fila:=1;
  110.     columna:=0;
  111.     while not EOF do
  112.     begin
  113.  
  114.       ver.Cells[fila,columna] := datos.nombres;
  115.       inc(columna);
  116.       ver.Cells[fila,columna] := datos.Apellido;
  117.  
  118.     end;
  119. end;
  120.  
  121.  
  122.  
  123.  
  124. end.



Lista de Regulares: Lista los alumnos Regulares, Apellidos, Nombres y promedio.


  • 0

#2 Caral

Caral

    Advanced Member

  • Administrador
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 02 agosto 2010 - 06:37

Hola
Con que base de datos estas trabajando?.
Saludos
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.259 mensajes
  • LocationMéxico

Escrito 02 agosto 2010 - 06:59

Hola

No está trabajando con base de datos, está trabajando con archivos 'tipeados' (RECORD).

Salud OS
  • 0

#4 Caral

Caral

    Advanced Member

  • Administrador
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 02 agosto 2010 - 07:01

Hola
Que despistado que soy  :D :D
Saludos
  • 0

#5 cflowers

cflowers

    Member

  • Miembros
  • PipPip
  • 12 mensajes

Escrito 02 agosto 2010 - 07:14

si, es como dice egostar
  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.259 mensajes
  • LocationMéxico

Escrito 02 agosto 2010 - 07:30

Hola
Que despistado que soy  :D :D
Saludos


:D :D :D yo lo sé :p

Referente al amigo cflowers, pues el código compila, así que no está nada mal, solo creo le falta una variable para trabajar con la clase TArchivos.



delphi
  1. var
  2.   Form1: TForm1;
  3.   Archivo: TArchivo;



Además de complementarlo con algunos botones para que "dispare" los procedimientos y funciones de la clase TArchivos.

Salud OS
  • 0

#7 Caral

Caral

    Advanced Member

  • Administrador
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 02 agosto 2010 - 07:38

Hola
Bueno, yo nunca he hecho nada con records no fui a la escuela de informatica  : : :
Me da curiosidad el hecho de que se usa un archivo .Dat para ciertos eventos.
Por lo demas se ve sencillo, muy basico el asunto.
Estoy muy perezoso ultimamente por eso no lo compile para probarlo. 8o|
Saludos
  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.259 mensajes
  • LocationMéxico

Escrito 02 agosto 2010 - 07:52

Hola
Bueno, yo nunca he hecho nada con records no fui a la escuela de informatica  : : :
Me da curiosidad el hecho de que se usa un archivo .Dat para ciertos eventos.
Por lo demas se ve sencillo, muy basico el asunto.
Estoy muy perezoso ultimamente por eso no lo compile para probarlo. 8o|
Saludos


El archivo temp.dat lo está usando para contener los datos de forma temporal, para excluir el dato que se desea borrar.

En la época de turbo pascal era muy común que la extensión de los archivos tipeados fuesen .DAT, pero pues te estoy hablando de los 80's :)

Salud OS
  • 0

#9 cflowers

cflowers

    Member

  • Miembros
  • PipPip
  • 12 mensajes

Escrito 02 agosto 2010 - 07:53

voy a probar lo de las variables y les digo! gracias!
  • 0

#10 Delphius

Delphius

    Advanced Member

  • Moderador
  • PipPipPip
  • 6.295 mensajes
  • LocationArgentina

Escrito 02 agosto 2010 - 07:58

Hola,
No he probado el código. Pero de pasada, a reojo, noto:

En Buscar_X_DNI, se lee la misma posición (la inicial) siempre. No se avanza por el archivo. Read() no ocasiona un avance al próximo registro. Por tanto el ciclo se ejecutará indefinidamente.

En MostrarLista se sufre el mismo problema. No se avanza sobre el archivo, se lee siempre la misma posición. Además, si llegase a avanzar se sobreescribiría siempre la misma posición del StringGrid ya que los valore de fila y columna no cambian en el ciclo.
Dentro del ciclo se debe alterar estas variables para que en la siguiente parada se coloquen los datos en una nueva posición.

Ha decir verdad, y siendo honesto... este "ejercicio" me tiene cansino  :@, se ve que han proliferado usuarios con la misma duda en las últimas semana y todos vienen con lo mismo... y las misma intenciones. Quizá esta sea la excepción, porque al menos veo una muestra de código.

Como vendrá la mano en ese curso ^o| que alguien de CD hasta me ofreció plata para hacerle la tarea y yo ha decir verdad no tengo el menor interés en ello. No me vendría mal el dinero pero para estos casos, en donde se pretende intentar comprar la aprobación de la materia mi integridad moral, ética y profesional me indica que debía claramente decir que NO.

Saludos,
  • 0

#11 cflowers

cflowers

    Member

  • Miembros
  • PipPip
  • 12 mensajes

Escrito 02 agosto 2010 - 08:03

claro, ahora es cuando se me complica en la unit1 con los eventos. ayuda?
  • 0

#12 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.259 mensajes
  • LocationMéxico

Escrito 02 agosto 2010 - 08:06

Hola,
No he probado el código. Pero de pasada, a reojo, noto:

En Buscar_X_DNI, se lee la misma posición (la inicial) siempre. No se avanza por el archivo. Read() no ocasiona un avance al próximo registro. Por tanto el ciclo se ejecutará indefinidamente.

En MostrarLista se sufre el mismo problema. No se avanza sobre el archivo, se lee siempre la misma posición. Además, si llegase a avanzar se sobreescribiría siempre la misma posición del StringGrid ya que los valore de fila y columna no cambian en el ciclo.
Dentro del ciclo se debe alterar estas variables para que en la siguiente parada se coloquen los datos en una nueva posición.

Ha decir verdad, y siendo honesto... este "ejercicio" me tiene cansino  :@, se ve que han proliferado usuarios con la misma duda en las últimas semana y todos vienen con lo mismo... y las misma intenciones. Quizá esta sea la excepción, porque al menos veo una muestra de código.

Como vendrá la mano en ese curso ^o| que alguien de CD hasta me ofreció plata para hacerle la tarea y yo ha decir verdad no tengo el menor interés en ello. No me vendría mal el dinero pero para estos casos, en donde se pretende intentar comprar la aprobación de la materia mi integridad moral, ética y profesional me indica que debía claramente decir que NO.

Saludos,


La verdad es que si, efectivamente es una tarea, sin embargo, el hecho de que el amigo cflowers coloque lo que ya lleva es un buen principio, se nota que él si quiere aprender, los demás (sobre todo el que ofreció plata) pues tal vez y digo tal vez, pasarán la materia pero no aprenderán nada :)

Salud OS
  • 0

#13 Delphius

Delphius

    Advanced Member

  • Moderador
  • PipPipPip
  • 6.295 mensajes
  • LocationArgentina

Escrito 02 agosto 2010 - 08:07

Hace tiempo que no empleo un file of record... si no me falla la memoria, para moverse al siguiente registro se debía utilizar Seek().

Y ahora que noto, en EliminarAlumno() también no se avanza sobre el archivo. Se lee la primera posición. Además tengo entendido que para "borrar" el registro se debe sobreescribir el registro a borrar por el anterior o el siguiente... según sea el caso y como se lo programa. Por tanto el eliminar ocasiona que los registros se "desplacen".

Saludos,
  • 0

#14 Delphius

Delphius

    Advanced Member

  • Moderador
  • PipPipPip
  • 6.295 mensajes
  • LocationArgentina

Escrito 02 agosto 2010 - 08:10


La verdad es que si, efectivamente es una tarea, sin embargo, el hecho de que el amigo cflowers coloque lo que ya lleva es un buen principio, se nota que él si quiere aprender, los demás (sobre todo el que ofreció plata) pues tal vez y digo tal vez, pasarán la materia pero no aprenderán nada :)

Salud OS

Por eso mismo amigo dije que quizá esta sea una excepción. Porque cflowers al menos se ha tomado la molestia de estudiarlo al tema e intentarlo. De los demás, debo decir... ¡lamentable!

Saludos,
  • 0

#15 cflowers

cflowers

    Member

  • Miembros
  • PipPip
  • 12 mensajes

Escrito 02 agosto 2010 - 08:18

yo no quiero pagarle a nadie ni que me resuelvan el ejercicio, solo que me guien un poco a ver si lo estoy haciendo bien.  :(
  • 0

#16 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.259 mensajes
  • LocationMéxico

Escrito 02 agosto 2010 - 08:21

No desesperes amigo, que estamos intentando recordar como se trabaja con los records :)

Salud OS
  • 0

#17 cflowers

cflowers

    Member

  • Miembros
  • PipPip
  • 12 mensajes

Escrito 02 agosto 2010 - 08:25

muchas gracias a todos por la ayuda!!! la necesito
  • 0

#18 Delphius

Delphius

    Advanced Member

  • Moderador
  • PipPipPip
  • 6.295 mensajes
  • LocationArgentina

Escrito 02 agosto 2010 - 08:35

yo no quiero pagarle a nadie ni que me resuelvan el ejercicio, solo que me guien un poco a ver si lo estoy haciendo bien.  :(

No lo dije por ti... sino que estaba comentando que otra persona, de clubdelphi lanzó una cadena de mensajes pidiendo y ofreciendo la posibilidad de pagar por hacerle la tarea. Entre algunos "beneficiarios" de la "oferta" estoy yo.

Es más yo veo que tu eres la excepción a los otros estudiantes. Tu estás mostrando avances, y eso es lo que rescato.

Yo tengo oxidada la vieja escuela... poco recuerdo del uso de archivos de registros. Como ha dicho Eliseo, estamos intentando recordar. Disculpa... mi cerebro va un tanto lento :D

Saludos,
  • 0

#19 cflowers

cflowers

    Member

  • Miembros
  • PipPip
  • 12 mensajes

Escrito 02 agosto 2010 - 08:38

claro, yo no sabia que estaban ofreciendo pagar!! no te preocupes, esta todo bien!
  • 0

#20 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderador
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 03 agosto 2010 - 12:01

Esta es mi aportación.

Hice algunos ajustes en tu código:

1) Añadí un nuevo atributo a la clase TArchivo para almacenar el nombre y la ruta del archivo, es bueno conservar esta información ya que es útil en otros métodos.

NombreArchivo: String; Lo declaré como privado y toma su valor al invocar al método NuevoArchivo o AbrirArchivo.

2) El método Agregar alumno lo declaré como una función que devuelve verdadero si la operación tiene éxito y falso en caso contrario. Así es más conveniente.

3) Modifiqué el método Eliminar alumno y ahora solamente se requiere un parámetro que es el DNI. Internamente rediseñé la rutina utilizando memoria temporal en lugar de un archivo temporal. Creo que así queda mejor.

4) Corregí algunos problemas menores que ya te había mencionado Delphius, como el colocar el puntero del archivo al inicio antes de comenzar a recorrerlo y evitar caer en ciclos infinitos.

5) Eliminé el parámetro Ver que es un StringGrid ya que es conveniente  separar la parte visual y dejarle a esta clase unicamente la responsabilidad de leer, escribir y buscar registros en un archivo.

6) Añadí el método MoverAInicio que sirve como su nombre lo indica para ir al inicio del archivo.

7) Anadí el método Siguiente para obtener el siguiente alumno de la lista. Este método en combinación con el método MoverAInicio te permitirán realizar una lectura secuencial del archivo y luego cargarlos en un StringGrid por ejemplo.




delphi
  1. unit Unit2;
  2.  
  3. interface
  4. uses Dialogs, StdCtrls, SysUtils, Classes, Grids;
  5.  
  6. type
  7. alumno = Record
  8.   Apellido, nombres: string[20];
  9.   DNI, saldo: double;
  10. end;
  11. TArchivo = class
  12. private
  13.   Archi:File of alumno;
  14.   NombreArchivo: String;
  15.   datos: alumno;
  16. public
  17.   procedure CrearArchivo(ArchiFisico:string);
  18.   procedure AbrirArchivo(ArchiFisico:string);
  19.   function Agregaralumno(c:alumno):Boolean;
  20.   procedure GuardarArchivo(ArchiFisico:string);
  21.   procedure Eliminaralumno(h:longint);
  22.   procedure CerrarArchivo;
  23.   function Buscar_X_DNI(var h:longint; var c:alumno):boolean;
  24.   procedure MoverAInicio;
  25.   function Siguiente(var c:Alumno):Boolean;
  26. end;
  27. implementation
  28.  
  29. procedure TArchivo.CrearArchivo;
  30.   begin
  31.     AssignFile(Archi,ArchiFisico);
  32.     Rewrite(Archi);
  33.     NombreArchivo:= ArchiFisico;
  34.   end;
  35. procedure TArchivo.AbrirArchivo(ArchiFisico:string);
  36.   begin
  37.     AssignFile(Archi,ArchiFisico);
  38.     Reset(Archi);
  39.     NombreArchivo:= ArchiFisico;
  40.   end;
  41. function TArchivo.Agregaralumno(c:alumno):boolean;
  42.   begin
  43.   {$I-}
  44.   Seek(Archi, FileSize(archi));
  45.   {$I+};
  46.   Result:=(IoResult=0);
  47.   If Result then
  48.       Write(Archi, c);
  49.   end;
  50.  
  51. procedure TArchivo.GuardarArchivo(ArchiFisico:string);
  52.   begin
  53.     AssignFile(Archi,ArchiFisico);
  54.     Rewrite(Archi);
  55.   end;
  56.  
  57.  
  58.  
  59. procedure TArchivo.Eliminaralumno(h:longint);
  60. var
  61.   Mem:TMemoryStream;
  62. begin
  63.   Mem:=TMemoryStream.Create; //Espacio de memoria temporal
  64.  
  65.   MoverAInicio;
  66.   while not eof (archi) do begin
  67.       read(archi,datos);
  68.       if datos.dni <> h then
  69.         Mem.write(datos,sizeOf(datos)) // Copia la registros en memoria
  70.   end;
  71.   CerrarArchivo;
  72.   Mem.SaveToFile(NombreArchivo); //Escribe el contenido de memoria temporal en disco
  73.   AbrirArchivo(NombreArchivo);
  74. end;
  75.  
  76. procedure TArchivo.CerrarArchivo;
  77.   begin
  78.       if IOresult = 0 then
  79.       begin
  80.       closefile(Archi);
  81.       end
  82.  
  83.  
  84.   end;
  85. function TArchivo.Buscar_X_DNI(var h:longint;var c: alumno):boolean;
  86. begin
  87.   MoverAInicio;
  88.   while not eof (archi) do
  89.   begin
  90.     read(archi, c);
  91.     if c.dni = h then
  92.       begin
  93.       Result := True;
  94.       Exit;
  95.       end;
  96.   end;
  97.   // alumno no encontrado
  98.   Result := False;
  99. end;
  100.  
  101. procedure TArchivo.MoverAInicio;
  102. begin
  103.   Seek(archi,0);// Se desplaza hasta el incio del archivo
  104. end;
  105.  
  106.  
  107. function TArchivo.Siguiente(var c: Alumno): Boolean;
  108. begin
  109.   Result:=not EOF(archi);
  110.   if EOF(archi) then Exit;
  111.   Read(Archi,c);
  112. end;
  113.  
  114.  
  115. end.




Aquí un pequeño ejemplo que hice para probar los métodos:



delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, Unit2, StdCtrls, Grids;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Button1: TButton;
  12.     Button2: TButton;
  13.     StringGrid1: TStringGrid;
  14.     procedure FormCreate(Sender: TObject);
  15.     procedure Button1Click(Sender: TObject);
  16.     procedure Button2Click(Sender: TObject);
  17.   private
  18.     { Private declarations }
  19.     Archivo: TArchivo;
  20.   public
  21.     { Public declarations }
  22.   end;
  23.  
  24. var
  25.   Form1: TForm1;
  26.  
  27. implementation
  28.  
  29. {$R *.dfm}
  30.  
  31.  
  32. procedure TForm1.FormCreate(Sender: TObject);
  33. var
  34. c:alumno;
  35. begin
  36.   Archivo:=TArchivo.Create;
  37.  
  38.   //Se crea un archivo de ejemplo
  39.   Archivo.CrearArchivo('nombres.dat');
  40.  
  41.   //Se añaden alumnos a la lista
  42.   c.Apellido:='Calleja';
  43.   c.nombres:='Miguel';
  44.   c.DNI:=111;
  45.   c.saldo:=100;
  46.   Archivo.Agregaralumno(c);
  47.  
  48.   c.Apellido:='Santana';
  49.   c.nombres:='Lorenzo';
  50.   c.DNI:=112;
  51.   c.saldo:=200;
  52.   Archivo.Agregaralumno(c);
  53.  
  54.  
  55.  
  56. end;
  57.  
  58. procedure TForm1.Button1Click(Sender: TObject);
  59. begin
  60.   //El botón 1 elimina un alumno
  61.   Archivo.Eliminaralumno(111);
  62. end;
  63.  
  64. procedure TForm1.Button2Click(Sender: TObject);
  65. var
  66.   datos: Alumno;
  67.   fila, columna, i: Integer;
  68. begin
  69.   //El botón 2 llena el StringGrid con los alumnos del archivo
  70.  
  71.   StringGrid1.FixedRows:=0;
  72.   StringGrid1.FixedCols:=0;
  73.   // Limpia el stringgrid
  74.   for i := 0 to StringGrid1.ColCount - 1 do
  75.     StringGrid1.Cols[i].Clear;
  76.  
  77.   Archivo.MoverAInicio;
  78.   fila:=0;
  79.  
  80.   while Archivo.Siguiente(datos) do
  81.   begin
  82.     StringGrid1.Cells[0,fila] := datos.Apellido;
  83.     StringGrid1.Cells[1,fila] := datos.nombres;
  84.     StringGrid1.Cells[2,fila] := Format('%f',[datos.DNI]);
  85.     Inc(fila);
  86.   end;
  87. end;
  88.  
  89. end.




Ahora solamente falta programar el menú de opciones y el formulario para capturar los datos de los alumnos.

¿Quién se anima ?

Saludos


  • 0