![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Cita:
Cita:
Cita:
Es un problema interesante pues, a primera (y segunda) vista, no tiene sentido que sólo por cambiar el ámbito de la variable, deje de funcionar. Ahora bien, puedes hacer que "funcione" usando la variable local simplemente declarándola antes del File of TPrnCmd, y no después:
Bueno, pero eso no puede ser una solución. Seguiría siendo una cuestión de suerte. El error que obtienes es I/O error 6, que corresponde, como te comentó Lepe, a Invalid File Handle. No es una cuestión de que el archivo no se encuentre, porque entonces obtendrías un error I/O error 2 (file not found) o 3 (path not found), pero no, tú obtienes un error que te dice que estás usando un descriptor de archivo incorrecto. Si hiciste una traza del programa te habrás dado cuenta que el error aparece en la línea:
Y, de hecho, el error lo genera FileSize. Pero si pones Seek(F, 28), el error lo genera Seek. Es decir, el error se genera cada vez que tratas de usar la variable F con alguna de las funciones de manejo de archivos. F es quien tiene el descriptor. Ahora, ¿por qué está mal ese descriptor siendo que lo acabamos de crear con AssignFile? Algo, lo está dañando. Está claro que ni Reset ni Rewrite pueden dañarlo; como dice Lepe, esos procedimientos están ahí desde los tiempos de Matusalén (perdón, de Niklas Wirth). Lo único que hay entre la creación del descriptor y su uso son las asignaciones con StrPCopy. Y, como dijera Sherlock Holmes, cuando todo lo demás se ha descartado, lo que quede, por improbable que esto sea, es la verdad. Vayamos a la documentación de StrPCopy: Cita:
Tu código no hace ninguna verificación de la longitud de las cadenas que copias, aunque me parece que con las primeras no hay problema porque los datos que pasas son cortos. Aún así tienes que agregar código para verficar. Pero la última copia:
es la que revienta todo. RegPrnCmd.CRLF está declarado como array [0..1] of char, esto es, dos caracteres, y tú necesitas espacio para 2 (#13#10) + 1 (#0) caracteres. Entonces, StrPCopy escribe el caracter de terminación #0 en la parte de memoria que hay después del espacio asignado a RegPrnCmd. Según creo recordar, las variables locales se guardan en el stack o pila, así que, dependiendo del orden en que declares las variables, ese #0 sobreescribirá o no otra de las variables locales. Y una de esas variables, resulta ser la que contiene ¡el descriptor de archivo! Si declaras la variable globalmente, no afecta al stack pues se localizan en regiones distintas de la memoria. Pero es sólo por suerte, suerte de que el caracter de más no esté sobrescribiendo algo que afecte el programa. // Saludos Última edición por roman fecha: 24-02-2007 a las 19:14:37. |
|
#2
|
||||
|
||||
|
¡¡¡ Qué lección de maestría !!!
Saludos.
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
|
#3
|
||||
|
||||
|
2007-02-24 Respuesta a Roman
Hola:Gracias por tu análisis y por tus comentarios, el programa ya fue corregido. Por favor analiza estos posibles errores de compilador y me comentas: Problema con Rewrite:http://www.clubdelphi.com/foros/show...ma+con+Rewrite La función FormatMaskText no funciona como se indica en la ayuda de Delphi, : http://qc.borland.com/wc/qcmain.aspx?d=25360) Lepe me recomendo un excelente libro digital: El lado oscuro de Delphi 4, pregunto: ¿hay algún libro digital o site que me recomiendes sobre buenas practicas de programación en Delphi adicional a este? Nuevamente Gracias. ![]() |
|
#4
|
||||
|
||||
|
Bueno, no hemos dicho que delphi o el compilador esté libre de errores. Pero el de FormatMaskText no es un problema del compilador, simplemente la función al parecer tiene fallos. Y el otro caso pues ¿qué decir? La verdad dudo mucho que el problema sea tal como lo describe; yo probé ese mismo código con y sin línea en blanco y con la misma versión de Delphi, y en ambos casos funciona bien. Tu caso era posible analizarlo porque estaba todo el código; en el otro caso habría que ver qué más hay que pueda estar afectando.
Pero, aunque seguramente delphi no está libre de fallos, lo importante aquí, en mi opinión, es como muchas situaciones que podríamos jurar que se deben a bugs, resultan tener explicación y se deben a fallos nuestros. // Saludos |
|
#5
|
||||
|
||||
|
Por cierto- no lo he probado y por eso pregunto -¿no sería más sencillo si en lugar de declarar:
lo hicieras así:
Según recuerdo, con strings de tamaño fijo no tienes problemas con los records y te permite hacer asignaciones directas en lugar de usar funciones como StrPCopy más propias de C que de Pascal. // Saludos |
|
#6
|
||||
|
||||
|
2007-02-24-2 Respuesta a Roman
Hola:Si modifico el programa como tu me sugieres, tendria algo como esto:
Y la salida obtenida seria esta: Proc1 2007-02-24 19:50:11 Status1 Proc2 2007-02-24 19:50:11 Status2 Proc3 2007-02-24 19:50:11 Status3 Proc4 2007-02-24 19:50:11 Status4 Proc5 2007-02-24 19:50:11 Status5 Proc6 2007-02-24 19:50:11 Status6 Proc7 2007-02-24 19:50:11 Status7 Proc8 2007-02-24 19:50:11 Status8 Proc9 2007-02-24 19:50:11 Status9 Proc10 2007-02-24 19:50:11 Status10 Es por el caracter , que no use el tipo String. Gracias nuevamente por tus comentarios. ![]() |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Pregunta Sobre el uso del DBGrid | MARYLOSO | Conexión con bases de datos | 5 | 14-07-2005 17:19:03 |
| Pregunta sobre BDE | JorgeBec | Conexión con bases de datos | 1 | 18-03-2005 15:53:02 |
| Pregunta sobre .net | VolaRe | .NET | 10 | 14-04-2004 22:09:50 |
| pregunta sobre Ms Sql | ssaavedra | MS SQL Server | 1 | 09-01-2004 15:35:51 |
| Pregunta sobre SplashScreen | DarkByte | Varios | 2 | 14-09-2003 20:33:48 |
|