Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Que hago mal? Por favor (https://www.clubdelphi.com/foros/showthread.php?t=73216)

kdemia 08-04-2011 01:32:15

Que hago mal? Por favor
 
que tal gente, tengo una duda y voy a intentar hacerla lo mas entendible y corta posible:
Si tengo el siguiente codigo
Código Delphi [-]
{Instrucciones}
procedure Ejemplo;
var
  Variable: Integer;
  Archivo: File of Integer;
begin
  AssignFile(Archivo, "C:\Ejemplo.algo");
  Reset(Archivo);
  Read(Archivo, Variable);
  CloseFile(Archivo);
end;
{Instrucciones}
Delphi se va a encargar que el numero "Variable" que se va a leer va a estar entre -2147483648 y 2147483647 (que es el rango del integer), yo lo que necesito es acotar esos valores y hacer que el numero que se lea sea este entre -x y x, yo lo que pense es un subrango como por ejemplo:
Código Delphi [-]
{Intrucciones}
Type
  SubRango = -100..99;
{Instrucciones}
procedure Ejemplo;
var
  Variable: SubRango;
  Archivo: SubRango;
begin
  AssignFile(Archivo, "C:\Ejemplo.algo");
  Reset(Archivo);
  Read(Archivo, Variable);
  CloseFile(Archivo);
end;
{Instrucciones}
Pero no funciona, lee un numero cualquiera como si estuviera leyendo un integer.. que de hecho es un integer pero acotado... si alguien me ayuda le debo 1000.. un abrazo a todos

gatosoft 08-04-2011 06:15:35

Bueno amigo,

Pero que esperas que pase si el numero no esta en el rango?, que lo omita?, que muestre un mensaje de error?

En tu caso veo que tienes un archivo con un solo dato... si el dato no es correcto... explotaría el programa? no controlas el error de lectura...

Por que no haces la facil?

Código Delphi [-]
Function LeerNumero: Integer;
var
  Variable: Integer;
  Archivo: File of Integer;
begin
  AssignFile(Archivo, "C:\Ejemplo.algo");
  Reset(Archivo);
  Read(Archivo, Variable);
  CloseFile(Archivo);

  if (variable < CotaInferior) or (Variable > Cotasuperior) then
     Result:= ValorDefault;
  else
    result.=Variable;
end;

Bueno, la verdad no se como te este funcionando la aplicacion, pero al hacer esta prueba:

Código Delphi [-]
type
  SubRango = -100..99;

procedure Ejemplo;
var
  Variable: SubRango;
begin
  Variable:= 1000;
end;

sale un error de compilacion que dice que el numero esta fuera de rango...



Un salduo,

kdemia 08-04-2011 07:03:10

claro, no, como me lo imagine, no se entendio... cuando delphi lee un numero con el read lee a un integer y delphi lee de tal manera que pueda leer todo el archivo siempre leyendo en una variable con un rango definido.. yo puedo hacer esto:
Código Delphi [-]
{tenemos una variable "archivo: file of integer" y otra "variable: integer"}
while not EOF(Archivo) do
  read(archivo, variable);
y ahi voy a leer todo el archivo como un integer donde cada integer va a estar en un rango -x <= variable < x (si reemplazas x por 2147483648, efectivamente es el rango de los integers y variable va a estar entre esos dos numeros).. como tambien puedo hacer lo siguiente:
Código Delphi [-]
{tenemos una variable "archivo: file of int64" y otra "variable: int64"}
while not EOF(Archivo) do
  read(archivo, variable);
y voy a hacer lo mismo que el codigo anterior, solo que esta vez voy a leer el archivo como un int64 y por lo tanto cada variable va a ser de otro rango.. tmb puedo hacer lo mismo con la variable de tipo byte(0..255), word(0..65535), smallint, shortint, longword asi como tambien string y char... porque no? pero yo lo que quiero es que lo lea de cierta forma que se adapte a otro rango.. la cosa es como declaro ese rango?

oscarac 08-04-2011 17:01:01

disculpa la pregunta
pero para que utilizarias el rango?

gatosoft 08-04-2011 17:36:27

hola kdemia,

¿Te esta saliendo algún error al leer?, ¿estas verificando el dato que esta cargando?, no tengo un Delphi a la mano para hacer el ejercio, asi que veo que el problema puede estar en la estrutura del archivo y la forma como lo lees, pues como te dije, la declaración que haces está bien, y el compilador "brinca" si ingresas un numero fuera de rango.... me explico:


1) cuando haces read(archivo, variable), Delphi lee un dato sin saltar de linea... asi que si tu archivo tiene una estrutura como:

1234545676575487847568967806879'089809780'9780

y le dices lea un entero... el compilador puede estar tomando el dato que considere que aplica... como 123... la siguiente lectura, será 45, y la siguiente 56...

Cuando lees el numero, estas controlando de alguna manera lo que esta cargando la variable???

intenta por ejemplo:


Código Delphi [-]
while not EOF(Archivo) do
  begin
  read(archivo, variable);
  showmessage(IntTostr(variable));
end; //while

y nos cuentas que pasa...

Ahora, vuelvo y te repito la pregunta...¿qué esperas que pase si el dato no está en el rango?, por que el fragmento de codigo que nos muestras ocasionará un error que aborte el procedimeinto ....

Deberías darnos mas luces sobre lo que quieres hacer y como lo estas haciendo pues veo que no nos entregas toda la información...

Intenta hacerlo del modo facil, antes de encerrarte en está unica solucion que quieres...

Código Delphi [-]
while not EOF(Archivo) do
  begin
  read(archivo, variable);
  if (variable >=-99) and (variable <= 100) then
    procesardato(variable);
 end; //while



Un salduo,

kdemia 08-04-2011 18:02:03

les cuento y les respondo a los dos citando un ejemplo...yo si quiero representar un archivo cualquiera sea como codigo hexa.. lo que deberia hacer es leer el archivo como byte asi el rango estaria entre 0 y 255 y lo puedo representar como 0 o como FF con la funcion IntToHex se entiende? yo lo que quiero q en vez de q este entre 0 y 255, este entre 0 y 99, y lo que no quiero es perder ningun dato.. asi se puede hacer a la inversa es decir ir escribiendo el archivo con los datos que lei, y este siga siendo el mismo archivo..

oscarac 08-04-2011 18:05:29

mmmm no se
quiza mi cafe no esta muy cargado o la hierba no esta buena.. pero no te entendi :rolleyes::rolleyes::rolleyes:

quieres leer el archivo para que?
transformar lo que lees en Hexa ?
que contiene el archivo? Texto? datos binarios? chinitos? (como les deciamos a lo que se ve en el ejecutable)

quieres leer solo una porcion del archivo? o ir leyendo en bloque?

kdemia 08-04-2011 18:09:51

ecfisa me dijo esto.. quiza entiendan como el lo explica. :D
Cita:

Empezado por ecfisa
Hola kdemia.

Estuve leyendo tu post y creo entender perfectamente lo que buscas.

Es cambiar el formato interno de los datos, creando así no sólo un nuevo tipo de variable, sino un nuevo tipo cuyos rangos sean arbitrariamente definidos por vos. Es decir un nuevo tipo no contemplado en los tipos básicos de Delphi.

Tendría que investigarlo más. Hasta donde sé, diría que que no es posible... pero no puedo afirmarlo.

Un saludo.


oscarac 08-04-2011 18:15:21

Cita:

Empezado por kdemia (Mensaje 396339)
ecfisa me dijo esto.. quiza entiendan como el lo explica. :D


no veo el post colocado...
pero la pregunta es...
pretende definir "eso" leyendo informacion del archivo?
seria bueno saber que contiene el archivo para tener una mejor idea

kdemia 08-04-2011 18:25:10

a ver ahi si lo leen :P

Originally Posted by ecfisa
Hola kdemia.

Estuve leyendo tu post y creo entender perfectamente lo que buscas.

Es cambiar el formato interno de los datos, creando así no sólo un nuevo tipo de variable, sino un nuevo tipo cuyos rangos sean arbitrariamente definidos por vos. Es decir un nuevo tipo no contemplado en los tipos básicos de Delphi.

Tendría que investigarlo más. Hasta donde sé, diría que que no es posible... pero no puedo afirmarlo.

Un saludo.

el archivo es un archivo cualquiera.. contiene binarios..

gatosoft 08-04-2011 18:29:33

Ok, veo que la respuesta de ecfisa (por el medio que haya sido), confirma lo que te decía:

Cita:

..asi que veo que el problema puede estar en la estrutura del archivo y la forma como lo lees..
La respuesta de ecfisa es clara, la pregunta ahora es...¿te funciona asi?

debes tener en cuenta que si defines una archivo tipado, como te lo propone ecfisa (File of...) no es solo cuestion de abrir un block de notas y digitar caracteres... el archivo debe ser grabado desde un procedimeinto delphi y recuperado de la misma forma....

Un salduo,

kdemia 08-04-2011 18:35:31

ecfisa no me propone ninguna solucion, explica mas claramente mi problema y me dice que el cree que no se puede.. el medio en el que me lo dijo es mensaje privado y la parte de:
"el archivo es un archivo cualquiera.. contiene binarios.." lo puse yo contestandole a oscarac, probe tu solucion gatosoft, y funcionria solo para la lectura pero si lo quiero volver a escribir a los datos esos en un archivo no volveria a ser el mismo archivo porque perderia datos..

oscarac 08-04-2011 18:41:40

disculpa que siga preguntando pero...
cual es la funcion de leerlo y escribirlo

que haras con los binarios (0,1) o chinitos? que leas?

kdemia 08-04-2011 18:52:32

guardar el numero cmo otro formato.. raro XD no igual me parece q no se puede hacer lo q yo quiero.. muchas gracias igual a todos, lo tendre q resolver de otra manera.. un abrazo a todos y gracias por su preocupacion

gatosoft 08-04-2011 18:59:20

Cita:

ecfisa no me propone ninguna solucion
Amigo kdemia, ecfisa si te propone una solución, lo que pasa es que no te entrega el código

Cita:

Es cambiar el formato interno de los datos, creando así no sólo un nuevo tipo de variable, sino un nuevo tipo cuyos rangos sean arbitrariamente definidos por vos. Es decir un nuevo tipo no contemplado en los tipos básicos de Delphi.
Lo que plantea Ecfisa es mas o menos lo que has venido haciendo:

Código Delphi [-]
Type
TMyTipoDeDato = -99..100;
...
var
Variable: MyTipoDeDato;
Archivo: File Of TMyTipoDeDato; 
...
Write(Archivo, Variable); //tu lo generas
...
Read(Archivo, Variable); // tu lo lees

Ahora, a medida que se avanza en este hilo vas soltando mas información... y ahora creo entender que quieres leer un archivo cualquiera... posiblemente una imagen?, un archivo de texto?...

Una pregunta adicional... el archivo (cualquiera) lo generas tu?, tienes control total sobre la forma como se crea? o es solo un archivo que recibes? (PDF, JPG...)

Si no tiens control sobre eso, no puedes asumir el formato en el que está... es decir, si te dicen que es un archivo que almacena datos tipo Byte, o hexadecimal... no debes asiumir que es equivalente a leer un tipo de dato HEX o Byte de delphi...

Esta lectura debes hacerla con rutinas especiales de lectura de bloques o streams... (no tengo a la mano documentación pero podrias investigar...aqui mismo en el club)... Esto se utiliza en general para cualquier tipo de archivo BINARIO...

Nos cuentas como te va...

--agregado--
ecfisa, como moderador, no deberias responder hilos en privado... ¿no te parece?

oscarac 08-04-2011 19:00:54

sigo insistiendo en que deberias decirnos que cosa contiene el archivo
y concuerdo con gatosoft, el tema de responder en privado.. porque hace que los demas nos "perdamos" un poco

gatosoft 08-04-2011 19:15:07

Cita:

Empezado por kdemia (Mensaje 396350)
guardar el numero cmo otro formato.. raro XD no igual me parece q no se puede hacer lo q yo quiero.. muchas gracias igual a todos, lo tendre q resolver de otra manera.. un abrazo a todos y gracias por su preocupacion

Ok, amigo, finalmente lo único que te pedia oscarac es que nos contextualizaras, mejor sobre tu problema... para la proxima si quieres, esperariamos algo como:

Estoy haciendo una aplicación que lee archivos .ZIP y los transforma en archivos .RAR. Como se que los primeros estan en un formato hexadecimal que ocupa mas, los queiro transformar a uno binario que ocupa menos (esto es mentira, solo estoy inventando el problema).

Lo que hago es abrir el archivo y recorrelo con una variable Hexadecimal (FFGGHH), luego transformo ese numero a binario (1010101) y lo guardo... pero veo que se pierde información...

Aqui un fragmento del codigo... dlksadñlfgsñadj

y las pruebas de escritorio que heh hecho me dicen que cuando leo el numero hexadecimal, no me trae FFGGHH sino algo con caracteres ASCII ....

En fin... es cuestion de contextualizar un poco mas el problema y no asumir que la solucion que piensas es la única que se puede... así te podremos ofrecer alternativas.

Un salduo,

oscarac 08-04-2011 19:20:07

mm quiza esta finalizada esta pregunta
pero igual me quede con la duda
cual es el objeto de leer los datos y querer crear un nuevo tipo de datos?

he visto peliculas en donde de una imagen (foto) se pueden extraer mensajes.. quiza nuestro amigo quiere hacer algo como eso....

no podre dormir ahora pensando en esto

saludos

kdemia 08-04-2011 19:22:25

ecfisa me contesto en mp porque yo le pregunte por mp.. no es que me lo propuso asi de la nada.. segundo yo leo un archivo cuya extension no importa ni tampoco su nombre.. lo abro con un opendialog.. eso uqe propones gatasoft es lo que puse en mi ejemplo.. y no funciona.. es dificil de explicar y entender :P

ecfisa 09-04-2011 03:12:54

Hola amigos.

Recién entro despues de un día de una terrible descompostura...:(

Tal como explica kdemia, el texto es una respuesta a un mensaje privado.
No duplique el texto en un post por que no aporta ninguna solución; de haber tenido una por supuesto mi respuesta hubiera estado en este hilo.

Por lo que entiendo, kdemia quiere crear o modificar la precisión con que es almacenado un tipo, pero si esto es posible al menos yo, no sé cómo.

Un saludo. :)


La franja horaria es GMT +2. Ahora son las 00:26:08.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi