Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Asignar imagen a icono (https://www.clubdelphi.com/foros/showthread.php?t=90973)

Angel.Matilla 19-10-2016 11:29:20

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.

ecfisa 20-10-2016 09:57:50

Hola.

Fijate si te sirve de este modo:
Código PHP:

void blobToico(TField *fieldTIconico)
{
  try {
    if ( 
field->IsNull ) throw Exception("El campo tiene valor nulo");
    
TStream *stream field->DataSet->CreateBlobStreamfield bmRead );
    try {
      
Graphics::TBitmap *bmp = new Graphics::TBitmap;
      
bmp->LoadFromStreamstream );
      
TImageList* list = new TImageListbmp->Widthbmp->Height );
      try {
        list->
AddMaskedbmpbmp->TransparentColor );
        list->
GetIcon0ico );
      }
      
__finally {
        
delete list;
        
delete bmp;
      }
    }
    
__finally {
      
delete stream;
    }
  }
  catch(const 
ExceptionE) {
    
MessageBox(0E.Message.c_str(), ""MB_ICONERROR);
  }


Ejemplo de uso:
Código PHP:

void __fastcall TForm1::btnBlobToIcoClickTObject *Sender )
{
  
TIconico = new TIcon;

  try {
    
blobToico(IBDataSet1->FieldByName("IMAGE"), ico );
    
Application->Icon->Assign(ico);
  }
  
__finally {
    
delete ico;
  }


Salida del ejemplo:


Agregué un componente imagen para resaltar los cambios, ya que dado el tamaño del ícono en la barra de título, no se visualiza muy bién en la animación.

Saludos :)

Casimiro Noteví 20-10-2016 10:18:23

¿Eso se puede hacer a versiones anteriores de windows?

Angel.Matilla 20-10-2016 10:21:56

Perfecto ecfisa. ¡Eres un hacha! Muchísimas gracias.

ecfisa 20-10-2016 10:52:47

Hola Antonio.

Sólo usé el código bajo Windows 7, pero estimo que no tendría problemas de ejecutarse en versiones anteriores de windows.

Saludos :)

ecfisa 20-10-2016 11:05:15

Hola Angel.
Cita:

Empezado por Angel.Matilla (Mensaje 509774)
Perfecto ecfisa. ¡Eres un hacha! Muchísimas gracias.

Me alegro que el código te haya resultado útil.

Saludos :)


La franja horaria es GMT +2. Ahora son las 06:05:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi