PDA

Ver la Versión Completa : Iconos PNG sobre BitBtn


mRoman
07-07-2021, 22:11:09
Hola amigos.

Trabajando con: FB 2.0, IBX, Delphi6, Win10

Estoy tratando de cargar ICONOS PNG sobre botones BitBtn en tiempo de ejecución -ya he leido que BitBtn solo acepta el formato BMP-. Los iconos los quiero cargar a los botones -creados en tiempo de ejecución- utilizando un campo de la tabla que tiene la RUTA del icono, pero marca error ya que este tipo de botón no acepta los PNG's solo BMP.

Como le hago para que los acepte y muestre el icono en el botón?

Estoy consultando los siguientes hilos:
http://www.clubdelphi.com/~cadetill/foros/showthread.php?t=27568
https://www.clubdelphi.com/foros/showthread.php?t=8020
https://www.clubdelphi.com/foros/showthread.php?t=87362&highlight=png+bitbtn

En espera de encontrar como solucionarlo....

Hasta ahorita lo estoy intentando asi, pero obviamente me salta el error:
'Bitmap image is not valid'

Aqui el código:

procedure TfrmRegComanda.FormShow(Sender: TObject);
var
PosY: Integer;
nLeft:Integer;
begin

{***************************************************************

PROCESO PARA CARGAR EL DETALLE DE LA COMANDA SI nRegID ES
DIFERENTE DE 0

****************************************************************}
nLin:=1;
{**************************************************************************
COMANDA NUEVA
***************************************************************************}
if frmMeseroMain.nRegID=0 then
begin
Edit1.Text:=IntToStr(frmAbrirMesas.cbxMesa.KeyValue)+' '+frmAbrirMesas.cbxLetra.Text;
Edit3.Text:=frmMeseroMain.Label3.Caption;
Edit2.Text:=frmAbrirMesas.mskNumPersonas.Text;
Edit4.Text:=IntToStr( frmMeseroMain.nRegID );
sBtnCerrarCuenta.Enabled:=False;
sBtnEnviar.Enabled:=True;
sBtnCambiaMesa.Enabled:=False;
frmMeseroMain.qryGenerator.Close;
frmMeseroMain.qryGenerator.Open;
frmMeseroMain.nRegID:=frmMeseroMain.qryGenerator.FieldByName('ID').AsInteger+1;

dsCM.Close;
dsCM.Open;
dsCM.Append;
dsCM.FieldByName('COMANDA_NUM_MESA').AsInteger:=frmAbrirMesas.cbxMesa.KeyValue; //nMesa;
dsCM.FieldByName('COMANDA_MESA_LETRA').AsString:=frmAbrirMesas.cbxLetra.Text; //sLetra;
dsCM.FieldByName('COMANDA_ESTATUS').AsString:='A';
dsCM.FieldByName('COMANDA_EMP_ID').AsString:=frmMeseroMain.vNumEmpl;
dsCM.FieldByName('COMANDA_N_PERSONAS').AsString:=frmAbrirMesas.mskNumPersonas.Text;
dsCM.Post;
// dsCM.ApplyUpdates;
end Else
begin
{******************************************************************************
SI YA EXISTE LA COMANDA
******************************************************************************}
dsCM.Close;
dsCM.ParamByName('COMANDA_ID').AsInteger:=frmMeseroMain.nRegID;
dsCM.Open;
dsCM.Edit;
if dsCM.FieldByName('COMANDA_ESTATUS').AsString='A' then
begin
sBtnCerrarCuenta.Enabled:=True;
sBtnEnviar.Enabled:=True;
sBtnCambiaMesa.Enabled:=True;
end else
begin
sBtnCerrarCuenta.Enabled:=False;
sBtnEnviar.Enabled:=False;
sBtnCambiaMesa.Enabled:=False;
end;
dsCD.Close;
dsCD.ParamByName('COMANDA_ID').AsInteger:=dsCM.FieldByName('COMANDA_ID').AsInteger;
dsCD.Open;
dsCD.First;
Edit1.Text:=dsCM.FieldByName('COMANDA_NUM_MESA').AsString+' '+dsCM.FieldByName('COMANDA_MESA_LETRA').AsString;
Edit3.Text:=frmMeseroMain.Label3.Caption;
Edit2.Text:=dsCM.FieldByName('COMANDA_N_PERSONAS').AsString;
Edit4.Text:=IntToStr( frmMeseroMain.nRegID );
While not(dsCD.Eof)do
begin
qryProducto.Close;
qryProducto.ParamByName('PROD_ID').AsInteger:=dsCD.FieldByName('PRODUCTO_ID').AsInteger;
qryProducto.Open;
SG.RowCount:=SG.RowCount+1;
SG.RowHeights[nLin] := 80;
SG.Cells[0,nLin]:=IntToStr( nLin );
SG.Cells[1,nLin]:=dsCD.FieldByName('PRODUCTO_ID').AsString;
SG.Cells[2,nLin]:=TRIMLEFT(dsCD.FieldByName('COMANDA_DESCR_PROD_MODIF').AsString);
SG.Cells[3,nLin]:=IntToStr(1);
SG.Cells[4,nLin]:=FormatFloat('$##,##0.00',qryProducto.FieldByName('PRECIO').AsFloat) ;
SG.Cells[6,nLin]:=dsCD.FieldByName('COMANDA_STAT_COCINA').AsString;
Importe:=qryProducto.FieldByName('PRECIO').AsCurrency*dsCD.FieldByName('COMANDA_D_CANT').AsFloat;
SG.Cells[5,nLin]:=FormatFloat('$##,##0.00', Importe);
TotPagar:=TotPagar+Importe;
mskImporte.Text:=FormatFloat('$##,##0.00',TotPagar);
nLin:=nLin+1;
dsCD.Next;
end;
end;


// **** Con el siguiente codigo eliminamos los botones que puedan estar dentro del SCROLLBOX1 *****
while ScrollBox1.ControlCount > 0 do
ScrollBox1.Controls[0].Free;

//************* CREA LOS BOTONES DE LAS CATEGORIAS *****************
PosY:=8;
nLeft:=8;
n:=1;
qryCategorias.Close;
qryCategorias.Open;
qryCategorias.First;
if not(qryCategorias.IsEmpty) then
begin
While not qryCategorias.Eof do
begin
BtnsCategorias[n]:=TBitBtn.Create(Self);
with BtnsCategorias[n] do
begin
Caption:=copy( UPPERCASE( qryCategorias.fieldbyname('DESCRIPCION').AsString ),1,9)+#13+
copy( UPPERCASE( qryCategorias.fieldbyname('DESCRIPCION').AsString ),10,20);
Parent:=ScrollBox1;
Height:=100;
Top:=PosY;
Left:=nLeft;
if nLeft=408 then begin //200
nLeft:=8;
PosY:=PosY+Height+5
end Else Begin
nLeft:=nLeft+100;
end;
Width:=100;
OnClick:=OnButtonClick1;
Font.Size:=10;
Tag:=qryCategorias.FieldByName('CATEGORIA_ID').AsInteger;
Font.Style:=[fsBold];
Layout:=blGlyphTop;
Glyph.LoadFromFile(qryCategorias.FieldByName('RUTA_ICONO').AsString );
end;
qryCategorias.Next;
inc(n);
end;
end;
Click_en_BTNCatego:=0;
// TotPagar:=0;
end;


Como hacer para que acepte iconos PNG Y BMP....solo esos 2 tipos.

Muchas gracias amigos por su tiempo.

P.D. Estoy revisando los links de hasta abajo....

cloayza
07-07-2021, 23:16:06
Estimado mRoman, y porque no usar los PNGComponents ? (https://github.com/TurboPack/PNGComponents)

Estos ya traen un TPngBitBtn...

:confused:

Saludos cordiales

MAXIUM
08-07-2021, 02:04:02
ImageList los soporta. Aunque no sé si se pueden cargar ahí en tiempo de ejecución.

mRoman
08-07-2021, 02:07:52
Estimado mRoman, y porque no usar los PNGComponents ? (https://github.com/TurboPack/PNGComponents)

Estos ya traen un TPngBitBtn...

:confused:

Saludos cordiales

Cloayza....gracias por contestar.

Se pueden instalar para Delphi 6?. No los conocía esos componentes.

Gracias por tu tiempo.

mRoman
08-07-2021, 02:12:36
ImageList los soporta. Aunque no sé si se pueden cargar ahí en tiempo de ejecución.

Si también estoy viendo si con ese componente se puede...y de ahi cargarlos a los botones.

Gracias.

ecfisa
08-07-2021, 13:38:46
Hola.

Para cargar una imágen .PNG en un TImageList en tiempo de ejecución, revisa en este enlace: Invalid image size en ImageList (http://www.clubdelphi.com/foros/showthread.php?t=90894)

Saludos :)

cloayza
08-07-2021, 17:25:11
Si también estoy viendo si con ese componente se puede...y de ahi cargarlos a los botones.

Gracias.

Los PNGComponents, tienen su propio TPngImagelist...

Saludos cordiales

mRoman
08-07-2021, 20:36:48
Hola.

Para cargar una imágen .PNG en un TImageList en tiempo de ejecución, revisa en este enlace: Invalid image size en ImageList (http://www.clubdelphi.com/foros/showthread.php?t=90894)

Saludos :)

Que tal ecfisa, gracias por contestar.

Estoy revisando el hilo que me sugeriste...pero creo que tenemos versiones diferentes de Delphi, ya que me esta solicitando un DCU "pngImage.dcu", yo uso Delphi6...

Casimiro Notevi
08-07-2021, 20:50:23
Yo los uso desde delphi 5, aquí (https://mega.nz/file/XB9gEBgQ#q4OFsNASz0PjQcOB1nvvUGqJIz8R_XcQVnNP4Z8VG0g)están.

mRoman
08-07-2021, 22:11:50
Yo los uso desde delphi 5, aquí (https://mega.nz/file/XB9gEBgQ#q4OFsNASz0PjQcOB1nvvUGqJIz8R_XcQVnNP4Z8VG0g)están.

Gracias Casimiro....bajando.

mRoman
08-07-2021, 22:55:28
Yo los uso desde delphi 5, aquí (https://mega.nz/file/XB9gEBgQ#q4OFsNASz0PjQcOB1nvvUGqJIz8R_XcQVnNP4Z8VG0g)están.

Se que a estas alturas lo q preguntaré es raro, pero como debo instalarlo??...

File/Open...y cual selecciono....PNG_D6.dpk o PNGComponentsD6.dpk??...

Y luego "Compile" o "Install"?

Seleccioné el segundo (PNGComponentsD6) y me dice que "Themes.dcu" no esta, no lo encuentra

Gracias, pero quiero estar seguro.

Saludos.

mRoman
09-07-2021, 01:38:22
Hola de nuevo.

Pues ya lo solucioné....le tuve que dar la vuelta de esta manera, coloque un TImage con su propiedad "visible" a False para que no se mostrara en el formulario, y en tiempo de ejecución cargue las imagenes desde la ruta registrada en la tabla PRODUCTO, aqui el código:


if not(qryCategorias.IsEmpty) then
begin
While not qryCategorias.Eof do
begin
BtnsCategorias[n]:=TBitBtn.Create(Self);
with BtnsCategorias[n] do
begin
Caption:=copy( UPPERCASE( qryCategorias.fieldbyname('DESCRIPCION').AsString ),1,9)+#13+
copy( UPPERCASE( qryCategorias.fieldbyname('DESCRIPCION').AsString ),10,20);
Parent:=ScrollBox1;
Height:=100;
Top:=PosY;
Left:=nLeft;
{ if nLeft=808 then begin //200
nLeft:=8;
PosY:=PosY+Height+5
end Else Begin}
nLeft:=nLeft+100;
// end;
Width:=100;
OnClick:=OnButtonClick1;
Font.Size:=10;
Tag:=qryCategorias.FieldByName('CATEGORIA_ID').AsInteger;
Font.Style:=[fsBold];
Layout:=blGlyphTop;

// AQUI LA SOLUCIÓN*****************************************************
if not(qryCategorias.FieldByName('RUTA_ICONO').IsNull) or
(qryCategorias.FieldByName('RUTA_ICONO').AsString<>'') then
begin
Image1.Picture:=nil;
Image1.Picture.LoadFromFile(qryCategorias.FieldByName('RUTA_ICONO').AsString);
Glyph:=Image1.Picture.Bitmap;
end;
//***********************************************************************
end;
qryCategorias.Next;
inc(n);
end;
end;
end;


No es lo mas elegante y profesional, pero me soluciona el problema, me muestra tanto iconos con formato BMP, PNG...no sé si JPG también -tema para investigar- pero cuando menos los que necesito si los muestra y sin problema.

Saludos a todos y gracias por su colaboración.

p.d. Casimiro, aún asi comentame por fa, como se deben instalar los PNGComponents.