Ir al contenido


Foto

aplicacion en delphi


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

#21 cflowers

cflowers

    Member

  • Miembros
  • PipPip
  • 12 mensajes

Escrito 03 agosto 2010 - 07:09

gracias! ahora tengo otra duda. si tengo que crear un archivo aparte .txt. todavia no me quedo claro eso
  • 0

#22 cflowers

cflowers

    Member

  • Miembros
  • PipPip
  • 12 mensajes

Escrito 03 agosto 2010 - 08:21



delphi
  1. Unit CPromedios;
  2.  
  3. interface
  4. uses StdCtrls,SysUtils;
  5. type
  6.   TPromedios=class
  7.   private
  8.     miArchivo: TextFile;
  9.  
  10.   public
  11.     procedure Calcular(miArchivoF:string;var memo1:TMemo);
  12.   end;
  13.  
  14. implementation
  15.   procedure TPromedios.Calcular(miArchivoF:string;     
  16.                                           var memo1:TMemo);
  17.  
  18.  
  19.   var i,n1,n2,n3:byte;
  20.       nombre: string[30];
  21.       prom: single; 
  22.   begin
  23.   AssignFile(miArchivo,miArchivoF);
  24.   Reset(miArchivo);
  25.   while not eof(miArchivo) do
  26.       begin
  27.       readln(miArchivo,nombre);
  28.       readln(miArchivo,n1,n2,n3);
  29.       prom:=(n1+n2+n3)/3;
  30.     end;
  31.       end;// fin del while
  32.     CloseFile(miArchivo);
  33.   end; // fin del método
  34. end. // fin de la unit de diseño
  35.  
  36.  
  37.  
  38.  
  39. procedure TForm1.Button1Click(Sender: TObject);
  40. var x: TPromedios;
  41. begin
  42.   if opendialog1.execute then 
  43.       begin
  44.       x:=TPromedios.Create;
  45.       x.Calcular(Opendialog1.Filename, memo1);
  46.       x.Free;
  47.       end;
  48. end;



TENGO LOS ALUMNOS EN UN LISTADO .TXT CON LAS TRES NOTAS DE VARIOS ALUMNOS
NO SE COMO AGREGAR LOS PROMEDIOS A LA UNIT 2 SIN LA CLASE TPROMEDIO.

  • 0

#23 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.282 mensajes
  • LocationMéxico

Escrito 03 agosto 2010 - 08:28

Bueno, lo que pasa es que en tu clase TAlumno no tienes los campos de nota 1 a 3 por lo que así no vas a poder agregarlas al archivo.

Tengo dos dudas,

1. El DNI es numérico ?, yo lo pondría como Entero o String en lugar de Double.
2. Saldo es el promedio de las notas ??

La clase yo la declararía así.



delphi
  1. TAlumno = Record
  2.   Apellido: string[20];
  3.   nombres: string[20];
  4.   DNI: Integer;
  5.   Nota1: double;
  6.   Nota2: double;
  7.   Nota3: double;
  8.   Saldo: double;
  9. end;



Salud OS
  • 0

#24 cflowers

cflowers

    Member

  • Miembros
  • PipPip
  • 12 mensajes

Escrito 03 agosto 2010 - 08:39

claro, pero esta clase puede ir en la unit 2?? perdon por tantas preguntas pero soy principiante!
  • 0

#25 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.282 mensajes
  • LocationMéxico

Escrito 03 agosto 2010 - 08:49

claro, pero esta clase puede ir en la unit 2?? perdon por tantas preguntas pero soy principiante!


Todo puede estar en la misma unidad, el asunto es saber a que quieres llegar, un sistema comienza desde la elaboración de los requerimientos, de esa forma sabes que es lo que necesitas y como lo vas a estructurar, si ese análisis es incorrecto, comenzaremos con problemas, que se pueden solventar, pero es mejor hacerlo bien desde el principio.

Salud OS
  • 0

#26 cflowers

cflowers

    Member

  • Miembros
  • PipPip
  • 12 mensajes

Escrito 03 agosto 2010 - 09:03

MI PROBLEMA ES QUE ESTOY PROGRAMANDO EN BASE A COMPONENTES VISUALES PORQUE ME PIERDO Y NO SE DONDE PONER LAS COSAS
  • 0

#27 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.282 mensajes
  • LocationMéxico

Escrito 03 agosto 2010 - 09:16

MI PROBLEMA ES QUE ESTOY PROGRAMANDO EN BASE A COMPONENTES VISUALES PORQUE ME PIERDO Y NO SE DONDE PONER LAS COSAS


Bueno, como te digo, lo primero es analizar y crear las clases que vas a utilizar para almacenar los registros, los componentes visuales es el menor de los problemas porque estos cuentan con eventos definidos de lo que quieres que hagan.

Salud OS
  • 0

#28 cflowers

cflowers

    Member

  • Miembros
  • PipPip
  • 12 mensajes

Escrito 03 agosto 2010 - 09:25

ESTO ES LO QUE HICE EN LA UNIT 1 CON LAS CORRECIONES Y APORTES



delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, Unit2, StdCtrls, Grids, Menus;
  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.     procedure ListacPromedios1Click(Sender: TObject);
  18.     procedure Guardar1Click(Sender: TObject);
  19.   private
  20.     { Private declarations }
  21.     Archivo: TArchivo;
  22.   public
  23.     { Public declarations }
  24.   end;
  25.  
  26. var
  27.   Form1: TForm1;
  28.  
  29. implementation
  30.  
  31. {$R *.dfm}
  32.  
  33.  
  34. procedure TForm1.FormCreate(Sender: TObject);
  35. var
  36. c:alumno;
  37. begin
  38.   Archivo:=TArchivo.Create;
  39.  
  40.   //Se crea un archivo de ejemplo
  41.   Archivo.CrearArchivo('nombres.dat');
  42.  
  43.   //Se añaden alumnos a la lista
  44.   c.Apellido:='Calleja';
  45.   c.nombres:='Miguel';
  46.   c.DNI:=111;
  47.   c.saldo:=100;
  48.   Archivo.Agregaralumno(c);
  49.  
  50.   c.Apellido:='Santana';
  51.   c.nombres:='Lorenzo';
  52.   c.DNI:=112;
  53.   c.saldo:=200;
  54.   Archivo.Agregaralumno(c);
  55.  
  56.  
  57.  
  58. end;
  59.  
  60. procedure TForm1.Button1Click(Sender: TObject);
  61. begin
  62.   //El botón 1 elimina un alumno
  63.   Archivo.Eliminaralumno(111);
  64. end;
  65.  
  66. procedure TForm1.Button2Click(Sender: TObject);
  67. var
  68.   datos: Alumno;
  69.   fila, columna, i: Integer;
  70. begin
  71.   //El botón 2 llena el StringGrid con los alumnos del archivo
  72.  
  73.   StringGrid1.FixedRows:=0;
  74.   StringGrid1.FixedCols:=0;
  75.   // Limpia el stringgrid
  76.   for i := 0 to StringGrid1.ColCount - 1 do
  77.     StringGrid1.Cols[i].Clear;
  78.  
  79.   Archivo.MoverAInicio;
  80.   fila:=0;
  81.  
  82.   while Archivo.Siguiente(datos) do
  83.   begin
  84.     StringGrid1.Cells[0,fila] := datos.Apellido;
  85.     StringGrid1.Cells[1,fila] := datos.nombres;
  86.     StringGrid1.Cells[2,fila] := Format('%f',[datos.DNI]);
  87.     Inc(fila);
  88.   end;
  89.   TAlumno = Record
  90.   Apellido: string[20];
  91.   nombres: string[20];
  92.   DNI: Integer;
  93.   Nota1: double;
  94.   Nota2: double;
  95.   Nota3: double;
  96.   Saldo: double;
  97. end;
  98. var i,n1,n2,n3:byte;
  99.       nombre: string[30];
  100.       prom: single;
  101.   begin
  102.   AssignFile(miArchivo,miArchivoF);
  103.   Reset(miArchivo);
  104.   while not eof(miArchivo) do
  105.       begin
  106.       readln(miArchivo,nombre);
  107.       readln(miArchivo,n1,n2,n3);
  108.       prom:=(n1+n2+n3)/3;
  109.     end;
  110.       end;// fin del while
  111.     CloseFile(miArchivo);
  112.   end; // fin del método
  113. procedure TForm1.ListacPromedios1Click(Sender: TObject);
  114.  
  115.       var x: TPromedios;
  116. begin
  117.   if opendialog1.execute then
  118.       begin
  119.       x:=TPromedios.Create;
  120.       x.Calcular(Opendialog1.Filename, memo1);
  121.       x.Free;
  122.       end;
  123. end;
  124.  
  125. procedure TForm1.Guardar1Click(Sender: TObject);
  126. TALUMNO.GrabarALUMNO(c:ALUMNO; var  cod:byte);
  127.  
  128.   begin
  129.   {$I-} 
  130.   Seek(Archi, FileSize(archi)); 
  131.   {$I+};
  132.   cod:=IOResult;
  133.   If cod=0 then
  134.           Write(Archi,c);
  135.   end;
  136.  
  137. procedure TMane
  138. end;
  139.  
  140. end. // fin de la unit de diseño
  141.  
  142.  
  143.  
  144.  
  145. end.
  146.  
  147.  
  148. procedure TForm1.Button1Click(Sender: TObject);
  149.  
  150. end;
  151.  
  152. end;
  153.  
  154. end.



Editado: Hola cflowers como notarás, el código se ve mejor como lo acabo de modificar, esto lo puedes hacer desde el panel del mensaje, seleccionando el código y presionando el boton de delphi Imagen Enviada ó colocando la etiqueta de esta forma:
[NOBBC]


delphi
  1. //Todo el código dentro de estas etiquetas


[/NOBBC]
  • 0

#29 Khronos

Khronos

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 56 mensajes

Escrito 04 agosto 2010 - 06:56

Hola cflowers, me gustaría comentarte algunos detalles:

- Las estructuras, en Object Pascal cuando las vas a utilizar con ficheros, la guía de Programación Delphi 5 recomienda declararlas como packed record, para optimizar el manejo de memoria.
-

delphi
  1.   Apellido, nombres: string[20];
  2.  


Aquí tienes un BufferOverflow si introduces más de 21 caracteres en "Nombres" o "Apellido". Una manera de evitarlo es utilizando la propiedad MaxLength:= 21 de los controles TEdit, o bien comprobando los caracteres con la función Length antes de meterlos en la estructura.

- DNI la estás declarando como Integer, el tipo de datos Integer toma valores positivos y negativos; como los digitos del DNI son siempre positivos yo declararía DNI como Cardinal.

- Cuando hago pequeñas chapuzas con ficheros sin tipo, empleo la clase TFileStream o TMemoryStream, las funciones de Pascal son útiles, pero te recomiendo mucho aprender a usar estas 2 clases.

Tenía un poco de tiempo libre así que modifiqué un poco tu unidad:



delphi
  1. unit BaseDatos;
  2.  
  3. interface
  4.  
  5. uses SysUtils, Classes;
  6.  
  7. type
  8.   TAlumno = packed record
  9.     Nombre: String[20];
  10.     Apellido: String[20];
  11.     DNI: Cardinal;
  12.     Saldo: Double;
  13.   end;
  14.   TAlumnosArray = array of TAlumno;
  15.  
  16.   TBaseDatos = class(TObject)
  17.     private
  18.       FFileName: String;
  19.     public
  20.       constructor Create(const FileName: String); reintroduce;
  21.       destructor Destroy; override;
  22.       function AgregarAlumno(Alumno: TAlumno): boolean;
  23.       function ObtenerNumeroAlumnos: Cardinal;
  24.       function ObtenerAlumnoPorIndex(const Index: Cardinal; var Alumno: TAlumno): boolean;
  25.       function ObtenerAlumnoPorDNI(const DNI: Cardinal; var Alumno: TAlumno): boolean;
  26.       function ObtenerAlumnos(var ListaAlumnos: TAlumnosArray): boolean;
  27. end;
  28.  
  29. implementation
  30.  
  31. {TBaseDatos}
  32.  
  33. constructor TBaseDatos.Create(const FileName: string);
  34. begin
  35.   FFileName:= FileName;
  36.     inherited Create;
  37. end;
  38.  
  39. destructor TBaseDatos.Destroy;
  40. begin
  41.   inherited Destroy;
  42. end;
  43.  
  44. function TBaseDatos.ObtenerNumeroAlumnos: Cardinal;
  45. var
  46. fsDB: TFileStream;
  47. begin
  48.   if FileExists(FFileName) then
  49.     begin
  50.       try
  51.         fsDB:= TFileStream.Create(FFileName, fmOpenRead or fmShareDenyWrite);
  52.         //Abrimos el archivo en Modo Lectura o denegar la escritura
  53.         if fsDB.Size > 0 then
  54.           result:= fsDB.Size div SizeOf(TAlumno)
  55.         else result:= 0;
  56.       finally
  57.         fsDB.Free;
  58.       end;
  59.     end else
  60.       result:= 0;
  61. end;
  62.  
  63. function TBaseDatos.AgregarAlumno(Alumno: TAlumno): boolean;
  64. var
  65. fsDB: TFileStream;
  66. BytesWritten: Integer;
  67. begin
  68. result:= false;
  69.   try
  70.     if FileExists(FFileName) then
  71.       fsDB:= TFileStream.Create(FFileName, fmOpenReadWrite)
  72.         else fsDB:= TFileStream.Create(FFileName, fmCreate);
  73.     //Abrimos el archivo en Modo Escritura-Lectura
  74.     fsDB.Seek(fsDB.Size, 0); //Nos situamos al final del archivo
  75.     BytesWritten:= fsDB.Write(Alumno, SizeOf(TAlumno)); //Escribimos los datos
  76.     if BytesWritten = SizeOf(TAlumno) then
  77.       result:= true
  78.         else result:= false;
  79.   finally
  80.     fsDB.Free;
  81.   end;
  82. end;
  83.  
  84. function TBaseDatos.ObtenerAlumnoPorIndex(const Index: Cardinal; var Alumno: TAlumno): boolean;
  85. var
  86. fsDB: TFileStream;
  87. BytesRead: Integer;
  88. begin
  89. //El Index tiene que ser menor que el número de alumnos y mayor o igual que 0
  90. //Si tenemos 2 alumnos, podriamos establecer un Index con valor 0 o 1
  91.   if (Index < ObtenerNumeroAlumnos) and (Index >= 0) then
  92.     begin
  93.       try
  94.         fsDB:= TFileStream.Create(FFileName, fmOpenRead or fmShareDenyWrite);
  95.         fsDB.Seek(Index * SizeOf(TAlumno), 0);
  96.         //Nos situamos antes del registro que queremos leer
  97.         BytesRead:= fsDB.Read(Alumno, SizeOf(TAlumno));
  98.         if BytesRead = SizeOf(TAlumno) then
  99.           result:= true
  100.             else result:= false;
  101.       finally
  102.         fsDB.Free;
  103.       end;
  104.     end else
  105.       result:= false;
  106. end;
  107.  
  108. function TBaseDatos.ObtenerAlumnoPorDNI(const DNI: Cardinal; var Alumno: TAlumno): boolean;
  109. var
  110. fsDB: TFileStream;
  111. AlumnoTemp: TAlumno;
  112. BytesRead, i: integer;
  113. NumeroAlumnos: Cardinal;
  114. begin
  115. NumeroAlumnos:= ObtenerNumeroAlumnos;
  116.   if (NumeroAlumnos > 0) and (DNI > 0) then
  117.     begin
  118.       try
  119.         fsDB:= TFileStream.Create(FFileName, fmOpenRead or fmShareDenyWrite);
  120.         for i := 0 to NumeroAlumnos - 1 do
  121.           begin
  122.             fsDB.Seek(I * SizeOf(TAlumno), 0);
  123.             BytesRead:= fsDB.Read(AlumnoTemp, SizeOf(TAlumno));
  124.             if BytesRead = SizeOf(TAlumno) then
  125.               if AlumnoTemp.DNI = DNI then
  126.                 begin
  127.                   result:= True;
  128.                   Alumno:= AlumnoTemp;
  129.                   break;
  130.                 end;
  131.           end;
  132.       finally
  133.         fsDB.Free;
  134.       end;
  135.     end else
  136.       result:= false;
  137. end;
  138.  
  139. function TBaseDatos.ObtenerAlumnos(var ListaAlumnos: TAlumnosArray): boolean;
  140. var
  141. i, BytesRead: integer;
  142. fsDB: TFileStream;
  143. NumeroAlumnos: Cardinal;
  144. begin
  145. NumeroAlumnos:= ObtenerNumeroAlumnos;
  146.   if NumeroAlumnos > 0 then
  147.     begin
  148.       try
  149.         SetLength(ListaAlumnos, NumeroAlumnos);
  150.         fsDB:= TFileStream.Create(FFileName, fmOpenRead or fmShareDenyWrite);
  151.         for i := 0 to NumeroAlumnos - 1 do
  152.             begin
  153.               fsDB.Seek(I * SizeOf(TAlumno), 0);
  154.               BytesRead:= fsDB.Read(ListaAlumnos[i], SizeOf(TAlumno));
  155.               if BytesRead <> SizeOf(TAlumno) then
  156.                 begin
  157.                   ListaAlumnos:= nil;
  158.                   result:= false;
  159.                   break;
  160.                 end;
  161.             end;
  162.         if ListaAlumnos <> nil then result:= True;
  163.       finally
  164.         fsDB.Free;
  165.       end;
  166.     end else
  167.       result:= false;
  168. end;
  169.  
  170. end.




Para trabajar con ella...



delphi
  1. var
  2.   Form1: TForm1;
  3.   DB: TBaseDatos;
  4.  
  5. implementation
  6.  
  7. {$R *.dfm}
  8.  
  9. procedure TForm1.VerAlumnosClick(Sender: TObject);
  10. var
  11. i: integer;
  12. ListItem: TListItem;
  13. ListaAlumnos: TAlumnosArray;
  14. begin
  15. ListView1.Clear;
  16.   If DB.ObtenerAlumnos(ListaAlumnos) then
  17.     begin
  18.       for i := low(ListaAlumnos) to High(ListaAlumnos) do
  19.           begin
  20.             ListItem:= ListView1.Items.Add;
  21.             ListItem.Caption:= ListaAlumnos[i].Nombre;
  22.             ListItem.SubItems.Add(ListaAlumnos[i].Apellido);
  23.             ListItem.SubItems.Add(IntToStr(ListaAlumnos[i].DNI));
  24.             ListItem.SubItems.Add(FloatToStr(ListaAlumnos[i].Saldo));
  25.           end;
  26.       ListaAlumnos:= nil;
  27.     end;
  28. end;
  29.  
  30. procedure TForm1.AgregarAlumnosClick(Sender: TObject);
  31. var
  32. Alumno: TAlumno;
  33. begin
  34.   Alumno.Nombre:= Edit1.Text;
  35.   Alumno.Apellido:= Edit2.Text;
  36.   Alumno.DNI:= StrToInt(Edit3.Text);
  37.   Alumno.Saldo:= StrToFloat(Edit4.Text);
  38.   If DB.AgregarAlumno(Alumno) then
  39.     showmessage('Alumno agregado con éxito')
  40.   else showmessage('Fallo!');
  41.  
  42. end;
  43.  
  44. procedure TForm1.FormCreate(Sender: TObject);
  45. begin
  46.   DB:= TBaseDatos.Create('datos.dat');
  47. end;
  48.  
  49. procedure TForm1.FormDestroy(Sender: TObject);
  50. begin
  51.   DB.Free;
  52. end;



Saludos, espero que te sirva.
  • 0