Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Redefinir eventos de controles "delegados" (https://www.clubdelphi.com/foros/showthread.php?t=66946)

yapt 20-03-2010 18:29:45

Redefinir eventos de controles "delegados"
 
Hola a todos, quiero hacer lo siguiente (a ver si consigo explicarme):

Tengo una clase que hace un trabajo X.
Ahora quiero hacer una clase que utiliza esta primera y que sirva de interfaz entre la primera clase y los propios componentes del form.

Para ello quiero utilizar los eventos onKeyUp de los TEdit. Y con cada cambio de cada uno de ellos, afectar a la propiedad Text de los demas.

Algo así (aunque quizá lo que persigo no sea muy importante finalmente):


Código Delphi [-]
TClase1 = class
 ....
end;

Y la segunda:

Código Delphi [-]
TClase2 = Class(Clase1)
strict private
  FEdit1: TEdit;
  FEdit2: TEdit;
  FEdit3: TEdit;
privateprocedure MiFOnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
 procedure SetEdit1(const Value: TEdit);
public
  property Edit1: TEdit read FEdit1 write SetEdit1;
  property Edit2: TEdit read FEdit2 write SetEdit2;
  property Edit3: TEdit read FEdit3 write SetEdit3;
end;

procedure TClase2.SetEdit1(const Value:TEdit);
begin
  FEdit1 := Value;
  FEdit1.OnKeyUp := FMiOnKeyUp(Self, Key, Shift);
end;

procedure TClase2.MiFOnKeyUp(Sender: TObject; var Key: Word; Shift:  TShiftState);
begin
  //.... hago lo que sea aquí.....
  if Assigned(FOnKeyUp) then FOnKeyUp;  <<<< aquí el error...
end;

El tema es, como hago para crear mi propio OnKeyUp para cada Edit1, 2 y 3, y que siga ejecutandose el onKeyUp del propio componente dentro del formulario (después/antes de mi propio OnKeyUp).

He cambiado la linea marcada como erronea, de todas las formas (razonables) que se me ocurren...

No se si me explico. Si hay alguna duda, trato de aclararla.

Gracias.

roman 20-03-2010 19:05:10

Creo que sería más sencillo si trabajaras con clases derivadas de TEdit. En estas clases redefines su evento DoKeyUp o KeyUp (no recuerdo bien) y haces lo que quieras hacer antes o después de llamar a inherited. De esta manera no te tienes que meter con la llamada a los eventos pues eso ya lo hace la clase original.

Dicho de otra manera: cuando extiendes el comportamiento de una clase, es más adecuado hacerlo mediante la redefinición de métodos virtuales que mediante la reasignación de eventos.

// Saludos

yapt 20-03-2010 19:39:12

El problema de redefinir la clase TEdit es que, entiendo (en mi más completa ignorancia) que debo crear un NUEVO componente visual y poner ese componente en el form.

Digo esto porque he intentado hacerlo (sin crear ese otro componente visual), pero al asignar el TEdit del form al TMiEdit de la clase "intermedia", me dá este error:

Código Delphi [-]
Conversor1 := TClass2.Create;
//Conversor1.Edit1 es del Tipo TMiEdit (que desciende de TEdit).
Conversor1.Edit1 := Form1.Edit1;

Incompatible types: TMiEdit and TEdit
Entiendo que es por que TMiEdit desciende de TEdit y ........

Vamos... que me he atorado aquí....

Gracias.

ecfisa 22-03-2010 18:17:37

Hola yapt.

Quizá hayas leído este artículo, pero si no, pegale una leida por ahí te tira una nueva idea.

http://www.marteens.com/trick46.htm

Saludos.

yapt 22-03-2010 19:55:44

Fantastico ecfisa... funciona perfecto.

Habia leido sobre las clases interpuestas... pero no las había relacionado con este tema. Se me habían escapado por completo. Esta cabeza mía ya no es la que era...

Muchas gracias.

ecfisa 26-03-2010 01:18:04

De nada yapt, me alegro haberte sido de ayuda.


La franja horaria es GMT +2. Ahora son las 00:54:03.

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