![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Cita:
Cita:
__________________
E pur si muove |
|
#2
|
|||
|
|||
|
mmmm, Marto, perdona, pero..... de esta manera creo que no saltará el evento si no lo tiene asociado en el componente, no?
PD: lo digo con la voca xica, que no lo he probado ![]() |
|
#3
|
||||
|
||||
|
Cita:
![]()
__________________
E pur si muove |
|
#4
|
||||
|
||||
|
Una pista...
Esa es la implementación del método en TCustomEdit. El método se llama al capturar el mensaje correspondiente de windows:
__________________
E pur si muove |
|
#5
|
|||
|
|||
|
Cita:
![]() |
|
#6
|
|||
|
|||
|
Estimado Cadetill:
He respasado el código Delphi aunque no estoy muy ducho en la sintaxis de Delphi creo que es exáctamente lo que yo hago. Pero me alegra ver que ya más o menos se sabe por donde van los tiros. Pego a continuación mi código: 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)
{
ExOnSelectionChange=false;
Primer_evento=false;
}
//---------------------------------------------------------------------------
namespace Srichedit
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TSRichEdit)};
RegisterComponents("Samples", classes, 0);
}
}
//---------------------------------------------------------------------------
void __fastcall TSRichEdit::WndProc (Messages::TMessage &Message)
{
if (!Primer_evento)
{
{
Primer_evento=true;
if (OnSelectionChange!=NULL)
{
ExOnSelectionChange=true;
FExOnSelectionChange=OnSelectionChange;
}
OnSelectionChange=FInOnSelectionChange;
ShowMessage("Hola quillo 0");
OnSelectionChange=FExOnSelectionChange;
}
}
TWinControl::WndProc(Message);
}
//---------------------------------------------------------------------------
void __fastcall TSRichEdit::FInOnSelectionChange (TObject *Sender)
{
ShowMessage("Hola Quillo 1");
if (ExOnSelectionChange)
FExOnSelectionChange(Owner);
}
//---------------------------------------------------------------------------
Te dejo el código por si puedes darme alguna pista Gracias Última edición por marto fecha: 27-05-2004 a las 13:20:58. |
|
#7
|
|||
|
|||
|
Guau! He ido a desayunar, no me esperaba que respondiérais tan rápido, muchísimas gracias. Respondo a Marto, diciendo que no se me había ocurrido esa forma de implemetar mi función, entre otras cosas porque desconocía el siginificado de Inherit;.
Voy a intentar hacer una traducción a Borland y a ver que pasa, No creo que tarde más de 15 minutos. Por cierto aun no se si lo que hago es un VCL o un template, por favor si puedes aclararmelo o direccionarme a alguna página te lo agradecería. |
|
#8
|
||||
|
||||
|
Cita:
Inconvenientes: Si quieres cambiar algo de ese código, vas a tener que hacerlo en todos los sitios donde dejaste el componente. Además, el código está "visible" en todos lados y puede ser modificado involuntariamente. No nos olvidemos del estilo, es mucho más cómodo que el código no se vea y trabajemos de contra una "caja negra". Para evitar todos esos inconvenientes, se crea un componente nuevo, es decir una nueva clase. Si no me quivoco esto es lo que intentas y tambien a lo que te refieres por "crear un VCL", si no es así corrígeme ![]() Ah! por cierto, por favor encierra tu código entre tags "code"..."/code" para que se vea bien... ¿de verdad crees que muchos se van a poner a intentar un código de tantas líneas que no está siquiera indentado?
__________________
E pur si muove Última edición por marto fecha: 27-05-2004 a las 13:10:07. |
|
#9
|
|||
|
|||
|
Vale Marto:
Muchas gracias ya veo la diferencia, y sí, tienes razón es precisamente lo que quiero hacer. Por lo de mi código, pido perdón os aseguro que está indentado, que yo soy muy ordenado con el código que escribo, pero es la primera vez que pego código en este foro y no se hacer lo de los tags que me dices. Bueno estoy probando lo del inherited pero no me sale, me da una serie de errores precisamente en esa isntrucción. A mi me gusta investigar un poco por mi cuenta antes de pedir ayuda así que voy a intentarlo un rato más y si no me sale postearé de nuevo. Otra vez muchas gracias me estais siendo de mucha ayuda! " asd" |
|
#10
|
||||
|
||||
|
Cita:
__________________
E pur si muove |
|
#11
|
|||
|
|||
|
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
}
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:
Código:
if (OnSelectionChange==NULL) OnSelectrionChange=SelectrionChange; 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 |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
|