 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
chezqui Invitado
|
Publicado: Mar 18 Feb, 2003 11:55 am Asunto: Insercion de imágenes en una base de datos...(No me sale) |
|
|
Hola a todos,
en primer lugar decir que estoy iniciandome en esto del builder.
Tengo un problema cuando intento insertar una imagen desde archivo, en un campo TOLE de una base de datos. Yo lo intento hacer así:
if(OpenPictureDialog1->Execute())
{
DBImageFoto->Picture->LoadFromFile(OpenPictureDialog1->FileName);
//nos posicionamos en el registro adecuado (en la fila)
DataModule2->tbSocios->GotoBookmark(DataModule2->tbSocios->GetBookmark());
//preparamos para la edicion;
DataModule2->tbSocios->Edit();
DataModule2->tbSociosFOTO->LoadFromFile(OpenPictureDialog1->FileName);
try{
DataModule2->tbSocios->Post();
}
catch(...)
{
DataModule2->tbSocios->Cancel();
}
DataModule2->tbSocios->FreeBookmark(DataModule2->tbSocios->GetBookmark());
//DataModule2->tbSocios->Fields->Count
}
Nota:
tbSociosFOTO es el campo de la base de datos tbSocios, del tipo TOLE.
También lo he probado poner TGraphic y nada de nada.
Me sale un error en tiempo de ejecucion, diciendome que el tipo de imagen no es la adecuada.
Tambien he insertado la librería jpeg.hpp, para poder insertar archivos jpg.
Bueno eso es todo. Espero haberme explicado bien y que alquien me ayude, sorry.
Muchas Gracias. |
|
| Volver arriba |
|
 |
Marky Master

Registrado: 28 Dic 2002Mensajes: 251Ubicación: Las Rozas - Madrid (España)
|
|
| Volver arriba |
|
 |
Invitado
|
Publicado: Mie 19 Feb, 2003 10:11 am Asunto: Gracias Marky por tu ayuda, pero sigue sin funcionar |
|
|
Muchas Gracias , pero sigue sin funcionar. Al hacerlo como me dices me sale ahora una mensaje tal que así:
Project Project1.exe raised exception clase EDBEngineErro with message “Record locke by another user. Table C:\MIS DOCUMENTOS\COCHES\VEHICULO.DB
User: pcchezqui”. Proccess stopped. Use Step or Run to continue
No se si es que no me situo bien en el registro adecuado, pero como dije en un principio, antes de intentar escribir en la tabla, me situo mediante el
//nos posicionamos en el registro adecuado (en la fila)
DataModule2->tbSocios->GotoBookmark(DataModule2->tbSocios->GetBookmark()); //preparamos para la edicion;
DataModule2->tbSocios->Edit();
De todas formas muchas gracias en invertir tu tiempo en mi pbma. |
|
| Volver arriba |
|
 |
Marky Master

Registrado: 28 Dic 2002Mensajes: 251Ubicación: Las Rozas - Madrid (España)
|
Publicado: Mie 19 Feb, 2003 10:28 am Asunto: |
|
|
El código que te comento es perfectamente funcional (yo lo uso y no da ni un problema) con la única pega que solo vale para guardar/leer jpgs.
El problema está al situarte en el registro marcado en la base de datos. Debes tener configurado el TSession o algún componente de acceso a datos de forma errónea por lo que no te deja modificar el registro, |
|
| Volver arriba |
|
 |
chezqu Invitado
|
Publicado: Vie 21 Feb, 2003 5:26 pm Asunto: gracias por la seguda respuesta Marky, pero ahora otro fallo |
|
|
Ante todo muchas gracias Marky por tu ayuda.
Perdona también la tardanza, pero he tenido un problema de salud, del que afortunadamente estoy mejor.
Bueno, a lo que iba; solucionado el problema de la sesion, ahora, una vez introducido tu código, me sale un error distinto cuando intento guardar una imagen. El error es algo así:
Error jpg 41
Sin embargo el compilador no se cuelga con errores de memoria.
El código nuevo de la aplicacion es:
void __fastcall TForm1::ImageFotoDblClick(TObject *Sender)
{
if(OpenPictureDialog1->Execute())
{
//Cargo la imagen en el dbEdit
ImageFoto->Picture->LoadFromFile(OpenPictureDialog1->FileName);
DataModule2->tbSocios->Edit();
//*******tu código*******
TJPEGImage *JPeg;
TMemoryStream *Corriente;
JPeg = new TJPEGImage;
Corriente = new TMemoryStream;
static_cast <TGraphicField *>(DataModule2->tbSociosFOTO)->SaveToStream(Corriente);
//DataSetOrigen en el TDataSet que le paso como parámetro
Corriente->Seek(0,soFromBeginning);
JPeg->LoadFromStream(Corriente);
ImageFoto->Picture->Assign(JPeg); //Imagen es un TImage
Corriente->Free();
JPeg->Free();
//mediante est ShoMessage he comprobado que me situo en
//el registro adecuado, y me situo bien
ShowMessage(DataModule2->tbSociosNOMBRE->Value);
static_cast<TGraphicField*>(DataModule2->tbSociosFOTO)->LoadFromFile(OpenPictureDialog1->FileName);
//***********************fin tu código
try{
DataModule2->tbSocios->Post();
}
catch(...)
{
DataModule2->tbSocios->Cancel();
}
Para cargar la imgen utilizo el evento Doble Click del DBImage.
Como cuando llamo al evento me encuentro en un determinado registro, no hace falta utilizar la marca, para posicionarme en el (lo he comprobado tambien).
Espero que te enteres.
Bueno, si puedes ayudarme muchas gracias y sino tambien.
}
} |
|
| Volver arriba |
|
 |
Marky Master

Registrado: 28 Dic 2002Mensajes: 251Ubicación: Las Rozas - Madrid (España)
|
Publicado: Vie 21 Feb, 2003 9:21 pm Asunto: Re: gracias por la seguda respuesta Marky, pero ahora otro f |
|
|
Es que aquí hay un pequeño problema de interpretación.
Para grabar la imagen en la base de datos es suficiente con usar el método LoadFromFile. Con esto, y tras llamar a Post(), la imagen ya quedaría grabada en el campo.
Con mi código lo que haces es visualizar el contenido del campo y cargarlo en un TImage, por ejemplo cuando editas un registro. No se si me entiendes, este código se usa para mostrar el contenido de un campo ftGraphic que ya fue grabado con anterioridad.
Por tanto, lo que te tiene que quedar claro es:
Para insertar la imagen en el campo
| Código: |
Tbl->Edit();
//meto la imagen en el TImagen Imagen->Picture->LoadFromFile(DialogoImagen1->FileName);
//meto la imagen en el campo
static_cast<TGraphicField *>(Tbl->FieldByName("Foto"))->LoadFromFile(DialogoImagen1->FileName);
Tbl->Post();
|
Para recuperar en un TImage una imagen que ya fue grabada en un campo
| Código: |
TJPEGImage *JPeg;
TMemoryStream *Corriente;
JPeg = new TJPEGImage;
Corriente = new TMemoryStream;
static_cast <TGraphicField *>(DataModule2->tbSociosFOTO)->SaveToStream(Corriente);
Corriente->Seek(0,soFromBeginning);
JPeg->LoadFromStream(Corriente);
ImageFoto->Picture->Assign(JPeg); //Imagen es un TImage
Corriente->Free();
JPeg->Free();
|
Espero que ahora te hayas aclarado |
|
| Volver arriba |
|
 |
chezqui Invitado
|
Publicado: Mie 05 Mar, 2003 1:27 pm Asunto: gracias markey |
|
|
Ante todo perdón por la tardanza.
Tenías razón, tu código funciona bien. El problema era debido a que yo utilizaba un TDBImage, en vez de un TImage. El componente al que hago referencia( TDBImage), sólo puede visualizar imágenes *.bmp y wmf.
Pues lo dicho, muchas gracias markey |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|