Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Iconos PNG sobre BitBtn (https://www.clubdelphi.com/foros/showthread.php?t=95277)

mRoman 07-07-2021 22:11:09

Iconos PNG sobre BitBtn
 
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/...ad.php?t=27568
https://www.clubdelphi.com/foros/showthread.php?t=8020
https://www.clubdelphi.com/foros/sho...ght=png+bitbtn

En espera de encontrar como solucionarlo....

Hasta ahorita lo estoy intentando asi, pero obviamente me salta el error:
Código:

'Bitmap image is not valid'
Aqui el código:
Código Delphi [-]
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 ?

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

Cita:

Empezado por cloayza (Mensaje 541648)
Estimado mRoman, y porque no usar los 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

Cita:

Empezado por MAXIUM (Mensaje 541651)
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

Saludos :)

cloayza 08-07-2021 17:25:11

Cita:

Empezado por mRoman (Mensaje 541653)
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

Cita:

Empezado por ecfisa (Mensaje 541679)
Hola.

Para cargar una imágen .PNG en un TImageList en tiempo de ejecución, revisa en este enlace: Invalid image size en ImageList

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í están.

mRoman 08-07-2021 22:11:50

Cita:

Empezado por Casimiro Notevi (Mensaje 541688)
Yo los uso desde delphi 5, aquí están.

Gracias Casimiro....bajando.

mRoman 08-07-2021 22:55:28

Cita:

Empezado por Casimiro Notevi (Mensaje 541688)
Yo los uso desde delphi 5, aquí 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

Solucionado
 
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:

Código Delphi [-]
     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.


La franja horaria es GMT +2. Ahora son las 11:46:35.

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