Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Usar eventos en un VCL (https://www.clubdelphi.com/foros/showthread.php?t=10727)

Sonic 27-05-2004 16:54:16

Acabo de caer, el mensaje que me da Builder no indica que haya sobrescrito la función del manejador del evento sino que he realizado una sobrecarga de operadores:

Cita:

Empezado por Sonic
fastcall TSRichEdit::SelectionChange(TObject *)' hides virtual function '_fastcall TCustomRichEdit::SelectionChange()'


La función del TCustomRichEdit no tiene argumentos y yo le había puesto TObject *Sender.

Aún después de descubrir eso no consigo sobreescribir dicho método por que si quito este párametro recibo otro mensaje de error que dice:

Cita:

Empezado por Builder
[C++ Error] SRichEdit.h(22): E2113 Virtual function '_fastcall TSRichEdit::SelectionChange()' conflicts with base class 'TCustomRichEdit'

En la ayuda me dice que aunque los parámetros son los mismos puede que algo más no sea igual que en la clase predecesora. Pero no encuentro qué puede ser.

Bueno ya mañana, seguiré con esto.

Lo dicho, cualquier sugerencia siempre será bien recibida. Muchas Gracias




marto 27-05-2004 16:58:45

Pues la verdad es que ya estoy yo intrigado con el tema... y no lo puedo probar :(

En Delphi no es así, pero ¿puede ser que si el método de TCustomRichEdit está declarado como dinámico tengas que hacer lo mismo en tu clase?

Sonic 28-05-2004 10:35:27

OLE OLE OLE y OLE!

Ya lo he conseguido, bueno lo hemos conseguido!

Muchas gracias Marto! y también Cadetill y Lepe!

Tenías toda la razón, me estaba complicando demasiado intentando gestionar los mensajes de Windows. Ha sido tan sencillo como sobreponer mi método al del antecesor y luego dentro de mi método hacer una llamada al del éste!

Funciona a las mil maravillas, es más sencillo de hacer, entender y gestionar y ya no tengo el problema que tenía con el modo en que lo estaba haciendo antes.

La verdad es que me alegro mucho de haber encontrado este foro y de haber participado en él. De modo que este hilo, según parece acaba de llegar a su fin, a su buen fin.

Pero como me ha gustado esto de los foros y de bien nacidos es ser agradecidos, continuaré pendiente al foro para ver si puedo ayudar a alguién. De nuevo muchas gracias a todos los que habeis querido ayudarme.

Explico cuál ha sido la solución al final.

Para empezar la función en el .h la he declarado así:

Código:

DYNAMIC void __fastcall SelectionChange(void);
Pero luego en la implementación de la función no puedo poner DYNAMIC (por eso ayer aunque intenté poner DYNAMIC no me salía, solo se puede poner en la declaración) si no que lo hago así:

Código:

void __fastcall TSRichEdit::SelectionChange()
 {
    ShowMessage ("Hola quillo 1");
    TRichEdit::SelectionChange();
 
 }

He tenido que usar el operador de ámbito porque el inherited aunque se lo traga sin dar warnings ni errores, luego no funciona como yo entiendo que debería hacerlo, de todos modos creo que teóricamente poner el inherited y el TRichEdit::SelectionChange es lo mismo así que como funciona así se queda.

Bueno lo dicho que Muchas Gracias a todos y que espero que nos encontremos y discutamos mucho por este foro de aqui en adelante.

Sonic 28-05-2004 14:57:22

Bueno mi programa va sobre ruedas, pero me ha surgido una duda:

Esta vez he tenido suerte porque para el evento OnSelectionChange existía una función predeterminada a la que se le puede hacer override.

Pero, ¿cómo tendría que hacerlo si el evento que quisiera manejar fuera OnChange u OnKeyPress o algún otro?

En la ayuda no aparece que estos eventos tengan asociados ninguna función. Y el método que yo usaba inicialmente me daría los mismos problemas ¿Tendría que gestionar yo los mensajes? OnKeyPress tiene su propio mensaje pero OnChange no ¿Cómo podría hacerse esto?

Alguién tiene alguna idea?

Gracias.

marto 28-05-2004 21:50:04

Wop!

Para lo que comentas y para muchas otras cosas la mejor solución es aprender de los maestros, es decir, de los programadores de Borland. Si navegas por el código de la VCL descubrirás las técnicas que ellos usan para implementar este y otro tipo de cosas.

En concreto, el tema de los eventos acostumbra a seguir siempre el mismo patrón. Se declara una propiedad del tipo del evento que es dónde se asigna el manejador a éste. Por otro lado, se programa un método protegido y virtual / dynamic que es el encargado de llamar al manejador en caso de estar asignado. Bien, este método es el que tenemos que sobreescribir en nuestra clase.

Sonic 29-05-2004 02:06:09

Como siempre brillante, muchas gracias Marto!

Seguiré tu consejo e investigaré el código de las VCL para aprender más. Aunque ya has resuelto mi duda.

Muchas gracias de nuevo!


La franja horaria es GMT +2. Ahora son las 00:58:56.

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