Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
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?
Responder Con Cita
  #2  
Antiguo 20-12-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 20-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
pues es la 6.
Responder Con Cita
  #4  
Antiguo 20-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
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?
Responder Con Cita
  #5  
Antiguo 20-12-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
La transparencia es del color que tenga el pixel primero de la esquina izquierda, abajo.
Responder Con Cita
  #6  
Antiguo 20-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 20-12-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola aguml
Cita:
Empezado por aguml Ver Mensaje
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #8  
Antiguo 20-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
ok, en cuanto tenga ocasion subo las dos imagenes.
Responder Con Cita
  #9  
Antiguo 21-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
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
Responder Con Cita
  #10  
Antiguo 22-12-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #11  
Antiguo 22-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
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?
Responder Con Cita
  #12  
Antiguo 22-12-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola aguml.

Cita:
Empezado por aguml Ver Mensaje
...
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 Ver Mensaje
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 22-12-2014 a las 15:37:07.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Asignar TField a TDBLookupList en T.ejecución Bauhaus1975 Conexión con bases de datos 16 02-11-2008 13:28:24
Llenar un TimageList en ejecucion rex Varios 3 16-06-2007 18:20:53
Asignar propiedades de Ttable en tiempo de ejecución coleleon Tablas planas 3 30-11-2005 23:22:39
Asignar evento Oncalcfield en tiempo de ejecucion el_barto Conexión con bases de datos 5 06-09-2005 00:08:46
iconos en los tbitbutton ercrizeporta Varios 1 07-07-2005 01:28:13


La franja horaria es GMT +2. Ahora son las 13:10:07.


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
Copyright 1996-2007 Club Delphi