Delphi - Generalizar Eventos de un control

 
Vista:

Generalizar Eventos de un control

Publicado por Irreal (69 intervenciones) el 27/05/2006 11:43:45
Necesito que por defecto cada vez que se ejecute un evento OnCange, On Enter y OnExit se ejecute un procedimiento. Esto quiero montarlo sonre un objeto deribado de un TEDIT.

Como puedo montarlo sin necesidad de tener que asignar el procedimiento a mano a cada uno de los controles que creo.

Entinendo que he de poder asignarlo por codigo a la hora de construirlo pero no tengo muy claro como hacerlo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Generalizar Eventos de un control

Publicado por Dr Juzam (821 intervenciones) el 27/05/2006 13:47:38
Cuando crees el objeto puedes asignarle un procedimiento (que comparta los mismos tipos de entrada) de este modo:

NuevoEdit.OnChange:=MiOnChange;

Donde MiOnChage es un procedimiento con esta estructura:

procedure TForm1.MiOnChange(Sender: TObject);
begin
{...}
end;

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Generalizar Eventos de un control

Publicado por Irreal (69 intervenciones) el 27/05/2006 15:34:48
Donde he de asignar el nuevo procediminto, lo he pobado en varias secciones pero en ninguna me reconoce la instruccion.

{...}
type
TIB_FuserEdit = class(TEdit)
private
procedure GestionaRelacion(Sender : Tobject);
public
Constructor Create(AOwner: TComponent); override;
published
end;

procedure Register;

implementation

Constructor TIB_FuserEdit.Create(AOwner: TComponent);
begin
inherited;
TIB_FuserEdit.OnChange := GestionaRelacion;
end;

procedure GestionaRelacion(Sender : Tobject);
begin
ShowMessage('Va bien');
end;
end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Generalizar Eventos de un control

Publicado por Dr Juzam (821 intervenciones) el 28/05/2006 12:30:15
No entiendo muy bien lo que quieres hacer. Si lo que quieres hacer es que al crear un objeto puedas asignarle un procedimiento específico para uno de sus eventos, en este caso, el OnChange, sería así:

var
MiEdit: TEdit;
begin
MiEdit:= TEdit.Create (Self);
MiEdit.Parent:=Self;
{...Resto de propiedades...}
MiEdit.OnChange:=GestionaRelacion;
end;

Si estás creando un nuevo objeto pero para ponerlo en la paleta, lo que creo que tienes es que redeclarar el procedimiento OnChange y hacer los cambios desde allí. De todos modos si es eso y tienes problemas, dimelo que intentaré rescatar algunos componentes que hice para repasar su código.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Generalizar Eventos de un control

Publicado por Irreal (69 intervenciones) el 29/05/2006 11:02:02
Se trata del segundo caso.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Generalizar Eventos de un control

Publicado por Irreal (69 intervenciones) el 29/05/2006 11:05:29
Pretendo hacer un control que recoja campos de una tabla adicional.

El código es el siguiente:

unit cFuserEdit;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Mask, IB_Controls;

type
TIB_FuserEdit = class(TIB_Edit)
private
vFsrCmpMostrar : TStringList;
vFsrCmpRecoger : TStringList;
vFsrCampo : String;
vFsrTabla : String;
vFsrWhere : TStringList;
vFsrCtrRecoger : TStringList;
vFsrName : String;
procedure SetFsrCmpMostrar(Valor: TStringList);
procedure SetFsrCmpRecoger(valor : TStringList);
procedure SetFsrCampo(valor : String);
procedure SetFsrTabla(valor : String);
procedure SetFsrWhere(valor : TStringList);
procedure SetFsrCtrRecoger(valor : TStringList);
public
Constructor Create(AOwner: TComponent); override;
published
property FsrCmpMostrar : TStringList read vFsrCmpMostrar write SetFsrCmpMostrar;
property FsrCmpRecoger : TStringList read vFsrCmpRecoger write SetFsrCmpRecoger;
property FsrCampo : String read vFsrCampo write vFsrCampo;
property FsrTabla : String read vFsrTabla write SetFsrTabla;
property FsrWhere : TStringList read vFsrWhere write SetFsrWhere;
property FsrCtrRecoger : TStringList read vFsrCtrRecoger write SetFsrCtrRecoger;
end;

procedure Register;

implementation

Constructor TIB_FuserEdit.Create(AOwner: TComponent);
begin
inherited;
vFsrCmpMostrar := TStringList.Create;
vFsrCmpRecoger := TStringList.Create;
vFsrWhere := TStringList.Create;
vFsrCtrRecoger := TStringList.Create;
end;

procedure Register;
begin
RegisterComponents('iboControls', [TIB_FuserEdit]);
end;

procedure TIB_FuserEdit.SetFsrCmpMostrar(Valor : TStringList);
begin
vFsrCmpMostrar.Text := Valor.Text;
end;

procedure TIB_FuserEdit.SetFsrCmpRecoger(valor : TStringList);
begin
vFsrCmpRecoger.Text := Valor.Text;
end;

procedure TIB_FuserEdit.SetFsrCampo(valor : String);
begin
vFsrCampo := Valor;
end;

procedure TIB_FuserEdit.SetFsrTabla(valor : String);
begin
vFsrTabla := Valor;
end;

procedure TIB_FuserEdit.SetFsrWhere(valor : TStringList);
begin
vFsrWhere.Text := Valor.Text;
end;

procedure TIB_FuserEdit.SetFsrCtrRecoger(valor : TStringList);
begin
vFsrCtrRecoger.Text := Valor.Text;

end;

end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Generalizar Eventos de un control

Publicado por Dr Juzam (821 intervenciones) el 29/05/2006 21:41:23
Como ves, los cambios se hacen sobre el propio OnChange. Lo declaramos pero indicamos que queremos sobreescribir el método heredado original (de ahí el tema del override). Según el Change, heredamos el método de la clase de la que desciende (en este caso del TEdit) y luego añadimos el código que queremos.

[Autobombo mode=on]
En mi página, sección de manuales, hay uno muy bueno de creación de componentes (no lo he escrito yo ;-)
[Autobombo mode=off]

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Generalizar Eventos de un control

Publicado por Dr Juzam (821 intervenciones) el 29/05/2006 21:42:40
uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls, Dialogs;
type
TEdit1 = class(TEdit)
private
{ Private declarations }
protected
procedure Change; Override;
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TEdit1]);
end;
procedure TEdit1.Change;
begin
inherited Changed;
ShowMessage ('Cambio');
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Generalizar Eventos de un control

Publicado por Dr Juzam (821 intervenciones) el 29/05/2006 21:46:18
Lo siento, pero no podía (¿?) enviar todo el texto completo en un solo post. Lo que he puesto es un código de un Edit nuevo sobreescribiendo el método OnChange, de tal manera que cada vez que se produzca algún cambio sobre él aparezca un ShowMessage.

La idea es (del DevGuide: Component writer's guide):

Example: Changing the standard event handler

Suppose you are writing a component and you want to modify the way it responds to mouse clicks. Instead of assigning a handler to the OnClick event as a application developer would, you override the protected method Click:

procedure click override { forward declaration }

...

procedure TMyControl.Click;

begin
inherited Click; { perform standard handling, including calling handler }
... { your customizations go here }
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar