Está en la página 1de 4

FTP CCD Enlaces Buscar Trucos Trabajo Foros

Foros Club Delphi > Principal > Varios


Nombre de Usuario Nombre de Usuario
¿Recordarme?
Classhelper en Delphi C ontraseña Iniciar Sesión

Registrarse FA Q Miembros Calendario Guía de estilo Temas de Hoy

Herramientas Desplegado

05-01-2013 #1

dario61081 Registrado: abr 2007


Posts: 6
Registrado

Classhelper en Delphi

Buenas colegas, como están?? . Estuve viendo algunas novedades que trae las nuevas versiones del delphi. En esta oportunidad con los Classhelper. Esta herramienta permite dar mas funcionalidad a las clases ya existentes. como usuario
de java, me fascino como lo podía implementar ciertas funciones como lo hace java. aqui un ejemplo.

Código Delphi [-]

type
TEditHelper = class helper for tedit
public
function toUpper: string;
function toLower: string;
function to_i: integer;
function to_f: extended;
function toEqual(value: string): boolean;
function find(value: string): boolean;
end;

Con esto, a un tedit le "añado" algunas funciones que me sirven de maravillas facilitando no tenes que escribir mas codigo , y asi utilizarlo como:

Código Delphi [-]

edit2.Text:= edit1.toUpper;
edit3.Text := edit1.toLower;
CheckBox1.Checked := edit1.find('hola');
CheckBox2.Checked := edit1.toEqual('hola');

Como ven, resulta. Ayuda mucho y salvas mucho tiempo y codigo.

Adjunto un ejemplillo hecho en Delphi XE2.

saludos cordiales.

06-01-2013 #2

LoPiTaL Registrado: abr 2009


Posts: 168
Miembro

Hola!
Los ClassHelpers son indudablemente una fantástica herramienta, útil, como dices, para introducir nuevos métodos a clases existentes.

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Sin embargo, desde Embarcadero enfatizan que "NO DEBE SER UTILIZADO PARA DESARROLLAR NUEVO CÓDIGO". La razón de esto es que sólo puede haber un class helper activo en cada momento, por lo que si alguien usase el class helper que tú
propones, y ahora crease un nuevo class helper con la función, p. ej. to_date: TDateTime, entonces no podría utilizar ambos.

Los ClassHelpers están pensados para "hackear" clases que NO tenemos disponibles, gracias a su habilidad de leer variables privadas de la clase a la que "ayudan". Por ejemplo, podríamos resolver un bug en FMX sin tener que recompilar el
framework o añadir una funcionalidad a una clase proporcionada por un tercero, la cual requiera variables privadas de ésta.

Por tanto, siempre que se pueda, es recomendable usar herencia tradicional, antes que usar un class helper.

P. ej. en tu caso, podrías hacer algo como esto (escrito en el navegador, así que no sé si compilará):

Código Delphi [-]

unit EditAdv;

implementation

uses
VCL.StdCtrls;

type
TEdit=class (VCL.StdCtrls.TEdit)
public
function toUpper: string;
function toLower: string;
function to_i: integer;
function to_f: extended;
function toEqual(value: string): boolean;
function find(value: string): boolean;
end;

Y así, en donde necesites esta funcionalidad, añades en el uses (debes añadirlo después de VCL.StdCtrls) EditAdv y ya tienes la funcionalidad preparada.

Si alguien quiere añadir más cosas, pues simplemente:

Código Delphi [-]

unit EditAdv2;

implementation

uses
EditAdv;

type
TEdit=class (EditAdv.TEdit)
public
function toDateTime: TDateTime;
end;

y usaría EditAdv2 en lugar de EditAdv.

¿Y entonces, para qué se usa el class helper si ya no hace falta?


En todo esto, el class helper tendría su lugar si, p. ej. para implementar una de tus funciones avanzadas necesitases acceder a alguna variable interna (privada) de éste, la cual no tienes accesible en la clase heredada. Entonces sí es necesario
usar el class helper, ya que el lenguaje no te ofrece ninguna otra forma de hacerlo.
Te pongo un ejemplo de esto último, en el cual se necesita acceder a la variable FOldSelLength de la clase TCustomEdit:

Código Delphi [-]

unit Unit2;

interface

uses
Vcl.StdCtrls;

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
type
TEdit=class (Vcl.StdCtrls.TEdit)
public
procedure MiNuevaFuncionQueNecesitaOldSelLength();
end;

implementation

type
//Notar que el helper no es para TEdit, sino para TCustomEdit!!!!! Si ayudamos a TEdit, seguimos sin tener acceso a la variable privada de TCustomEdit!!!!
//Notar también que el helper es interesante ponerlo en la parte implementation para que no sea visible desde otras units que utilicen ésta, y machaque a algún otro helper que esté activo en ellas.
//Notar también que el helper SÓLO se debe encargar de leer / escribir la variable que no tenemos acceso desde fuera! Cualquier otra operación es conveniente que la haga la clase heredada, para que
// se pudiese sobreescribir en alguna otra clase hija. También se podría añadir una propiedad a la clase heredada que fuese OldSelLength con geters y seters que simplemente llamasen a los métodos
// del helper, de tal forma que se podría usar como si fuese una propiedad más.
TEditHelper=class helper for Vcl.StdCtrls.TCustomEdit
protected
function GetOldSelLength: integer;
end;

{ TEditHelper }

function TEditHelper.GetOldSelLength: integer;


begin
//Para acceder a variables internas, es necesario usar explícitamente Self.
Result:=Self.FOldSelLength;
end;

{ TEdit }

procedure TEdit.MiNuevaFuncionQueNecesitaOldSelLength;
begin
//Ya podemos obtener el FOldSelLength mediante la función proporcionada por el helper y trabajar con él.
ShowMessage(IntToStr(GetOldSelLength));
end;

end.

Espero no haberte confundido mucho . Simplemente quédate con que SIEMPRE que puedas hacer algo mediante herencia, usa herencia. Cuando no veas posibilidad de usar herencia, entonces, tal vez, haya que usar class helper.

Un saludo,
LoPiTaL

06-01-2013 #3

dario61081 Registrado: abr 2007


Posts: 6
Registrado

LoPiTaL wow... realmente me quede con la boca abierta.

Muchas gracias por ampliar el tema. ademas esta info me ha interesado mucho mas en las herencias.

Estaré probando a ver que tal me sale

saludos cordiales.

« Tema A nterior | Próximo Tema »

Normas de Publicación

no Puedes crear nuevos temas


no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
El código vB está habilitado
Las caritas están habilitado
C ódigo [IMG] está habilitado Saltar a Foro
C ódigo HTML está deshabilitado Varios Ir

La franja horaria es GMT +2. Ahora son las 05:41:01.

-- Español 3.6.7 Contactar con Nosotros - Club Delphi - A rchivo - Top

Powered by vBulletin® Version 3.6.8


C opyright ©2000 - 2015, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del C lub Delphi
Inicio | Contacto | Foros | Noticias | Trabajo

Copyright 1996-2007 Club Delphi

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com

También podría gustarte