FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
No funciona OnChange cuando uso ActvePageIndex
Hola Amigos !!!!!
En un TPageControl cuando el usuario cambia de pestañas se activa el evento OnChange que realiza una acción determinada. El problema es que cuando uso la propiedad ActivePageIndex el evento OnChange no se activa. Estuve buscando un poco y encontré este código que puede llegar a servir, pero.... no lo entiendo, me sería muy útil que estuviera en C++ Código:
type THackPageControl = Class(TPageControl) ; procedure SetAsActivePage(tabSheet : TTabSheet) ; begin if tabSheet.PageControl.ActivePage <> tabSheet then begin If THackPageControl(tabSheet.PageControl).CanChange then begin tabSheet.PageControl.ActivePage := tabSheet; THackPageControl(tabSheet.PageControl).Change; end else Abort; end; end; |
#2
|
||||
|
||||
Te sugiero que no uses el evento OnChange, sino el evento OnChanging, que se ejecuta inmediatamente antes del que usas; con ésto, te aseguro que tendrás el control del componente tal como lo requieres.
__________________
Felipe Eduardo Ortiz López. Delphi programmers does it recursively... "Un programador, es un creador de universos en donde sólo él es responsable. Universos de complejidad prácticamente ilimitada que se puede crear en forma de programas de ordenador." - Joseph Weizenbaum. Témele a los profetas... y a aquellos que están listos para morir por "la verdad", ya que como regla general hacen morir a muchos otros con ellos, frecuentemente antes que ellos, y a veces en lugar de ellos. — Umberto Eco |
#3
|
||||
|
||||
Cita:
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#4
|
||||
|
||||
Cita:
El problema que tienes es que la asignación de la propiedad ActivePageIndex no activa el evento OnChange. Entonces, lo que puedes hacer es derivar una clase de TPageControl en la cual redefinas el método de asignación de dicha propiedad:
Para poder usar esta nueva funcionalidad, tendrías que instalar el nuevo componente y usarlo en lugar del TPageControl original. No obstante, esto puede ser engorroso, sobre todo si sólo lo vas a usar para un PageControl. Entonces, lo que puedes hacer es usar el truco de la clase sobrepuesta (*): en la unidad del formulario que tiene tu PageControl agregas esta definición, antes de la del propio formulario:
Como ves, lo que haces ahora es definir una clase con el mismo nombre que la original. Como la declaración aparece antes que la del PageControl1, el compilador usará la nueva clase. La implementación del método etActivePageIndex es como antes:
--------------------- (*) Lo que desconozco por completo, es si el truco de las clases sobrepuestas funciona también en C++ // Saludos |
#5
|
||||
|
||||
No se si te será más fácil traducir esto:
Se trata de definir una clase nueva que deriva de TPageControl y define esa propiedad con los 2 métodos. Si revisas cualquier clase creada en Builder se trata de hacerla igual. Y luego en lugar de llamar a:;
utilizas:
AÑADO: Veo que Román se ha adelantado. He de decir que yo tampoco se si este truco funcionará en Builder, pero es fácil que lo compruebas. Yo tampoco tengo conocimientos de Builder así que no te puedo ayudar a "traducirlo".
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. Última edición por Neftali [Germán.Estévez] fecha: 12-01-2012 a las 17:30:25. |
#6
|
||||
|
||||
Hola.
Otra opción puede ser: Código:
... int OldPageIndex = -1; void __fastcall TForm1::btnChangeIndexClick(TObject *Sender) { OldPageIndex = PageControl1->ActivePageIndex; // guardar índice actual PageControl1->ActivePageIndex = 1; // cambiar índice if(PageControl1->ActivePageIndex != OldPageIndex) // ¿ es diferente ? PageControl1Change(Sender); //si, llamar evento OnChange } void __fastcall TForm1::PageControl1Change(TObject *Sender) { ShowMessage("OnChange"); } ...
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... Última edición por ecfisa fecha: 12-01-2012 a las 20:45:24. Razón: corrección ortográfica |
#7
|
|||
|
|||
Gracias a todos por su tiempo, estuve con unos problemas por eso no me pude conectar a responder.
Creo que las soluciones que me brindaron pueden llegar a funcionar todas, pero tengo el inconveniente que no puedo traducirlas. Además no tengo tantos conocimientos por ejemplo, como para poder crear nuevas clases, perdón soy bastante novato. Por eso valoro muchísimo lo que hacen todos ustedes por los demás. Saludos y gracias. |
#8
|
||||
|
||||
No me había percatado de este tema hasta ahora. Voy a poner mi granito de arena.
En primer lugar y como solución sencilla sería llamar al evento OnChange cada vez que usemos la propiedad ActivePageIndex, de forma "manual". Tiene la ventaja de ser sencillo y comprenderse bien, pero no es automático: Código:
PageControl1->ActivePageIndex = 3; PageControl1Change(this); Código:
// Nueva definición de SetActivePageIndex de la clase TPageControl void __fastcall TPageControl::SetActivePageIndex(const int Value) { if (Value > -1 && Value < PageCount) ActivePage = Pages[Value]; else ActivePage = 0; if(OnChange) OnChange(this); // Lanzamos el Evento } // Asignación de ActivePageIndex void __fastcall TForm1::Button1Click(TObject *Sender) { PageControl1->ActivePageIndex = 1; } // Evento OnChange void __fastcall TForm1::PageControl1Change(TObject *Sender) { ShowMessage("Eureca"); } Saludos. |
#9
|
|||
|
|||
Solucionado
Estimados amigos, este código proporcionado por escafandra funcionó excelente.
Código:
void __fastcall TPageControl::SetActivePageIndex(const int Value) { if (Value > -1 && Value < PageCount) ActivePage = Pages[Value]; else ActivePage = 0; if(OnChange) OnChange(this); // Lanzamos el Evento } Quiero felicitar y agradecer nuevamente a todos por su gran ayuda !!!!! Saludos. |
#10
|
||||
|
||||
Estaba buscando por el foro, porque tengo el mismo problema que abrió este hilo. Este código de escafandra me parece estupendo por lo sencillo pero he estado mirando por Builder y no encuentro por ninguna parte ese método SetActivePageIndex. ¿Me podéis explicar como implementarlo?
|
#11
|
||||
|
||||
Cita:
comctrls.pas
Pero nada te impide que lo reescribas y lo compiles para que puedas cambiarle su funcionalidad. Saludos. |
#12
|
||||
|
||||
Gracias por la respuesta, pero si Builder y yo ya tenemos más de un desencuentro, no te quiero explicat con Delphi. El código que hay antes estápuesto en Builder; ¿bastaría con ponerlo tal cual y compilarlo o habría que hacer algo más?
|
#13
|
||||
|
||||
Cita:
Saludos |
#14
|
||||
|
||||
Ahí te subo un ejemplo. No lo dejaré mucho tiempo para no consumir mi espacio de archivos adjuntos.
Saludos. Última edición por escafandra fecha: 11-05-2018 a las 20:33:48. |
#15
|
||||
|
||||
Gracias escafandra. Ahora mismo lo veo. Ya puedes borrarlo si quieres.
|
#16
|
||||
|
||||
Cita:
|
#17
|
||||
|
||||
Cita:
Saludos. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
OnChange | elturu15 | Varios | 4 | 03-05-2011 17:51:54 |
Evento onChange en TImage | MAXIUM | Gráficos | 3 | 08-03-2010 03:02:11 |
evento onchange de un dbedit | ercrizeporta | Varios | 1 | 31-10-2006 14:09:38 |
Findfirst funciona cuando quiere | rfernandez | API de Windows | 3 | 17-03-2005 11:35:43 |
OnChange en TListBox | fedecm | Varios | 1 | 30-06-2004 17:24:32 |
|