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 una imagen de un TImageList a un TBitButton en ejecucion (https://www.clubdelphi.com/foros/showthread.php?t=87362)

aguml 20-12-2014 00:59:38

Asignar una imagen de un TImageList a un TBitButton en ejecucion
 
Amigos lo he intentado todo y he buscado por todas partes y lo he conseguido hacerlo funcionar asi:
Código PHP:

Graphics::TBitmap *bmp = new Graphics::TBitmap();
ImageList->GetBitmap(0,bmp);
BitBtnImprimir->Glyph->Assign(bmp);
delete bmp

He probado con:
Código PHP:

ImageList->GetBitmap(0,BitBtnImprimir->Glyph); 

pero no surte efecto, solo me ha funcionado usando el metodo de arriba y la verdad es que no me agrada tener que usar un TBitmap intermedio para ello ¿se puede hacer directamente?

ecfisa 20-12-2014 01:06:56

Hola aguml.

¿ Que versión de C++ Builder ?

Por que con la 6.0 nunca tuve problemas en asignar las imágenes en forma directa (como en el 2do código de tu mensaje)

Saludos :)

aguml 20-12-2014 09:12:19

pues es la 6.

aguml 20-12-2014 11:54:07

son imagenes bmp creadas con photoshop con formato Windows 32bits y 42*42. Si las pongo en el bitbtn en tiempo de diseño sale perfecta y con transparencia y todo. Si lo hago usando el ImageList tengo que usar un TBitMap auxiliar y ademas pierdo el color de transparencia. Supongo que lo del color de transparencia se soluciona trasteando las opciones del tbitmap pero lo otro no se que hacer. ¿Que formato tiene que tener el bmp para que no de problemas?

Casimiro Notevi 20-12-2014 16:17:57

La transparencia es del color que tenga el pixel primero de la esquina izquierda, abajo.

aguml 20-12-2014 18:09:10

pues es raro porque la imagen tiene fondo blanco pero hay un recuadro mas interno que lo tiene en un blanco sucio y si añado directamente la imagen al tbitbtn me quita tanto el blanco como el blanco sucio y sin ni siquiera elegir el color paratransparencia que en el tbitbtn no se como hacerlo. Sin embargo, al añadir las imagenes al timagelist si me deja elegir el color y elijo el del recuadro mas interno y en la vista previa que muestra se ve bien pero al asignar la imagen en tiempo de ejecucion se pasa la transparencia por el forro XD

ecfisa 20-12-2014 18:55:00

Hola aguml
Cita:

Empezado por aguml (Mensaje 486915)
son imagenes bmp creadas con photoshop con formato Windows 32bits y 42*42.

No tengo PhotoShop ¿ Podrías adjuntar una imágen como para hacer pruebas ?

Saludos :)

aguml 20-12-2014 21:25:50

ok, en cuanto tenga ocasion subo las dos imagenes.

aguml 21-12-2014 12:49:26

Ahora mismo el codigo lo tengo así:
Código PHP:

void __fastcall TForm2::BitBtnImprimirClick(TObject *Sender)
{
   if(
imprimiendo == false)
   {
      
imprimiendo true;
      
Graphics::TBitmap *bmp;
      try
      {
         
bmp = new Graphics::TBitmap();
      }
      catch(...)
      {
         
Application->MessageBoxA("No hay memoria suficiente. El programa se cerrará.\nCierra otras aplicaciones y vuelve a intentarlo.""Error"MB_OK |MB_ICONERROR MB_APPLMODAL);
         
Application->Terminate();
      }
      
ImageList->GetBitmap(1bmp);
      
bmp->TransparentColor clWhite;
      
bmp->IgnorePalette true;
      
BitBtnImprimir->Glyph->Assign(bmp);
      
VividReport1->Print();
      
delete bmp;
   }
   else
   {
      
Application->MessageBoxA("La impresion ya ha sido enviada. Espere a que termine el proceso de envio y vuelve a intentarlo.""Atención"MB_OK |MB_ICONINFORMATION MB_APPLMODAL);
   }
}
//---------------------------------------------------------------------------

void __fastcall TForm2::VividReport1EndPrint(TObject *Sender,
      
TAfterAction &ARepeat)
{
   
Graphics::TBitmap *bmp;
   try
   {
      
bmp = new Graphics::TBitmap();
   }
   catch(...)
   {
      
Application->MessageBoxA("No hay memoria suficiente. El programa se cerrará.\nCierra otras aplicaciones y vuelve a intentarlo.""Error"MB_OK |MB_ICONERROR MB_APPLMODAL);
      
Application->Terminate();
   }
   
ImageList->GetBitmap(0bmp);
   
bmp->TransparentColor clWhite;
   
bmp->IgnorePalette true;
   
BitBtnImprimir->Glyph->Assign(bmp);
   
delete bmp;
   
imprimiendo false;


He probado a borrar el fondo de las imagenes, o sea dejarlos blancos, y sigue haciendo lo mismo, me aparece el fondo.
Tambien va una captura del Gliph del TBitBtn cuando le asigno una imagen en tiempo de diseño y esta aparece bien y del bmp justo antes de asignarlo al Gliph.
Y el link de las imagenes: https://mega.co.nz/#!Ntc31BZA!A95KnN...l9Q1q_KYdjcGCw

ecfisa 22-12-2014 00:17:47

Hola aguml.

Usando las imágenes que adjuntaste y este código,
Código PHP:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  
Graphics::TBitmap *bm = new Graphics::TBitmap;

  
ImageList1->Height 42;
  
ImageList1->Width  42;

  
bm->LoadFromFile("C:\\imagenes\\ico_imprimir_original.bmp");
  
ImageList1->Add(bm0);
  
bm->LoadFromFile("C:\\imagenes\\ico_Cancelar_Impresion_original.bmp");
  
ImageList1->Add(bm0);
  
bm->LoadFromFile("C:\\imagenes\\ico_imprimir_final.bmp");
  
ImageList1->Add(bm0);
  
bm->LoadFromFile("C:\\imagenes\\ico_Cancelar_Impresion_final.bmp");
  
ImageList1->Add(bm0);

  
delete bm;
}

void __fastcall TForm1::btnPutImagesClick(TObject *Sender)
{
  
ImageList1->GetBitmap(0BitBtnPrintOrig->Glyph);
  
ImageList1->GetBitmap(1BitBtnCancelOrig->Glyph);
  
ImageList1->GetBitmap(2BitBtnPrintMod->Glyph);
  
ImageList1->GetBitmap(3BitBtnCancelMod->Glyph);


obtengo esta salida:


Saludos :)

aguml 22-12-2014 13:30:05

A ver, ya di con la solucion pero querria a ver si podeis explicarme porque pasa eso.
El bitbtn es uno solo y si cargo la imagen en el evento oncreate del form se carga con transparencia sin problemas.
El problema viene si intentas cambiar la imagen en ejecucion que entonces no cambia la imagen.
Probé a poner las propiedades del Glyph (Transparent a true, cambiar el color de TransparentColor, cambiar TransparentMode, y otras cosas).
Probé con:
Código PHP:

bitbtn->Glyph->Canvas->Draw(0,0,bmp); 

Eso si que funciona pero hay que usar un TBitmap intermedio.
Despues de tanto comerme la cabeza me di cuenta que con esto funciona perfecto:
Código PHP:

void __fastcall TForm2::FormCreate(TObject *Sender)
{
   
ImageList->GetBitmap(0BitBtnImprimir->Glyph);
}
//---------------------------------------------------------------------------

void __fastcall TForm2::BitBtnImprimirClick(TObject *Sender)
{
   if(
imprimiendo == false)
   {
      
imprimiendo true;
      
BitBtnImprimir->Glyph NULL;
      
ImageList->GetBitmap(1BitBtnImprimir->Glyph);
      
VividReport1->Print();
   }
   else
   {
      
Application->MessageBoxA("La impresion ya ha sido enviada. Espere a que termine el proceso de envio y vuelve a intentarlo.""Atención"MB_OK |MB_ICONINFORMATION MB_APPLMODAL);
   }
}
//---------------------------------------------------------------------------

void __fastcall TForm2::VividReport1EndPrint(TObject *Sender,
      
TAfterAction &ARepeat)
{
   
BitBtnImprimir->Glyph NULL;
   
ImageList->GetBitmap(0BitBtnImprimir->Glyph);
   
imprimiendo false;


No se porque hay que poner a NULL el Glyph antes de asignarle una nueva imagen para que funcione pero asi funciona y sin eso no funciona. ¿pueden explicarme por que? ¿es correcto lo que hago?

ecfisa 22-12-2014 15:21:17

Hola aguml.

Cita:

Empezado por aguml (Mensaje 486901)
...
He probado con:
Código PHP:

ImageList->GetBitmap(0,BitBtnImprimir->Glyph); 
pero no surte efectosolo me ha funcionado usando el metodo de arriba y la verdad es que no me agrada tener que usar un TBitmap intermedio para ello ¿se puede hacer directamente

...

Entonces, la pregunta inicial esta mál formulada. No es que el código anterior no surta efecto, sucede cuando se intenta cargar una imágen a un TBitBtn que ya posee una.



Cita:

Empezado por aguml (Mensaje 486965)
No se porque hay que poner a NULL el Glyph antes de asignarle una nueva imagen para que funcione pero asi funciona y sin eso no funciona. ¿pueden explicarme por que? ¿es correcto lo que hago?

No exíste un método como "Clear" o "Delete" que realice el borrado de un contenedor gráfico, la forma de "limpiarlo" es asignándole el valor NULL.
Esto, por ejemplo, también se cumple para un TImage, donde el código a aplicar es:
Código PHP:

{
  
Image1->Picture NULL// ó : ... = 0
  // O, con el mismo resultado:
  
Image1->Picture->Assign(NULL); // ó : ... = 0


Así que si, definitivamente es correcto hacerlo de ese modo.

Saludos :)


La franja horaria es GMT +2. Ahora son las 20:45:06.

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