Cita:
Empezado por _Io
Tengo un componente TEDit, que en tiempo de diseño tiene creado su procedimiento para la respuesta al evento OnKeydown.
Lo que me gustaría hacer, es que en el momento oportuno capturar ese evento, para realizar otra tarea, sin que se pierda la tarea del procedimiento asignado en tiempo de ejecución.
|
Si en tiempo de diseño ya tiene asignado un evento (o no sabes si lo tienes asignado), en ejecución debes hacer varias cosas:
- Capturar el evento original (un apuntador al procedimiento original)
- Asignar el nuevo evento (el tuyo)
- Desde tu evento (al inicio, al final o donde te interese) hacer la llamada al procedimiento original (con el apuntador guardado antes).
Con un ejemplo:
Imagina que tienes un evento original en el Edit, que muestra en el Label la tecla pulsada, con este código:
Código Delphi
[-]
procedure TForm3.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
Label1.Caption := 'Tecla pulsada:' + IntToStr(key);
end;
Necesitas en ejecución, además de lo que ya hace, mostrar o no el Grid (en este caso para hacerlo simple, he puesto que se muestre o no dependiendo de si se pulsa letra o número).
Los 3 pasos anteriores los harías de la siguiente manera:
Defines una variable para el evento original y tu nuevo evento con lo que quieres hacer:
Código Delphi
[-] private
FOldEvent:TKeyEvent; procedure MyKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
Y la implementación esto:
Código Delphi
[-]procedure TForm3.FormCreate(Sender: TObject);
begin
FOldEvent := Edit1.OnKeyDown; Edit1.OnKeyDown := MyKeyDown; end;
Al ejecutar mi evento, hago mi trabajo y llamo al original:
Código Delphi
[-]
procedure TForm3.MyKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
StringGrid1.Visible := (key >= 48) and (key<=57);
if Assigned(FOldEvent) then
FOldEvent(Sender, Key, Shift);
end;
Con esto creo que consigues lo que necesitas.
Te adjunto el proyecto de ejemplo.