Foros Club Delphi

Foros Club Delphi (http://www.clubdelphi.com/foros/index.php)
-   OOP (http://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   crear HELPER (http://www.clubdelphi.com/foros/showthread.php?t=92813)

juank1971 08-02-2018 16:06:18

crear HELPER
 
Hola tengo esta clase que me funciona bien

Código Delphi [-]
 TTPopupBoxMy = class (TPopupBox)
      private
       aCam_id: array[1..100] of integer;
      function GetCam_id(i:integer): integer;
      procedure SetCam_id(i,id:integer);
      procedure Agrega(s:string;idC:integer);
   end;

estoy usando firemonkey con delphi 10.2 quisiera poder incluir esas funciones con un helper para el componente TPopupBox
lo que estoy necesitando es poner el cam_id de una tabla en cada item tle TPopupBox con esta clase heredada lo logre pero tengo el problema de que para trabajar con ese componente TTPopupBoxMy heredado, hay que crearlo en runtime, hay que darle las propiedades margenes, tamaño etc, y es incomodo trabajar con el crandolo en runtime e instanciarlo y referenciarlo por el nombre etc, etc, es mejor poner un helper en el componente oridinal y usar sus propiedades, y asi poder ajustar en tiempo de diseño todo el componente.

He buscado en la ayuda y en internet y todos los ejemplos de helpers que encuentro tanto en clases como en tipos de delphi
no usan variables solamente funciones que usan las variables del componente padre.

por ejemplo de un libro de marco cantu veo esto
Código Delphi [-]
TListboxHelper = class helper for TListBox
   function ItemIndexValue: string; 
end;

o esto otro que tambien abunda en internet
Código Delphi [-]
TIntHelper = record helper for Integer
function AsString: string;
end;
pero lo que necesito es el helper para la clase heredada que puse primero o sea no crear nuevas funciones o procedimientos a una clase sino tambien crearle o un arreglo de enteros para guardar los id por cada item o una variable entera para cada item.
me ayudan ??
gracias

gatosoft 08-02-2018 20:33:01

Hola juank1971

Supongo que no quieres hacer tu propio componente y registrarlo... así que creo que lo que necesitas es una clase interceptora.. es un concepto "parecido"*** (con muchos asteriscos) al de Helpers.

Mira éste código:

Código Delphi [-]
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type

  //esta es la clase interceptora... "modifica" la funcionalidad del TListbox (que para el caso es el componente que voy a modificar)
  TListBox = class(vcl.stdctrls.TListBox)
  private
    FContador: Integer;
  public
    Function AddContador: Boolean;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox; //aqui defines el TListbox
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TListBox }

//ésta es la implementación de la clase interceptora.. 
function TListBox.AddContador: Boolean;
begin
  inc(FContador);
  Self.Items.Add( IntTostr(Fcontador));
end;

//Aqui el TListbox original.. comienza a utilizar la funcionalidad y variables de la interceptora
procedure TForm1.Button1Click(Sender: TObject);
begin
  ListBox1.addContador;
end;

end.


Se llama interceptora porque se ubica entre la unidad original del componente y la definición de la variable:

Código Delphi [-]
Uses Vcl.StdCtrls

//Clase interceptora
TListBox = class(vcl.stdctrls.TListBox)
end;

//Definicion de la variable
TForm1 = class(TForm)
  ListBox1: TListBox;
private
public
end;


Ésto quiere decir que si defines la clase después, ya no te va a funcionar

Código Delphi [-]
Uses Vcl.StdCtrls

//Definicion de la variable
TForm1 = class(TForm)
  ListBox1: TListBox;
private
public
end;

//Clase interceptora definida despues de la variable (listbox1)
TListBox = class(vcl.stdctrls.TListBox)
end;


también puedes definir la clase en una unidad aparte, por si la vas a utilizar en varios formularios, pero teniendo en cuenta que siga interceptando:


Código Delphi [-]
Uses Vcl.StdCtrls, LaUnidadDeLaClaseInterceptora;

//Definicion de la variable
TForm1 = class(TForm)
  ListBox1: TListBox;
private
public
end;

Espero que te sirva, saludo,

juank1971 08-02-2018 20:41:02

ok gracias lo pruebo y te cuento gracias por responder

juank1971 08-02-2018 20:57:17

ya lo probe, funciona muy bien
aqui estaba mirando otra idea https://stackoverflow.com/questions/...ion-on-android

pero la tuya es mas limpia y completa sirve para muchas cosas. Gracias por compartir.


La franja horaria es GMT +2. Ahora son las 20:29:01.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi