PDA

Ver la Versión Completa : codigo comun entre distintos formularios


federiconqn21
27-11-2007, 13:48:36
Hola a todos. la inquietud mia es la siguiente:
si yo utilizo varios formularios en una aplicacion y en cada uno de ellos tengo un metodo con el mismo codigo.como por ejemplo: formX.LiampiarDatos.
como lo implemento por unica vez?. en el espantoso Visual Basic se hace de una manera que no se me hace familiar aqui.gracias a quien me pueda despejar esta pequeña duda

dec
27-11-2007, 14:01:13
Hola,

En Delphi cuentas con el concepto de "módulos" o "unidades". Una unidad puede declarar e implementar procedimientos y variables (y objetos, tipos y lo que se te ocurra) que puede compartir con otras unidades. Así que puedes plantearte si el procedimiento "LimpiarDatos" puede compartirse, hasta qué punto merece la pena, y, ponerte a ello si ves que tal.

La verdad es que no se me ocurre qué más decirte, mejor dicho, a lo que se me ocurre no le encuentro mucho sentido. O sea, que habría que ver más detenidamente qué "datos" se supone que hay que "limpiar", de dónde... en fin, sin conocer los detalles es complicado ofrecer una posible solución. Pero, en definitiva, desde luego, es posible compartir código entre unidades.

Neftali [Germán.Estévez]
27-11-2007, 16:00:54
...como por ejemplo: formX.LiampiarDatos

Puedes probar a implementar la funcioón fuera y padssarle el form como parémetro.
En ese caso la llamarías como:


LiampiarDatos(formX);

dec
27-11-2007, 16:02:27
Hola,

Pero, si la función espera un tipo de formulario en concreto... sólo valdrá para ese tipo de formularios, ¿no?

PD. Es por molestar nada más... :D :D

Neftali [Germán.Estévez]
27-11-2007, 16:18:04
...sólo valdrá para ese tipo de formularios, ¿no?

No tiene porqué. Se supone que el parámetro será genérico.
Si debe acceder a los controles de un formulario lo lógico es pasar ese formulario como parámetro (no se me ocurre otra forma).
Algo así vamos:


procedure LimpiarDatos(AForm:TForm);
var
i:Integer;
edt: TEdit;
begin
// recorrer los componentes
for i := 0 to (AForm.ComponentCount - 1) do begin
// Es un TEdit
if (AForm.Components[i] is TEdit) then begin
// Limpiar el edit
edt := TEdit(AForm.Components[i]);
edt.Clear;
// edt. .... //otras propiedades
end;
end;


Si hubiera que hacerlo con más tipos de controles, también se podría utilizar RTTI.

De esta forma puedes llamarla como:


LimpiarDatos(AForm:TForm);
LimpiarDatos(formX);
...

maeyanes
27-11-2007, 16:22:11
También puedes usar la herencia visual...

Creas una forma que contenga el método LimpiarDatos:


TMiForma = class(TForm)
protected
procedure LimpiarDatos; virtual;
end;

implementation

procedure TMiForma.LimpiarDatos;
begin
// Lo que quieres hacer...
end;


Luego agregas esa unidad a tu proyecto y de ahí heredas esa forma... así puedes tener lo que deseas:


TClientesForm = class(TMiForma)
edtClave: TEdit;
edtNombre: TEdit;
btnAceptar: TButton;
btnCancelar: TButton;
btnLimpiar: TButton;
procedure btnLimpiarOnClick(Sender: TObject);
end;

implementation

procedure TClientesForm.btnLimpiarOnClick(Sender: TObject);
begin
LimpiarDatos
end;


Saludos...