Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-03-2010
aanil aanil is offline
Miembro
 
Registrado: abr 2006
Posts: 155
Poder: 19
aanil Va por buen camino
Poner fotos en tablas planas

Hola

Mi tablas las hago en access, tengo que una lista de nombres personas para ponerle una foto pequena de frente , asi cuando consulte una persona tenga al lado su foto. Pero no me imagino como hacerlo.

Estaba buscando en este foro algo parecido, no he encontrado nada, tampoco en la red.

Si encontre esto: "Si usas Ole en Acces como tipo de campo es un equivalente al BlobField, y Delphi lo tomará así, permitiendote no solo almacenar fotos, sino cualquier otro archivo.
Cuando vincules tu tabla, o query a la tabla en acces, y hagas en el field Editor Add All fields, aparecerá un campo con el nombre que le diste al tipo Ole de tipo TBlobField en Delphi.
Este campo tiene dos metodos importantes, LoadFromFile y SaveToFile, además LoadFromStream y SaveToStream, por si necesitas pasarlo a otro tipo de medios que no sea un archivo.
Esto implica una modificación del campo, por consiguiente antes de hacer nombreDataSetNombreCampo.LoadFromFile('nombre archivo');
debes hacer nombreDataSet.Edit; o nombreDataSet.Insert; según sea el caso de estar dando de alta o modificando."
es una respuesta que le dan a alguien en otro foro, pero no enendi nada.

Si podrian darme un ejemplo.

Saludos.
Responder Con Cita
  #2  
Antiguo 16-03-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Siguiendo la ayuda que encontraste tendrías que hacer algo como esto:

1. En tu tabla access, el campo que quieras para almacenar la foto debe ser de tipo "Object OLE"

2. En tu aplicación, enlaza un componente ADOTable (o Table o el que uses) a tu tabla access.

3. En ese componente entra al editor de campos (doble clic sobre el componente) y agrega todos los campos (menú contextual|Add all fields).

4. Uno de estos campos corresponde al de la foto, se llamará algo así como ADOTable1Foto suponiendo que el campo de tu tabla access se llama foto. Este campo, en el inspector de objetos podrás ver que es de tipo TBlobField.

5. Para poner datos en un camp BlobField usas su método LoadFromStream o LoadFromFile.

6. Para recuperar los datos de un campo BlobField usas su método SaveToStream o SaveToFile.

--------------

Ahora bien, analicemos cómo agregar una imagen y como recuperar una imagen.

Agregar una imagen

Aquí debes decidir si tomas la imagen desde un archivo en disco o si ya la tienes en un componente TImage en tu aplicación.

Si es lo primero, entonces puedes usar el método LoadFromFile del BlobField (lee arriba). Pero si es lo segundo, deberás usar un objeto Stream como intermediario:

Código Delphi [-]
var
  Stream: TMemoryStream;

begin
  Stream := TMemoryStream.Create;

  try
    // Pasas el contenido de Image1 a Stream
    Image1.SaveToStream(Stream);

    // Ponemos el Stream al principio
    Stream.Position := 0;

    // Pasas el contenido del Stream al BlobField
    ADOTable1Foto.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;

Aquí estoy suponiendo que ya tienes preparado el registro donde poner la foto. Es decir, si es para un registro nuevo:

Código Delphi [-]
ADOTable1Foto.Insert;

Y si era un registro ya existente:

Código Delphi [-]
ADOTable1Foto.Edit;

una vez que te hayas colocado en el registro deseado.

Ya que tengas esto, procedes como ya sabes. Llenas los otros campos y ejecutas el método Post del ADOTable.


Recuperar una imagen

Para el paso inverso, mostrar en un componente Image, la imagen del registro actual, también necesitas un Stream de intermediario:

Código Delphi [-]
var
  Stream: TMemoryStream;

begin
  Stream := TMemoryStream.Create;

  try
    // Pasas el contenido del BlobField al Stream
    ADOTable1Foto.SaveToStream(Stream);

    // Ponemos el Stream al principio
    Stream.Position := 0;

    // Pasas el contenido del Stream a Image1
    Image1.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;

Espero que te haya quedado más claro, si no, consulta otra vez, pero dedícale un tiempo a intentar entender. He puesto el código como lo fui pensando, sin probar; así que es posible que haya uno que otro error.

// Saludos
Responder Con Cita
  #3  
Antiguo 17-03-2010
aanil aanil is offline
Miembro
 
Registrado: abr 2006
Posts: 155
Poder: 19
aanil Va por buen camino
Hola Roman.

Gracias por tu interés en ayudarme.

Hay parte del asunto que si entiendo y otras no, por ejemplo que el campo es de tipo object OLE eso lo entiendo, y otras cosas más, pero no entiendo a donde se escribe el código que me pasaste ese que sirve para agregar imagen desde un archivo y/o donde se escribe el código para recuperar imagen cuando se hace la consulta.

Por ejemplo cuando consulto el empleado Antonino, en un recuadro debe de salir la foto de ese empleado; Cuando ingreso un empleado Manuel, ¿Cómo ingreso su foto?

Esas son las cosas que me tienen enredado.

Estoy tratando de entender.

Saludos.
Responder Con Cita
  #4  
Antiguo 17-03-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Pues esto depende mucho de cómo quieras manejarlo tú, es decir, de cómo manejas en general el resto de los datos.

Por ejemplo, vamos a suponer que muestras tus registros en un DBGrid. Normalmente no querrás poner un columna con las fotos de los empleados. Se puede hacer pero puede generar un tráfico de datos innecesario.

Pero puedes colocar un componente Image a un lado del DBGrid en donde muestres la foto del empleado actualmente seleccionado. En este caso, el código para cargar la foro podrías ponerlo en el evento AfterScroll del DataSet que está enlazado al DBGrid.

Pero también podrías optar por abrir un formulario aparte con los detalles del empleado seleccionado. Esto es muy frecuente; en el DBGrid pones sólo los campos mínimos necesarios para que un usuario reconozca el registro y mediante un botón o acción similar mandas abrir un formulario con controles de datos (DBEdits, etc.) enlazados el mismo DataSet que el DBgrid para mostrar los detalles del registro actual. En ese formulario pondrías tu componente Image y, por ejemplo, podrías usar su evento OnShow para poner el código de carga de la foto.

En el caso inverso, el de agregar un empleado, sus datos y su foto, podrías usar también el formulario de detalles luego de insertar un registro en blanco. Junto a tu Image puedes tener un botón en cuyo evento OnClick cargas la imagen en el Image mediante Image.LoadFromFile. Puedes ahí mismo traspasar la imagen al campo BlobField con el código que te he puesto antes o usar directamente el método LoadFromFile del BlobField.

// Saludos
Responder Con Cita
  #5  
Antiguo 17-03-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Sigue este ejemplo:

Coloca en un form:
2 botones
1 image
1 dbnavigator
1 adotable y su adoconnection

Ahora coloca este código donde corresponde (ya de estas cosas sabes).
Código Delphi [-]
implementation

{$R *.dfm}

uses jpeg;

var jpg: TJPEGImage;

// form create
procedure TForm1.FormCreate(Sender: TObject);
begin
 jpg := TJPEGImage.Create;        // Creamos el objeto que "entiende" al JPEG

end;

// boton 1
procedure TForm1.Button1Click(Sender: TObject); 
var bmp: TBitmap; Stream: TStream;
begin
 if not OpenDialog1.Execute then Exit;

 bmp := TBitmap.Create;           // Creamos el objeto que "entiende" al Bitmap
 bmp.LoadFromFile(OpenDialog1.FileName);  // cargamos la imagen
 jpg.Assign(bmp);                 // signamos la imagen BMP al objeto del JPEG
 bmp.Destroy;                     // y liberamos el objeto. }

 ADOTable1.Open;                  // Abrimos la tabla
 ADOTable1.Insert;                // Insertamos una nueva tupla
 Stream := ADOTable1.CreateBlobStream(ADOTable1.FieldByName('photo'), bmWrite); // Asignamos el BLOB a un stream
 jpg.SaveToStream(Stream);        // y guardamos la imagen como JPEG (convertido), en el stream
 Stream.Destroy;                  // liberamos.
 ADOTable1.Post;                // Guardamos.

end;

// boton 2
procedure TForm1.Button2Click(Sender: TObject); 
var  Stream: TStream;
begin
 ADOTable1.Open;                 // Abrimos la tabla
 ADOTable1.Last;                 // Nos vamos a la última tupla para ver la ultima imagen añadida.
 Stream := ADOTable1.CreateBlobStream(ADOTable1.FieldByName('photo'), bmRead); // Lo mismo que el anterior caso pero ahora en modo de escritura.
 jpg.LoadFromStream(Stream);     // Cargamos el BLOB al objeto JPEG
 Stream.Destroy;                 // liberamos...
 Image1.Picture.Assign(jpg);     // y asignamos la imagen al TPicture.

 end;

// dbnavigator
procedure TForm1.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn); 
var  Stream: TStream;
begin
 Stream := ADOTable1.CreateBlobStream(ADOTable1.FieldByName('photo'), bmRead); // Lo mismo que el anterior caso pero ahora en modo de escritura.
 jpg.LoadFromStream(Stream);     // Cargamos el BLOB al objeto JPEG
 Stream.Destroy;                 // liberamos...
 Image1.Picture.Assign(jpg);     // y asignamos la imagen al TPicture.

end;
Este código es gracias a mi amigo cHackAll
Saludos
__________________
Siempre Novato
Responder Con Cita
  #6  
Antiguo 17-03-2010
aanil aanil is offline
Miembro
 
Registrado: abr 2006
Posts: 155
Poder: 19
aanil Va por buen camino
Hola.

Cuando corro la aplicacion se para en:

Código Delphi [-]
if not OpenDialog1.Execute then Exit;

Estoy estudiando las dos formas.

Saludos.
Responder Con Cita
  #7  
Antiguo 17-03-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Te pongo un ejemplo completo. El ejemplo incluye una base de datos de access 2003 extraida de la tabla biolife que viene con Delphi. Este ejemplo lo tenía ya por aquí en el foro para mostar un dbnavigator personalizado pero lo adapté a ADO y Access.

Los dos botones de la derecha no pertenecen al Navigator y son para cargar una imagen o borrar la imagen del registro seleccionado.

En el ejemplo incluyo las imagenes jpg en la subcarpeta fish. De entrada, ningun registro tiene imagen.

Ahora bien, es posible, pero no estoy seguro, que si tus imágenes son bitmaps en lugar de jpg, puedas usar directamente un componente DBImage directamente sin pasar por todo el rollo de los streams.

Agrego

En el ejemplo se me quedó un componente Table del BDE del ejemplo anterior. No hagas caso de él, lo puedes suprimir.

// Saludos
Archivos Adjuntos
Tipo de Archivo: zip AccBiolife.zip (549,8 KB, 59 visitas)
Responder Con Cita
  #8  
Antiguo 17-03-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
No entiendo.
Lo estoy viendo pero no quiero meter las patas.
Tienes componentes ado, sin embargo veo Zeos.
Quito las referencias sin problema?.
Saludos
__________________
Siempre Novato
Responder Con Cita
  #9  
Antiguo 17-03-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Ya le quite algunas referencias y funciono.
Esta muy bien el programa, interesante el codigo.
Saludos
__________________
Siempre Novato
Responder Con Cita
  #10  
Antiguo 17-03-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Ja, ja, perdón. Recién noto que la versión a partir de la cual hice el ejemplo no es la del que está en los foros sino una en la que había comenzado a adaptarlo a Zeos y nunca lo terminé. Gracias por la observación, espero mañana limpiarla y recolocarla aquí.

// Saludos
Responder Con Cita
  #11  
Antiguo 17-03-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Ya lo pulí y le añadí algunos comentarios.

// Saludos
Responder Con Cita
  #12  
Antiguo 19-03-2010
aanil aanil is offline
Miembro
 
Registrado: abr 2006
Posts: 155
Poder: 19
aanil Va por buen camino
Hola,

No crean que he abandonado este hilo, lo que pasa es que no he tenido la oportunidad para comenzar a estudiar la forma de colocar fotos en mi BD, con las orientaciones de ustedes.

Les digo que he es estado fuera y desconectado, en asuntos de trabajo, hoy comienzo a probar, no se me alejen que pronto sigo preguntando.

Hay algo Roman, no se de que hablas de que puliste y agregaste comentarios y lo de Caral que le quitó algunas referencias.

No se de que estaban hablando.....

Saludos.
Responder Con Cita
  #13  
Antiguo 19-03-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Me refiero al ejemplo que puse en el mensaje #7. Como lo hice a partir de otro ejemplo, tenía cosas que sobraban y que es lo que Caral quitó.

// Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Seguridad de tablas planas pmtzg Tablas planas 1 01-04-2009 08:55:41
Cansado de tablas planas... Jheysson13 Conexión con bases de datos 10 23-06-2008 15:03:21
Consejo sobre tablas planas pablonill Tablas planas 2 12-12-2006 00:08:18
Tablas planas. REHome Tablas planas 1 10-11-2005 21:18:31
backup en tablas planas soloriv Tablas planas 0 25-03-2005 14:39:54


La franja horaria es GMT +2. Ahora son las 01:09:26.


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