| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 19 Oct, 2016 9:48 am Asunto: Asignar imagen a icono |
|
|
Estoy trabajando cn BCB 6 y probablemente no se pueda. He estado mirando por el foro y no he podido encontrar respuesta a una duda que tengo. A ver si puedo explicarme:
Tengo una tabla FB en la que guardo, entre otras cosas, el logotipo que usaré en los impresos de la aplicación, de forma que el usuario podrá cambiar el mismo cuando desee. Me preguntaba si esa imagen guardada a partir de un fichero JPG o BMP así:
| Código: | TMemoryStream *msImagen = new TMemoryStream;
(Imagen->Picture->Bitmap)->SaveToStream(msImagen);
msImagen->Seek(0, soFromBeginning);
if (msImagen->Size != 0)
{
Query->Close();
Query->SQL->Text = "INSERT INTO Instalacion (Etiqueta, Imagen) VALUES ('Logo', :Imagen)";
Query->ParamByName("Imagen")->LoadFromStream(msImagen, ftBlob);
Query->ExecSQL();
Query->Transaction->CommitRetaining();
} |
Podría ser asignada, por ejemplo, al icono de la aplicación. He estado dando vueltas por foros y por la ayuda de Builder y se me había ocurrido que tal vez pudiera hacerse a través de un SaveToStream / LoadFromStream; se me había ocurrido esto:
| Código: | Query->Close();
Query->SQL->Text = "SELECT Imagen FROM Instalacion WHERE Etiqueta = 'Logo'";
Query->Open();
static_cast<TGraphicField>(Query->FieldByName("Imagen"))->SaveToStream(msImagen);
if (msImagen->Size > 0)
Application->Icon->LoadFromStream(msImagen); |
pero da un error en el LoadFromStream. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Mie 19 Oct, 2016 9:34 pm Asunto: |
|
|
No se si te puede servir Angel, pero yo cargo una imagen en la base con esta linea que pillé por el foro
| Código: | static_cast<TGraphicField>(tsocis->FieldByName("foto"))->LoadFromFile(fotopath->Text);
|
Si no es eso.... no te pillo
Saludos |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 20 Oct, 2016 9:11 am Asunto: |
|
|
Gracias por rsponder bosoft. El problema no es cargar la imagen en la tabla; eso lo hago sin problemas. En ese primer trozo de código que he puesto si te fijas lo que hago es comprobar que el fichero seleccionado tiene "algo" antes de intentar grabar la información en la tabla.
Lo que me gustaría es a partir de la imagen guardada en la base de datos (un JPG, un BMP, etc.) es crear el icono. He estado haciendo pruebas y tirando de cosas que he encontrado por la red tengo este código ahora:
| Código: | Graphics::TBitmap *tmpBitmap = new Graphics::TBitmap;
TImage *tmpImagen = new TImage(NULL);
TMemoryStream *msImagen = new TMemoryStream;
Query->Close();
Query->SQL->Text = "SELECT Imagen FROM Instalacion WHERE Etiqueta = 'Logotipo'";
Query->Open();
static_cast<TGraphicField>(Query->FieldByName("Imagen"))->SaveToStream(msImagen);
if (msImagen->Size > 0)
{
tmpImagen->Picture->Assign(Query->FieldByName("Imagen"));
tmpBitmap->PixelFormat = pf32bit;
tmpBitmap->Height = 48;
tmpBitmap->Width = 48;
Canvas->Draw(0, 0, tmpImagen->Picture->Bitmap);
tmpBitmap->SaveToFile("C:\\Logo.ico");
Application->Icon->LoadFromFile("C:\\Logo.ico");
DeleteFile("C:\\Logo.ico");
} |
Crea el fichero, que de hecho puedo usar por ejemplo en los accesos directos del escritorio, pero al hacer la asignación en Application->Icon->LoadFromFile me da un mensaje de error Icon image is not valide. Y esto me tiene perplejo. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 20 Oct, 2016 9:31 am Asunto: |
|
|
Bueno. Mientras contestaba a bosoft me ha dado la solución en el foro de Club Delphi. Pongo el código para que todos podamos aprovecharlo.
| Código: | void blobToico(TField *field, TIcon* ico)
{
try
{
if (field->IsNull)
throw Exception("El campo tiene valor nulo");
TStream *stream = field->DataSet->CreateBlobStream(field, bmRead);
try
{
Graphics::TBitmap *bmp = new Graphics::TBitmap;
bmp->LoadFromStream(stream);
TImageList* list = new TImageList(bmp->Width, bmp->Height);
try
{
list->AddMasked(bmp, bmp->TransparentColor);
list->GetIcon(0, ico);
}
__finally
{
delete list;
delete bmp;
}
}
__finally
{
delete stream;
}
}
catch(const Exception& E)
{
MessageBox(0, E.Message.c_str(), "", MB_ICONERROR);
}
}
//--------------------------------------------------------------------------- |
Y se usa así:
| Código: | try
{
blobToico(Query->FieldByName("Imagen"), ico);
Application->Icon->Assign(ico);
}
__finally
{
delete ico;
}
//--------------------------------------------------------------------------- |
¡Va como un tiro! _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Jue 20 Oct, 2016 10:04 am Asunto: |
|
|
ahora si que te he pillado y veo que lo has resuelto, pero siendo sincero no tenia ni idea como se hacía. Lo pondré en practica
Saludos |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Vie 03 Mar, 2017 9:31 pm Asunto: |
|
|
Prueba esto:
| Código: |
HICON HBitmapToHIcon(HBITMAP hBitmap)
{
BITMAP bmp;
HDC hDC = GetDC(NULL);
GetObject(hBitmap, sizeof(BITMAP), &bmp);
HBITMAP hMask = CreateBitmap(bmp.bmWidth, bmp.bmHeight, 1, 1, NULL);
ICONINFO i = {0};
i.fIcon = TRUE;
i.hbmColor = hBitmap;
i.hbmMask = hMask;
HICON hIcon = CreateIconIndirect(&i);
DeleteObject(hMask);
ReleaseDC(0, hDC);
return hIcon;
}
|
Ejemplo de uso:
| Código: |
TIcon* Icon = new TIcon;
Icon->Handle = HBitmapToHIcon(Image1->Picture->Bitmap->Handle);
|
En caso de usar Builder6 con iconos de más de 16 colores hay que añadir más cosas. En versiones de Builder superiores no.
Saludos. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 06 Mar, 2017 1:30 pm Asunto: |
|
|
Gracias. Lo probaré en cuanto tenga un hueco.
| escafandra escribió: | | En caso de usar Builder6 con iconos de más de 16 colores hay que añadir más cosas. En versiones de Builder superiores no. |
Uso BCB 6. ¿Qué habría que añadir, por si acaso? _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Lun 06 Mar, 2017 5:18 pm Asunto: |
|
|
| Angel escribió: | Gracias. Lo probaré en cuanto tenga un hueco.
| escafandra escribió: | | En caso de usar Builder6 con iconos de más de 16 colores hay que añadir más cosas. En versiones de Builder superiores no. |
Uso BCB 6. ¿Qué habría que añadir, por si acaso? |
hIconToMem
Saludos. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
|