PDA

Ver la Versión Completa : Eventos en otras UNIT


Jose Roman
14-08-2013, 00:46:31
Hola a todos,

Tengo delphi 2007 y estoy realizando un programa el cual posee muchas lineas de codigo, por ahi lei que seria mejor utilizar otra UNIT en la cual divido el codigo, mi pregunta es ¿Como puedo capturar un evento (OnClic por ejemplo) hecho en otra unidad? lo he intentado pero a pesar que la coloco en la clausula uses no me aparece como opcion para incluirla en un evento OnClic de un TButton.


Gracias de antemano

ecfisa
14-08-2013, 01:54:33
¿Como puedo capturar un evento (OnClic por ejemplo) hecho en otra unidad?

Hola Jose Roman.

Un ejemplo.

Form1:

...
type
TForm1 = class(TForm)
btnShowForm2: TButton;
procedure btnShowForm2Click(Sender: TObject);
private
procedure ClickEnForm2Button1(Sender: TObject);
public
end;
...
implementation

uses Unit2;

procedure TForm1.ClickEnForm2Button1(Sender: TObject);
begin
Caption := 'Han echo click sobre Button1 en Form2';
end;

// Asignar evento y mostrar Form2
procedure TForm1.btnShowForm2Click(Sender: TObject);
begin
Caption := '';
if not Assigned(Form2) then
begin
Form2 := TForm2.Create(Self);
Form2.Button1.OnClick := ClickEnForm2Button1;
end;
Form2.Show; // (o ShowModal)
end;
...


El ejemplo supone que Form2 no está en Auto create form y que, lógicamente en Form2 existe un TButton llamado "Button1".

Saludos. :)

ozsWizzard
14-08-2013, 09:13:56
Si lo eventos no se van a reutilizar, aunque se pueda modular el código y llevar código a otras Units, precisamente lo eventos no es lo que deberías llevarte, al menos en mi opinión.

Y si es un código que se va a reutilizar, aún así hay opciones mejores que sacar los eventos de la unidad del formulario. Entre esas opciones, modula el código y llama desde los eventos a esas funciones y procedimientos.

Si asocias eventos de forma dinámica a tus componentes, puedes ser que si te interese tener estos eventos en una unidad concreto.

Mi consejo, si lo aceptas, es que reflexiones sobre cual es tu caso y ver si realmente te interesa llevarte los eventos a otras unidades, hay mucho código exportable a otras unidades y, precisamente, los eventos no son el mejor ejemplo.

Un saludo.

Jose Roman
14-08-2013, 15:01:50
muchas gracias por su colaboracion,
Les comento que los eventos que deseo realizar aparte los deseo hacer en una unidad aparte (File -> New -> Unit) la cual solamente posee:

unit Unit1;

interface

implementation

end.

Y ahi deseo realizar los eventos pero todo en tiempo de diseño, como por ejemplo que quedara en el evento OnClic del TButton en el Form1 algo asi Unit1.Click, no se que se deba colocar en Uses, piensoi que ahi esta el asunto....

Jose Roman
14-08-2013, 17:57:52
Hola a todos,


Tengo Delphi 2007 y tengo un programa con mas de 1000 lineas de codigo, deseo realizar los eventos en otra unidad (File -> New -> Unit)

http://img547.imageshack.us/img547/6335/iocv.jpg

y poder asignarlos a los componentes de mi formulario principal en tiempo de diseño, como por ejemplo en el evento OnClick de un TButton

http://img94.imageshack.us/img94/2341/7r70.jpg

en la imagen en vez de Button1Click deseo que quede algo como Unit2.ButtonClick.

Sera que se puede esto????? se que se debe colocar en USES la UNIT2 mas no se que se debe colocar de mas para pueda realizar esto.

Gracias por su colaboracion

ecfisa
14-08-2013, 19:15:29
Hola Jose Roman.

Por favor, tál como sugiere el punto 6 (http://www.clubdelphi.com/foros/guiaestilo.php#nadie) de la guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php), no crees otro hilo con el mismo tema, continua con el inicial.

Saludos :)

Jose Roman
14-08-2013, 20:32:04
mil disculpas, como veo que no me habian entendido realice una nueva pregunta pero con mas detalle

Jose Roman
14-08-2013, 20:33:45
Hola gracias por tu respuesta pero en la nueva unidad no hay form utilizo la opcion (File -> New -> Unit) de ahi es que hago la unidad y deseo crear los procedimientos

ecfisa
14-08-2013, 20:47:28
Hola Jose Roman.

Por lo que entiendo de tu imágen, deseas asignar en tiempo de diseño, desde el Object Inspector, el evento correspondiente a un TButton residente en otro formulario. Hasta donde sé, eso sólo es posible mediante código de forma similar al ejemplo que te puse en el mensaje anterior.

Pero desconozco si en las últimas versiones de Delphi es posible.

Saludos. :)

Jose Roman
15-08-2013, 15:22:58
Hola ecfisa,

Tienes toda la razon me pase buscando por distintos sitios y despues de unas horas y dentro del Object Inspector no se puede.

Te agradezco tu ayuda porque eso me dio una luz para realizardo por el lado que tu propones.

gatosoft
21-08-2013, 17:58:13
Ok Amigo Jose Roman, No es posible hacer lo que dices de forma directa, como dice ecfisa, se logra por codigo...

Sin embargo creo que te estas centrando en una solución que no es adecuada para tu problema... apoyo lo que dice ozsWizzard, sobre replantear tu estrategia y modular el código...

Tu problema es: Un programa con muchas lineas, no es un evento en otra unidad.

No se cuanto conozcas de objetos, pero aprender sobre ellos es un buen camino para mejroar tu codigo.

El problema es que normalmente teienes en tu pantalla principal toda la logica de tu aplciacion y en cada boton, tenes toda la logica de un proceso... La mejor práctica es solo hacer llamadas desde tu GUI a código definido en otras unidades agrupadas por funcioanlidad o mejor, convertidas en clases...


De esta forma, tu boton debería tener codigo sencillo como:

Procedure BotonClick(Sender:TObject);
Begin
Factura.Inicializar;
Factura.item.add(...);
Factura.Aplicar;
end;


La lógica de como se inicializa, cómo se agrega y como se aplica una factura está definida en otra parte... tu boton solos e encarga de recoger la información de la pantalla y pasarla a tu otra unidad o clase...

Un saludo,

Jose Roman
21-08-2013, 19:24:44
Gracias por la respuesta,
Te comento que lo que he aprendido practicamente autodidacta y para completar aqui en Colombia no enseñan este maravilloso lenguaje, tienen un ejemplo de lo que comentan porque como veo el planteamiento propuesto por ecfisa y usted me ayudan, les comento que cada click que doy en un TButton no las muestro en un TForm, lo hago en un TTabSheet de un TPageControl pero ello me ha llevado a que haya muchas lineas de codigo y deseo que sea mas legible para un futuro si necesito realizar alguna modificacion. Gracias