Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-02-2012
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 163
Poder: 13
engranaje Va por buen camino
utilizar método del abuelo ignorando el del padre

Un saludo a todos. Estoy utilizando delphi 5.0 y me sucede que estoy utilizando una grid de terceros que hereda del Tdbgrid normal y tiene el keydown sobreescrito capturando un buen número de teclas para trabajar a su manera. En algunos formularios de la aplicación en particular necesitaría que la grid utilizase el keydown del abuelo, es decir del tdbgrid y no el keydown sobreescrito en el grid de terceros.

Aclaro que no puedo modificar el código del control desarrollado por terceros, solo el de los formularios que utilizan ese control, por mas que le he dado vueltas no se me ocurre el modo.

Espero haberme explicado bien, gracias por vuestro tiempo.
Responder Con Cita
  #2  
Antiguo 07-02-2012
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
Bueno, creo que llamar al keydown del abuelo no se podria, PERO, recuerdo un "hack" el cual consiste en declarar un objeto en la forma, con el mismo nombre y ahi rehacer el keydown basado en el del tdbgrid, algo asi como:

Código:
Type
TSuperGrid = class(unidadterceros.TSuperGrid)
etc..
etc..
end;
esto al principio de la forma, antes de la misma declaración de la forma, y con eso obtendrías lo que quieres, pero eso si, insisto, seria hacer el keydown "nuevo" con el código del tdbgrid no tanto mandar llamar al abuelo
Responder Con Cita
  #3  
Antiguo 07-02-2012
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 163
Poder: 13
engranaje Va por buen camino
Gracias por tu respuesta Luis, el "problema" que tengo al intentar implementar una solución de este tipo es que tengo que escribir todo el código del keydown y que si lanzo un inherited va a utilizar el de la clase padre, si se pudiera de algún modo en el keydown sobreescrito del nuevo objeto hacer algo del tipo:
Código:
procedure TSuperGrid.KeyDown(var Key: Word; Shift: TShiftState);
begin
  inherited Tcustomdbgrid.keydown(key,Shift);
end.
Por supuesto este código me da el error "undeclared identifier Tcustomdbgrid" por mucho que tenga en el uses declarado dbgrids, lo pongo a modo de ejemplo por si alguién puede decirme un modo de pode utilizar el código que ya existe en el keydown del tcustomdbgrid y evitarme tener que implementar de 0 todo el keydown. De nuevo gracias por la ayuda.
Responder Con Cita
  #4  
Antiguo 07-02-2012
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 163
Poder: 13
engranaje Va por buen camino
Por si sirve para aclarar algo mas mi duda dejo escrito un intento que pensé que me serviria pero ha resultado ser un callejon en el que no he encontrado salida:
Código:
procedure TSuperGrid.KeyDownRedirigido(var Key: Word; Shift: TShiftState);
  type
    TMiTipoDeProcedimiento = procedure (var Key: Word; Shift: TShiftState)
    TProcedimientoRedirigido = procedure of object;
  var
    procedimientoRedirigidoKeyDown : TProcedimientoRedirigido;
  begin
    TMethod(procedimientoRedirigidoKEyDown).code := @Tcustomdbgrid.keydown(key,Shift);
    TMethod(procedimientoRedirigidoKEyDown).data := RxDBGridEmpleados;
    TMiTipoDeProcedimiento(procedimientoRedirigidoKeyDown) (key,shift); 
  end;
He probado primero a usar esto con estrucutras sencillas del tipo:
Código:
type
  TBase = class
    procedure Foo; virtual;
  end;

  TAnsestor = class(TBase)
    procedure Foo; override;
  end;

  TChild = class(TAnsestor)
    procedure Foo; override;
    procedure BaseFoo;
  end;

procedure TBase.Foo;
begin
  ShowMessage('TBase');
end;

procedure TAnsestor.Foo;
begin
  ShowMessage('TAnsestor');
end;

procedure TChild.Foo;
begin
  ShowMessage('TChild');
end;

type
  TFoo = procedure of object;

procedure TChild.BaseFoo;
var
  Proc: TFoo;

begin
  TMethod(Proc).Code := @TBase.Foo; // Static address
  TMethod(Proc).Data := Self;
  Proc();
end;

procedure TForm4.Button1Click(Sender: TObject);
var
  Obj: TChild;
  Proc: TFoo;

begin
  Obj:= TChild.Create;
  Obj.BaseFoo;
// or else
  TMethod(Proc).Code := @TBase.Foo; // Static address
  TMethod(Proc).Data := Obj;
  Proc();

  Obj.Free;

end;
Este ejemplo me ha funcionado correctamente, sin embargo mi intento fracasa estrepitosamente con el error "undeclared identifier keydown" ademas si realizo modificaciones para que los métodos heredados acepten parametros los valores de estos parametros desaparecen al llegar al llegar al abuelo.

En fin, ando de lo mas perdido, espero no haber liado mas la consulta con esta explicación, gracias de antemano por cualquier idea que se os ocurra.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
El Abuelo de los Micros. JoseFco ASM y Microcontroladores 123 02-10-2008 05:10:25
Dia del padre jhonny La Taberna 3 17-06-2007 03:42:21
A patear traseros con el abuelo! mamcx Noticias 3 23-02-2007 21:32:10
Voy a ser Padre ContraVeneno La Taberna 28 10-01-2007 18:17:43
Evitar la ejecución del método padre Egroc Varios 3 22-07-2004 18:16:11


La franja horaria es GMT +2. Ahora son las 10:44:22.


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
Copyright 1996-2007 Club Delphi