Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-06-2007
Avatar de marceloalegre
[marceloalegre] marceloalegre is offline
Miembro Premium
 
Registrado: abr 2005
Ubicación: Mar del Plata - Argentina
Posts: 448
Poder: 20
marceloalegre Va por buen camino
Post JPG en record... tamaño variable?

Buenos días amigos,
Me encuentro hoy con la siguiente cuestión:
resulta que tengo que leer de un memorystream que contiene datos varios entre ellos un archivo jpg de tamaño variable.

este es mi registro:
Código Delphi [-]
 TFileRecord = packed record
  Dato1: Cardinal;
  Dato2: SmallInt;
  Dato3: Byte; //datos varios....
  PhotoSize: Cardinal; //largo en bytes de la foto...
  //Photo: Este campo es variable que me gustaria tener???!!!
 end;

normalmente yo leo de la siguiente manera:
Código Delphi [-]
FileData.Read(unFileRecord,sizeof(TFileRecord));
pero esto no me alcanza ahora, porque tengo un dato variable, entonces despues agrego...
Código Delphi [-]
FileData.Read(photoBuffer, unFileRecord.PhotoSize); //no se de que tipo sera el photobuffer!
ahora ya he leido la foto (como aclare no se que tipo seria este photobuffer )...

Ahora bien, existe algun tipo de datos para que pueda trabajar con el registro en forma directa (creo que para los bmp hay un tipo de datos tbitmap si no me equivoco... pero esto es jpg...) mi idea es no hacer ese read de ser posible (el porque? tengo clases armadas en las que paso el registro en forma directa para ser procesado y bueno me genera varias modificaciones...), y tener todo encapsulado en un registro donde Photo sea de algun tipo jpg o algo asi... no se si esto esta inventado o no queda otra que leerlo "artesanalmente"..

Espero se entienda mi pregunta!... Muchas gracias
Responder Con Cita
  #2  
Antiguo 19-06-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Creo que la forma en la que lo estas haciendo es correcta. Primero lees un record, con un tamaño conocido, y una vez obtienes el tamaño de la imagen que viene a continuación lees la imagen. Es el mismo método que yo mismo usaría.

Lo que no entiendo muy bien es donde esta problema, aunque añadieras un campo mas (TBitmap o TJPEGImage) este solo seria un puntero a ese objeto, tu tendrías que crear el objeto y leer la imagen desde el fichero. Yo creo que deberías de ir un poco mas allá y empezar a utilizar clases (objetos) en vez de records para manejar estas estructuras un poco complicadas.

Por último, y si mi consejo de utilizar objetos no te convence, utiliza un record con un tamaño variable, gracias al milagro de los punteros. Declara un record tal que así:
Código Delphi [-]
TFileRecord = packed record
  Dato1: Cardinal;
  Dato2: SmallInt;
  Dato3: Byte; //datos varios....
  PhotoSize: Cardinal; //largo en bytes de la foto...
  Photo: array[0..0] of Byte;
 end;

Y un puneto como este:
Código Delphi [-]
  PFileRecord = ^TFileRecord;

Ahora solo tienes que leer los primeros campos como hacias antes, obtener el tamaño de la imagen, reservar tanta memoria como necesites para guardar los campos y la imagen, y guardar en ella los campos y la imagen. Ahora a través de los campos del puntero tendrás acceso a todos los campos del record y a los datos de la imagen.

Perdona que no te ponga código, pero ando un poco ocupado.
Responder Con Cita
  #3  
Antiguo 19-06-2007
Avatar de marceloalegre
[marceloalegre] marceloalegre is offline
Miembro Premium
 
Registrado: abr 2005
Ubicación: Mar del Plata - Argentina
Posts: 448
Poder: 20
marceloalegre Va por buen camino
Post

Oks!, a ver... en cuanto al tema de la clase... es factible implementar algo como esto? (perdon, no se si estaremos bien, si es lo que me querias decir...)

Veamos...

Código Delphi [-]
unit uClaseTest;
interface
uses classes,jpeg;

type
TFileRecord = packed record
  Dato1: Cardinal;
  Dato2: SmallInt;
  Dato3: Byte; //datos varios....
  PhotoSize: Cardinal; //largo en bytes de la foto...
  //Photo ... no puedo 
 end;
 
TFileClass = class (TObject)
  public
  Dato1: Cardinal;
  Dato2: SmallInt;
  Dato3: Byte; //datos varios....
  PhotoSize: Cardinal; //largo en bytes de la foto...
  Photo: TJPEGImage;
  constructor create(FileRecord:TFileRecord;StreamData:TmemoryStream);
 end;
 
implementation
uses DateUtils, uUtil;
{ TDeposit }
constructor TFileClass.create(FileRecord:TFileRecord;StreamData:TmemoryStream);
begin
    inherited create;
    Dato1:=FileRecord.Dato1;
    Dato2:=FileRecord.Dato2;
    Dato3:=FileRecord.Dato3;
    PhotoSize:=FileRecord.PhotoSize;
    Photo:= TJPEGImage.Create;
    Photo.LoadFromStream(StreamData);
end;
end.

Con esto, si es que funciona podria cargar la foto dentro de la clase llamandola así, desde el metodo que recorro el memorystream:
Código Delphi [-]
var
unFileClassData:TFileClass;
unFileRecord:TFileRecord;
StreamData:TMemoryStream;
begin
//Imaginemos que estoy dentro del while recorriendo el Memorystream.. 
StreamData.Read(unFileRecord,sizeof(TFileRecord));
unFileClassData:=TFileClassData.create(unFileRecord,StreamData);//Le paso el registro, y el memorystream para que extraiga la foto al hacer el create...

Bueno... no se si alcanzo a explicarme de acuerdo a lo que me dices domingo...

Fijate que te parece, sin apuros, y cuando puedas!!(logicamente todos estamos ocupados en nuestras cuestiones ...!), me gustaria ver ese "poco de codigo" que siempre aportas donde las cosas quedan totalmente claras.

Saludos!!!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Record Key/Deleted Ricardo Alfredo Varios 4 13-03-2008 11:08:35
variable dentro de una variable molinero1 Varios 3 23-04-2007 12:44:48
REcord/key deleted Luis Castillo Varios 1 02-11-2005 00:22:37
evento on new record? istradlin Conexión con bases de datos 8 12-04-2005 23:15:00
Comparar dos RECORD oworty Varios 3 23-11-2004 15:18:33


La franja horaria es GMT +2. Ahora son las 07:51:41.


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
Copyright 1996-2007 Club Delphi