Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   FireMonkey (https://www.clubdelphi.com/foros/forumdisplay.php?f=50)
-   -   iconos TBindNavigator (https://www.clubdelphi.com/foros/showthread.php?t=95601)

juank1971 08-03-2022 03:21:42

iconos TBindNavigator
 
Saludos sera posible cambiar los iconos o personalizar un poco la apariencia de un TBindNavigator en FMX 10.4.
juan carlos

Neftali [Germán.Estévez] 08-03-2022 10:08:07

A priori lo más sencillo en estos casos es derivar el componente y en el nuevo componente, tienes diferentes métodos para modificarlo.
Puedes utilizar el asistente para ello:
Component/New component/Firemonkey for Delphi/

A partir de ahí, escoger TBindNavigator o TCustomBindNavigator, el que más te interese

Es este caso las "imágenes" de los botones no son imágenes en si, sino que están dibujadas como path, en el método:
Código Delphi [-]
TCustomBindNavigator.InitButtons;

Ahí puedes cambiar el path o imagino que cargar imágenes si te interesa.

juank1971 09-03-2022 18:52:15

ok gracias, y otra duda como pudiera guardar las imagenes que quiero tener predeterminadas en un componente nuevo,


por ejemplo suponiendo que quiera hacer un componente parecido a un Navigator, pero con imagenes mias, agregarle por ejemplo un espacio para que me muestre el registro del grid en el que estoy parado y la cantidad total de registros etc, algo muy personalizado a mi manera:


suponiendo que parto de un rectangulo, ya lo tengo asi
Código Delphi [-]
constructor TNavGrid.Create(AOwner: TComponent);
begin
  inherited;
  RecMain:= TRectangle.Create(nil);
  With RecMain do
   begin
     Height := 25;
     Width :=  268;
     Stroke.Kind := Stroke.Kind.bkNone;
     fill.Color := TAlphaColorRec.White;
   end;
end;

ahora quisiera tener imagenes para ponerlas dentro de cada boton que voy a agregar en ese rectangulo, pero en este proyecto DPK solo tengo una unit sin nada visual , no puedo agregar un TimageList, como pudiera tener las imagenes pra ese componente,.


Resumen de la duda jjj, quiero hacer un componente visual , para ponerlo facil un rectangulo, con mas rectangulos dentro y cada rectangulo con imagenes. pero no se como utilizar imagenes que ya tengo y asignarlas a esos rectangulos para que queden de forma ya predeterminada en mi nuevo componente aunque ;luego pueda poner una propiedad que se pueda cambiar la imagen en el componente.

juank1971 09-03-2022 22:39:10

bueno para ahorarles tiempo creo que tengo la manera en un fichero de recursos o mejor dicho para no complicar las cosas como todos los delphianos en un notepat puse este codigo y lo renombre a .rc.
dentro puse esta linea y lo llame Recursos.rc

RES_IMG_OK_16X RCDATA "btn_16_ok.png"


y en la misma carpeta del proyecto puse la inagen png llamada btn_16_ok.png




luego abri una ventana msdos y puse brcc32.exe Recursos.rc y este programa que esta dentro del delphi me crea el fichero de recursos Recursos.RES

para usar este fichero dentro del proyecto pongo esta directiva de compilacion para que ekl compilador sepa usar el recurso

Código Delphi [-]


  {$R Recursos.res}


Luego puse en el mismo create este fragmento de codigo para poder usar la imagen que esta dentro del recurso y cargarla a un Timage



Código Delphi [-]


var
  B: TBitmap;
  RS: TResourceStream;
begin
  RS := TResourceStream.Create(HInstance, 'RES_IMG_OK_16X', RT_RCDATA);
  try
    B := TBitmap.Create;
    B.LoadFromStream(RS);
    Image1.Bitmap := B;
  finally
    RS.Free;
  end;


Y listo ya puedo usar imagenes dentro de un fichero de recursos que no esta dentro del proyecto. creo que con esto resuelvo

Neftali [Germán.Estévez] 10-03-2022 08:41:36

Cita:

Empezado por juank1971 (Mensaje 545920)
Y listo ya puedo usar imagenes dentro de un fichero de recursos que no esta dentro del proyecto. creo que con esto resuelvo

Correcto.
Usar recursos es la forma más fácil de hacer lo que necesitabas.
No sólo imágenes, sino cualquier otro elemento que necesites se puede añadir a ese fichero .RC

juank1971 10-03-2022 16:21:39

bueno ya tengo esta unit que les pongo debajo en un proyecto para crear el componente ahora me sale doble el resultado final , no se por que me sale doble, es como si si estuviera creando dos veces , en tiempo de diseño se ve bien pero en tiempo de corrida sale doble el componente. en el resultado final.


esta es la unit que tengo en el proyecto de el componente, lo compilo lo instalo y funciona bien en diseño, pero la correr no.
ya tengo el fichero recirso con la imagen dentro y funciona correcto eso.



Código Delphi [-]
unit UNavegadorGrid;


  interface

uses
  System.SysUtils, System.Classes, FMX.Forms, FMX.Layouts,
  System.UITypes,  FMX.Graphics, FMX.Dialogs,FMX.Objects,FMX.Types,System.Types;


  type
  TNavegadorGrid = class(TRectangle)
  private
    { Private declarations }
  var
   RecMain:TRectangle;

   //botones
   RecBtFirst:  TRectangle ;
   ImFirst:Timage;

    protected
    { Protected declarations }
  public
     constructor Create (AOwner: TComponent); overload; override;
  published

  end;


 procedure Register;



implementation
     {$R Recursos.res}

 procedure Register;
begin
  RegisterComponents('MyComponents', [TNavegadorGrid]);
end;

constructor TNavegadorGrid.Create(AOwner: TComponent);
var
  B: TBitmap;
  RS: TResourceStream;
begin

     inherited Create (AOwner);

     Height := 25;
     Width :=  268;
     Stroke.Kind := Stroke.Kind.bkNone;
     fill.Color := TAlphaColorRec.White;

  if not Assigned(RecBtFirst) then
    begin
   RecBtFirst:= TRectangle.Create(self);
  With RecBtFirst do
   begin
      parent := self;
     Align := TAlignLayout.Left;
     Stroke.Kind := Stroke.Kind.bkNone;
     fill.Color := TAlphaColorRec.red;
   end;

  ImFirst:=Timage.Create(RecBtFirst);
  ImFirst.Parent := RecBtFirst;
  ImFirst.Align :=ImFirst.Align.alClient;

    RS := TResourceStream.Create(HInstance, 'RES_IMG_OK_16X', RT_RCDATA);
  try
    B := TBitmap.Create;
    B.LoadFromStream(RS);
    ImFirst.Bitmap := B;
  finally
    RS.Free;
  end;
    end;

end;

end.


esto es lo que se ve

Neftali [Germán.Estévez] 10-03-2022 17:39:00

Realmente es curioso y aunque no estoy familiarizado con la creación de componentes en FMX, no veo nada raro en el código.
Es más, he probado el mismo componente para VCL y funciona correctamente.



Habrá que mirarse esto:
https://docwiki.embarcadero.com/RADS...ponent_(Delphi)

Y esto:
https://docwiki.embarcadero.com/RADS...mponents_Guide

Neftali [Germán.Estévez] 10-03-2022 17:47:07

Me acabo de dar cuenta de que el efecto también pasa en diseño (no sólo en ejecución) cuando pasas a la visión del DFM (ALT+F12).
Es como si el componente (Navigator) no destruyera el rectángulo de su interior y luego lo volviera a crear.

Neftali [Germán.Estévez] 10-03-2022 17:59:48

Bueno, aclarado. ^\||/
El problema está en la línea que asigna en Parent, que imagino que en FMX la lía. por el tema este de que puedes crear subcomponentes "dentro" de otros componentes (siempre que estos lo permita).

Eliminala y de paso puedes simplificar un poco el código. Esto funciona perfectamente:

Código Delphi [-]
constructor TNavegadorGrid.Create(AOwner: TComponent);
begin
  inherited;

  Height := 25;
  Width := 268;
  Stroke.Kind := Stroke.Kind.bkNone;
  fill.Color := TAlphaColorRec.White;

  if not Assigned(RecBtFirst) then
  begin
    RecBtFirst := TRectangle.Create(self);
    With RecBtFirst do
    begin
////////////      parent := self;
      Align := TAlignLayout.Left;
      Stroke.Kind := Stroke.Kind.bkNone;
      fill.Color := TAlphaColorRec.red;
    end;

    ImFirst := Timage.Create(RecBtFirst);
    ImFirst.parent := RecBtFirst;
    ImFirst.Align := ImFirst.Align.alClient;
    ImFirst.Bitmap.LoadFromStream(TResourceStream.Create(HInstance, 'RES_IMG_OK_16X', RT_RCDATA));
  end;
end;

juank1971 11-03-2022 05:10:25

gracias por la ayuda .

juank1971 29-04-2022 02:57:04

continuando con el tema
 
bueno amigos continuando con el navegador donde nos quedamos, ahora quise poner un dataset a la clase como propiedad Published con la idea de enlazar ese componente navegador, con un dataset en tiempo diseño y

funciona bien hasta el momento en que quise comunicarme con el dataset para interceptar algun evento del mismo

pero me da error, creo que es la forma en que estoy tratando de instanciar la clase dataset, no estoy seguro como debo hacerlo

me queda de esta manera el fragmento de código: el error lo da en vDataSet.AfterPost:= DataSetAfterPost ;


Código Delphi [-]
TNavegadorGrid = class(TRectangle)
  private
  var
    // Propiedades del contenedor Principal
    vDataSet: Tdataset;
    vbtActivo: TRectangle;
    // botones
    RecBtFirst, RecBtPrior, RecBtNext, RecBtLast, RecBtEdit, RecBtPost, RecBtDelete, RecBtFiltrar, RecBtAppend,
      RecBtRefresh, RecBtCancel: TRectangle;
    // imagenes
    ImFirst, ImPrior, ImNext, ImLast, ImEdit, ImPost, ImDelete, ImFiltrar, ImAppend, ImRefresh, ImCancel: Timage;
    // LabelContador de records
    RecordCantidad, RecordActual: integer;
    LCantidad: TLabel;
  protected
  public
    property btActivo: TRectangle read vbtActivo write vbtActivo;
    constructor Create(AOwner: TComponent); override;
    procedure ImageClick(Sender: TObject);
    procedure ActualizaRegistros;
    procedure HabilitaBoton(bt: Timage; Ha: boolean);
    procedure DataSetAfterPost(DataSet: Tdataset);
  published
    property DataSet: Tdataset read vDataSet write vDataSet;
  end;

procedure Register;

implementation
........
procedure Register;
begin
  RegisterComponents('MyComponents', [TNavegadorGrid]);
end;

constructor TNavegadorGrid.Create(AOwner: TComponent);
begin
  inherited;

  vDataSet.AfterPost:= DataSetAfterPost ;  // aqui me da error a pesar de estar asignado el dataset en el componente en diseño

  Height := 25;
  Width := 268;
  Stroke.Kind := Stroke.Kind.bkNone;
  fill.Color := TAlphaColorRec.White;
  if not(csDesigning in ComponentState) then
  begin
    // RecFirst
    RecBtFirst := TRectangle.Create(Self);
    RecBtFirst.Name := 'RecFirst';
    RecBtFirst.Parent := Self;
    RecBtFirst.Align := TAlignLayout.MostLeft;
    RecBtFirst.Stroke.Kind := Stroke.Kind.bkNone;
    RecBtFirst.fill.Color := TAlphaColorRec.Darkgray;
    RecBtFirst.Width := 25;
    RecBtFirst.Tag := 1;
    // ImFirst
    ImFirst := Timage.Create(RecBtFirst);
    ImFirst.Name := 'imFirst';
    ImFirst.Parent := RecBtFirst;
    ImFirst.Align := ImFirst.Align.alClient;
    ImFirst.Bitmap.LoadFromStream(TResourceStream.Create(HInstance, 'imFirst', RT_RCDATA));
    ImFirst.OnClick := ImageClick;
    ImFirst.Tag := 1;


...........
procedure TNavegadorGrid.DataSetAfterPost(DataSet: Tdataset);
begin
   ShowMessage ('prueba comunicacion con el dataset');
end

Neftali [Germán.Estévez] 29-04-2022 10:56:33

Has definido la propiedad Dataset:

Código Delphi [-]
 property DataSet: Tdataset read vDataSet write vDataSet;

Y en el Create estás haciendo esto:

Código Delphi [-]
// aqui me da error a pesar de estar asignado el dataset en el componente en diseño
vDataSet.AfterPost:= DataSetAfterPost ;

El problema es que el orden en que se crean los componentes no siempre es el que queremos y cuando se está creando el componente TNavegadorGrid (y se ejecuta el Create) puede ser que el Dataset al que estás intentando acceder no esté creado.
Además lo lógico es utilizar el writer de la propiedad, porque querrás asignar un Dataset que te configuren en el object inspector. Ese vDataset que estás utilizando ahora, simplemente es una variable sin valor (nil).

Define la propiedad de la siguiente manera y los métodos en la parte privada:

Código Delphi [-]
  private
    ...
    procedure DataSetAfterPost(DataSet: Tdataset);
    procedure SetDataset(const Value: TDataset);    

  published
    property Dataset:TDataset read vDataset write SetDataset;

La implementación será la siguiente:


Código Delphi [-]
procedure TNavegadorGrid.DataSetAfterPost(DataSet: Tdataset);
begin
  ShowMessage ('prueba comunicacion con el dataset; Se ha realizado un post');
end;

procedure TNavegadorGrid.ImageClick(Sender: TObject);
begin
  ShowMessage ('TNavegadorGrid.ImageClick');
end;

procedure TNavegadorGrid.SetDataset(const Value: TDataset);
begin
  vDataSet := Value;
  ShowMessage ('Asignado Dataset');
  if not(csDesigning in ComponentState) then begin
    vDataSet.AfterPost:= DataSetAfterPost ;  // aqui me da error a pesar de estar asignado el dataset en el componente en diseño
    ShowMessage ('Asignado evento AfterPost');
  end;
end;
Ahora podrás crear el componente y asignar la propiedad Dataset desde el ObjectInspector.

Si ejecutas un Post, "salta" el evento del componente sin problemas.


Casimiro Notevi 29-04-2022 16:13:40

Algunas respuestas valen su peso en oro ^\||/

juank1971 30-04-2022 04:20:15

Si casimiro es cierto, gracias por estar por aqui todos siempre, yo realmente admiro mucho eso en clubdelphi, desde hace muchos años este foro ayuda muchisimo a todos.
el colmo fue que un dia busqué en internet una duda y la respuesta la habia dado yo mismo en clubdelphi muchisimos años antes jeje, ni recordaba ya eso.

Germán ha sido uno de los ejemplos mas didacticos que hay por aqui, da la impresion que duerme dentro de clubdelphi, siempre esta a al asecho, jejeje.

ha y una cosa que recordé ,german , en una entrevista de no solo delpphi creo, que no sabias de donde habia salido neftali realmente, lo escogiste de nick en la universidad, o algo asi, pero no estabas seguro del porque lo habias tenido antes, queria comentarte que ese es uno de los nombres de Pablo neruda , el famoso poeta chileno su verdadero nombre era Ricardo Eliécer Neftalí Reyes Basoalto, no se si conoces ese dato jjj.


Saludos y gracias por sus comentarios siempre bien recibidos.

Casimiro Notevi 30-04-2022 09:23:05

Yo no tenía ni idea, pero es un buen nick para un "poeta de la programación", como es nuestro Neftali :)
Cita:

Pablo Neruda, seudónimo y posterior nombre legal1​ de Ricardo Eliécer Neftalí Reyes Basoalto (Parral, 12 de julio de 1904-Santiago, 23 de septiembre de 1973), fue un poeta y político chileno.
Cita:

Empezado por juank1971 (Mensaje 546683)
el colmo fue que un dia busqué en internet una duda y la respuesta la habia dado yo mismo en clubdelphi muchisimos años antes jeje, ni recordaba ya eso.

También me ha pasado :D:D:D

Neftali [Germán.Estévez] 02-05-2022 09:12:31

Cita:

Empezado por juank1971 (Mensaje 546683)
...una cosa que recordé ,german , en una entrevista de no solo delpphi creo, que no sabias de donde habia salido neftali realmente, lo escogiste de nick en la universidad, o algo asi, pero no estabas seguro del porque lo habias tenido antes, queria comentarte que ese es uno de los nombres de Pablo neruda , el famoso poeta chileno su verdadero nombre era Ricardo Eliécer Neftalí Reyes Basoalto, no se si conoces ese dato jjj.

No lo sabía [juank], gracias por el dato.
Como bien dices, el nick viene de mis años mozos de universidad, creando un proyecto que se llamó Akira (en honor a la película). Que por cierto no hace mucho se volvió a masterizar en 4K (un clásico de culto del anime japonés).


La franja horaria es GMT +2. Ahora son las 08:38:08.

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