Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-05-2004
Sonic Sonic is offline
Miembro
 
Registrado: may 2004
Posts: 40
Poder: 0
Sonic Va por buen camino
Muchas gracias por explicarme cómo pegar código.

Lo siento pero no consigo que el código funcione.
A continuación pego lo que he escrito:

Código:
 
 // ValidCtrCheck is used to assure that the components created do not have
 // any pure virtual functions.
 //
 
 static inline void ValidCtrCheck(TSRichEdit *)
 {
 		new TSRichEdit(NULL);
 }
 //---------------------------------------------------------------------------
 __fastcall TSRichEdit::TSRichEdit(TComponent* Owner)
 		: TRichEdit(Owner)
 {
 }
 //---------------------------------------------------------------------------
 namespace Srichedit
 {
 		void __fastcall PACKAGE Register()
 		{
 				 TComponentClass classes[1] = {__classid(TSRichEdit)};
 				 RegisterComponents("Samples", classes, 0);
 		}
 }
 //---------------------------------------------------------------------------
 void __fastcall TSRichEdit::SelectionChange (TObject *Sender)
 {
   ShowMessage("Hola Quillo 1aaaaa");
   inherited SelectionChange(TObject *Sender);
   //TCustomRichEdit::SelectionChange();  // Esto tampoco funciona
 }
Defino la función SelectionChange y recibo el warning de que estoy tapando a la virtual de TCustomRichEdit.

Pero cuando ejecuto el código y ocurre un evento OnSelectionChange solo se ejecuta el código de usuario y no el interno de mi componente.

Tras ver ese post de pista que ofreciste, se me ocurrio sencillamente suplantar al WndProc y capturar el mensaje EN_SELCHANGE, y tras esto ejecutar mi código y luego llamar al WndProc del TWinControl. Esto último ya lo he hecho con otro tipo de mensajes y funciona pero el mensaje EN_SELCHANGE no consigo capturarlo.

Así que de nuevo estoy estancado. Como puedes ver en el código e intentado usar lo de Inherited y esa parece ser la única forma en que compila y la linea que hay más abajo comentada es (según creo yo) otra forma de hacer lo mismo pero que tampoco funciona.

Ah otra cosa, viendo que no funcionaba miré esto:
Cita:
Empezado por Marto
begin
if Assigned(OnSelectionChange) then OnSelectionChange(Self);
E intenté implantarlo en el constructor de mi objeto de la siguiente manera:
Código:
   if (OnSelectionChange==NULL)
 	 OnSelectrionChange=SelectrionChange;
y también lo intenté con el Self que parece no reconocerlo de ninguna manera.

Tal y como lo veo ahora tengo dos opciones: intentar seguir por el camino que me marcó Marto, o instentar capturar el mensaje EN_SELCHANGE. Cualquiera de las dos soluciones me serviría. Aunque preferiría poder usar la de Marto ya que me parece la más sencilla de las dos (en cuanto a la estructura del programa).

Muchas Gracias
Responder Con Cita
  #2  
Antiguo 27-05-2004
Avatar de marto
marto marto is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona, Catalunya
Posts: 882
Poder: 24
marto Va por buen camino
Cita:
Empezado por Sonic
Código:
void __fastcall TSRichEdit::SelectionChange (TObject *Sender)
{
  ShowMessage("Hola Quillo 1aaaaa");
  inherited SelectionChange(TObject *Sender);
  //TCustomRichEdit::SelectionChange(); // Esto tampoco funciona
}
¿Eso te compila?
No tengo el c++ y no lo puedo probar, pero a mi me parece que tendría que ser así:
Código:
void __fastcall TSRichEdit::SelectionChange (TObject *Sender)
{
  ShowMessage("Hola Quillo 1aaaaa");
  inherited SelectionChange(Sender);
}
Cita:
Empezado por Sonic
Pero cuando ejecuto el código y ocurre un evento OnSelectionChange solo se ejecuta el código de usuario y no el interno de mi componente.
¿quieres decir que que no se ejecuta el showmessage? eso es porque no estás sobrecargando el método. Ahora no recuerdo cómo se hace en c++, pero tienes que encontrar el equivalente al override de Delphi


P.D: Ojalá todos los usuarios tubiesen tu actitud. Espero que tengamos la suerte de tenerte a menudo por aquí
__________________
E pur si muove
Responder Con Cita
  #3  
Antiguo 27-05-2004
Sonic Sonic is offline
Miembro
 
Registrado: may 2004
Posts: 40
Poder: 0
Sonic Va por buen camino
Me voy a poner colorao, muchas gracias!

Seguro que me veis por aqui a menudo, es la primera vez que participo en un foro, pero me gusta, además aprendí a manejar el Builder, este Septiembre para mi proyecto fin de carrera, y le cogí el gustillo así que seguro que andaré bastante por aquí.

Bueno al tema:

Si coloco el Sender como argumento Builder me da este error:
Cita:
Empezado por Builder
[C++ Error] SRichEdit.cpp(86): E2459 VCL style classes must be constructed using operator new
Que la verdad no se a qué viene. Así que lo puse sin argumento y así si compila.

Con respecto a la sobrecarga, el Builder me da el siguiente Warning:
Cita:
Empezado por Builder
[C++ Warning] SRichEdit.h(31): W8022 '_fastcall TSRichEdit::SelectionChange(TObject *)' hides virtual function '_fastcall TCustomRichEdit::SelectionChange()'
Sin mas que haber definido la funcion con el mismo nombre, por lo que yo entiendo que no necesito ninguna directiva del tipo de override;

Perdón acabo de probarlo, he quitado la función de usuario que responde al evento y ahora no se ejecuta nada, por lo que definitivamente no estoy sobrecargando la función. Pero bueno, ya es la hora de comer así que lo miraré luego, muchas gracias por todo espero poder tener una solución en breve.
Responder Con Cita
  #4  
Antiguo 27-05-2004
Avatar de marto
marto marto is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona, Catalunya
Posts: 882
Poder: 24
marto Va por buen camino
Despues de buscar un poco por ahí, creo que el método debería quedar así:

Código:
void __fastcall TSRichEdit::SelectionChange (TObject *Sender)
{
  ShowMessage("Hola Quillo 1aaaaa");
  TCustomRichEdit::SelectionChange(Sender);
}
El warining te seguirá dando, pero eso es secundario, vamos a ver si consigues que funcione y luego nos pegamos con él
__________________
E pur si muove
Responder Con Cita
  #5  
Antiguo 27-05-2004
Sonic Sonic is offline
Miembro
 
Registrado: may 2004
Posts: 40
Poder: 0
Sonic Va por buen camino
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



Responder Con Cita
  #6  
Antiguo 27-05-2004
Avatar de marto
marto marto is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona, Catalunya
Posts: 882
Poder: 24
marto Va por buen camino
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?
__________________
E pur si muove
Responder Con Cita
  #7  
Antiguo 28-05-2004
Sonic Sonic is offline
Miembro
 
Registrado: may 2004
Posts: 40
Poder: 0
Sonic Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 28-05-2004
Sonic Sonic is offline
Miembro
 
Registrado: may 2004
Posts: 40
Poder: 0
Sonic Va por buen camino
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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


La franja horaria es GMT +2. Ahora son las 04:03:22.


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