Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Asignar imagen a icono

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Asignar imagen a icono Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Sólo tiene un problema, y esto no lo sabía: El icono siempre es transparente y a veces queda con un aspecto extraño, por la combinación de colores resultante, en la barra de botones.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
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


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.