FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
#1
|
|||
|
|||
Auxilio
Hola, estoy haciendo un curso de programacion para delphi y necesito entregar un trabajo práctico, el tema es que estoy trabada porque no logro sortear un problema. Este problema es que mediante la aplicacion debo crear un archivo txt para almacenar informacion de tipo nombre, apellido, etc, y no puedo hacerlo. es decir, logro crear el archivo pero almacena la informacion de manera erronea.. es decir con garabatos EJ: " aaaaa Üý Äl aaaaaaäE`$wD \ý ü ² bbbbbb Üý Äl"
Como puedo solucionarlo? Les adjunto los codigos: Unit 1 Código:
procedure TForm1.AgregarCliente1Click(Sender: TObject); var c:Cliente; cod:byte ; begin c.Apellido:=Edit1.Text; c.Nombres:=Edit2.Text; c.DNI:=StrToInt(Edit3.Text); z.GrabarCliente(c,cod); If cod<>0 then ShowMessage('No se pudo Agregar el Cliente.Seguramente no Abrió antes el archivo') else ShowMessage('Se ha agregado el registro'); end; unit 2 Código:
procedure TManejoClientes.GrabarCliente(c:Cliente; var cod:byte); begin {$I-} Seek(Archi, FileSize(archi)); {$I+}; cod:=IOResult; If cod=0 then Write(Archi,c); end; |
#2
|
||||
|
||||
Hola, maugescully. Bienvenida al club.
Como a todos los nuevos, te invito a leer la guía de estilo. Con respecto a tu pregunta. Ese archivo "Archi"... supongo que es un "file of Cliente". ¿Y cliente qué sería un registro? ¿verdad? Si es un registro (record), seguramente no te va a guardar un texto bien armadito. Va a guardar la representación interna del registro... y eso no es texto normal. La información está guardada, y podrías leerla con un Read, pero no está en formato de texto. Para guardarla en formato de texto tendrías que declarar el archivo como "TextFile" y después hacer
PD: Por cierto, no quiero complicarte la vida, por ahora está bien que uses IOResult, pero sabé que no es lo más correcto. Así que en algún momento sería bueno que investigaras el asunto. |
#3
|
|||
|
|||
Gracias lord delfos por tus consejos, te cuento que estoy intantando hacer el cambio que me dijiste peor me salta un error que no logro corregir. Si no es mucha molestia te pediría queme orientes: te paso el codigo completo para que veas de que se trata
unit 1 Código:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, Unit2; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Archivo: TMainMenu; ARCHIVO1: TMenuItem; NUEVO1: TMenuItem; ABRIR1: TMenuItem; GUARDAR1: TMenuItem; AGREGARALUMNO1: TMenuItem; ELIMINARALUMNO1: TMenuItem; CERRRA1: TMenuItem; HERRAMIENTAS1: TMenuItem; objectLabel5TLabel1: TMenuItem; LISTACPROMEDIOS1: TMenuItem; LISTADEREGULARES1: TMenuItem; LISTADELIBRES1: TMenuItem; SALIR1: TMenuItem; Label8: TLabel; Label9: TLabel; Edit7: TEdit; Button1: TButton; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; procedure NUEVO1Click(Sender: TObject); procedure ABRIR1Click(Sender: TObject); //procedure GUARDAR1Click(Sender: TObject); procedure AGREGARALUMNO1Click(Sender: TObject); procedure SALIR1Click(Sender: TObject); procedure FormCreate(Sender: TObject); //procedure ELIMINARALUMNO1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; z: TAdministrar; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin z:=TAdministrar.Create; end; procedure TForm1.NUEVO1Click(Sender: TObject); begin If SaveDialog1.Execute then begin z.ArchivoNuevo(Savedialog1.filename{+'.txt'}); showmessage('Se creó el archivo:'+Savedialog1.filename{+'.txt'}) end end; procedure TForm1.ABRIR1Click(Sender: TObject); begin If OpenDialog1.Execute then begin z.AbrirArchivo(OpenDialog1.filename); showmessage('Archivo '+OpenDialog1.filename+' Abierto') end end; procedure TForm1.AGREGARALUMNO1Click(Sender: TObject); var a:Alumno; b:byte; z: TAdministrar; begin a.Apellido:=Edit2.Text; a.Nombres:=Edit3.Text; a.DNI:=StrToInt(Edit1.Text); a.N1:=StrToInt(Edit4.Text); a.N2:=StrToInt(Edit5.Text); a.N3:=StrToInt(Edit6.Text); z.AgregarAlumno(a,b); If b<>0 then ShowMessage('No se pudo Agregar el Cliente.Seguramente no Abrió antes el archivo') else ShowMessage('Se ha agregado el registro'); end; procedure TForm1.SALIR1Click(Sender: TObject); begin Close; end; Código:
unit Unit2; interface uses SysUtils,Dialogs; Type Alumno= Record Apellido, nombres: string[20]; DNI:longint; N1, N2, N3: real; end; TAdministrar=class private Archi: File of Alumno; public procedure ArchivoNuevo(ArchiFisico:string); procedure AbrirArchivo(ArchiFisico:string); procedure AgregarAlumno(a:Alumno; var b:byte); //procedure borrarArchivo(p:word; a:Alumno; var cod:byte; m:string); //procedure BuscarCliente(p:word; var c:Cliente; var m:string); //procedure CerrarArchivo; end; implementation procedure TAdministrar.ArchivoNuevo(ArchiFisico:string); var archi:textfile; begin AssignFile(Archi,ArchiFisico); Rewrite(Archi); end; procedure TAdministrar.AbrirArchivo(ArchiFisico:string); var archi:textfile; begin AssignFile(Archi,ArchiFisico); Reset(Archi) end; procedure TAdministrar.AgregarAlumno(a:Alumno; var b:byte); begin {$I-} Seek(Archi, FileSize (archi)); {$I+}; b:=IOResult; If b=0 then Writeln(Archi, a.Apellido); Writeln(Archi, a.Nombres); Writeln(Archi, a.DNI); Writeln(Archi, a.N1); Writeln(Archi, a.N2); Writeln(Archi, a.N3); end; end. [Error] Unit2.pas(52): Incompatible types: 'Alumno' and 'ShortString' [Error] Unit2.pas(53): Illegal type in Write/Writeln statement [Error] Unit2.pas(53): Incompatible types: 'Alumno' and 'ShortString' [Error] Unit2.pas(54): Illegal type in Write/Writeln statement Muchisimas gracias!!! Última edición por maugescully fecha: 07-08-2010 a las 05:31:33. Razón: me falto [code][/code] |
#4
|
||||
|
||||
Hola maugescully.
Cuando ví el título pensé que te estabas ahogando... Voy a agregar algunas sugerencias a las que ya te ha dado Lord Delfos. En este caso no es buena idea dejar que el usuario elija el nombre del archivo, complica la cosa y es propenso a generar confusiones. Si lo que guardamos son alumnos y el archivo es de texto, lo lógico es darle un nombre (ALUMNOS.TXT por ej.) y trabajar con el mismo. El nombre de la variable archivo "Archi" podés declararlo como global por ahora. Todo esto te simplifica puesto que podés habrir el archivo al ingresar a la aplicación y cerrarlo cuando abandonas la misma, prescindiendo así de los TOpenDialog. Abrir y Cerrar:
Los errores se generan en AgregarAlumo, mirá este código:
Hay más cosas para depurar, pero la idea es que vos lo hagas... Por último te aconsejo que escuches lo dicho por mi colega sobre el uso de {$I}. Una pista: You try to resolve. Saludos. Última edición por ecfisa fecha: 07-08-2010 a las 17:05:17. |
#5
|
|||
|
|||
Mil gracias a los dos... La verdad es que si, mi auxilio sono desesperado, y es porque lo estamos. Hace 15 dás venimos luchando con este trabajo y no logramos sacarlo. El tema es que tenemos que entregarlo el martes a mas tardar.
Seguiremos luchando y si necesito de ustedes volvere a consultarles!! Muchissimas gracias de nevo! |
#6
|
||||
|
||||
Como decía Queen....another one bites the dust!!!...En fin bien por Delfos y los demás..mal por el usuario ya saben por qué---
__________________
AKA "El animalito" ||Cordobés a mucha honra|| |
#7
|
||||
|
||||
Cita:
Lo que está pasando es que declaraste el archivo como "file of Alumno". Eso es un archivo binario que solamente acepta que vos escribas variables de tipo Alumno. Para escribir Alumno.Nombre deberías tener un archivo de tipo "TextFile". Por ejemplo:
Cita:
En el link que te paso Caral explican muy bien cómo es el tema con los archivos de texto. Otro link por si las dudas. Saludos. |
#8
|
|||
|
|||
Muchas Gracias A Los Dos Por Su Ayuda!
|
#9
|
||||
|
||||
Gracias por los comentarios Caral, ya le comenté a nuestro amigo el sentido de mi comentario lo cual para nada era con la intención de atacar. Afortunadamente maugescully esta sacando bastante ayuda para resolver su duda y creo que ya tiene bastante claro cual es la filosofia del Club la cual obviamente no es resolver tareas ajenas sino ayudarnos pues no todos somos expertos en todo y siempre requerimos alguna opinión.
Tratando de aportar al hilo: No crees que serviría que nos escribas el texto de lo que te pidieron. Analizando lo que has hecho veo que en lo que ya te servía (tu primer código) prácticamente ya lo tenias resuelto pues lograbas almacenar todos los datos, solo faltaba grabar esos datos pero en formato TXT, que es relativamente muy simple basado en ese esquema, pues solamente tienes que ir recorriendo tu archivo de datos, leer cada registro y escribirlo en un archivo de texto. De esta forma puedes seguir agregando registros e inclusive volverlos a editar uno por uno. Pero insisto necesitas aclarar bien que te pidieron
__________________
AKA "El animalito" ||Cordobés a mucha honra|| |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
string literal may have at most 255 elements?? auxilio | einarcito | SQL | 7 | 26-08-2008 01:26:15 |
Auxilio con FastReport | nmg05 | Impresión | 0 | 14-04-2008 18:42:43 |
Auxilio en ComboBox | Luis | Conexión con bases de datos | 4 | 30-09-2004 09:43:55 |
Auxilio....Tipos de datos | buitrago | Firebird e Interbase | 0 | 07-09-2004 00:51:20 |
|