![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
¿existe un evento OnScrollBoxPositionScrollBarChange?
Explico, tengo un TImage dentro de un TScrollBox y la imagen es mas grande que es scrollbox. Lo que quiero es capturar el evento que se produzca al mover uno de los scrolls para hacer algo cuando cambie la posicion de la imagen. Otra cosa ¿Como se hace para que, al mover el scroll se vea en vivo la imagen moviendose sin tener que esperar a que suelte el boton izquierdo del raton?
|
|
#2
|
||||
|
||||
|
Coloca la propiedad Tracking de ambas barras a true.
Saludos. |
|
#3
|
||||
|
||||
|
supongo que eso que me indicas es para que se vea el desplazamiento en vivo ¿No? Para el tema de capturar los eventos de las scrolls he estado buscando mucho y hablan de hacerlo de dos maneras. Una es haciendo subclassing de un tscrollbox y añadiendole esos eventos y gestionar en ellos lo que quiera. La otra manera que he visto es usando el ScrollBox1->WndProc() para gestionar el mensaje ahi. ¿Que modo es mejor? ¿Y por que es mejor uno que otro?
|
|
#4
|
||||
|
||||
|
Para conseguir lo que buscas, tienes dos opciones: realizas un subclassing sobre el objeto dado o derivas tu propia clase.
En windows existe una función de tratamiento de mensajes para cada ventana, si cambias la función, estas haciendo un subclassing. Derivar tu clase TscrollBox puede ser útil si vas a usarla más veces, aprovechando el código. En la VCL, la función WndProc es la de tratamiento de mensajes del control. Tienes herramientas para cambiarla (subclassing) o reescribirla (clases derivadas) Aquí tienes un ejemplo de subclassing en delphi Saludos. Última edición por escafandra fecha: 26-09-2014 a las 12:40:56. |
|
#5
|
||||
|
||||
|
Bueno, lo he conseguido hacer de las dos maneras. Os pongo los dos proyectos para el que quiera ver el codigo y demás:
1ª opcion: https://mega.co.nz/#!A0MwQCBL!OyZZSR...1IxfB_HocNGV9o 2ª opcion: https://mega.co.nz/#!p0FwyAgZ!8o6hRi...IHAQCjs-4q7Zmc Las dos van genial aunque creo que es mejor opcion la que creo una subclase de ScrollBox donde le añado los eventos aunque no me entero de casi nada lo que se hace ya que ha sido practicamente un copy/paste de otro sitio con algunas modificaciones que le hice. Lo peor de este metodo es que tengo que crear e inicializar el componente en ejecucion mediante codigo ya que no puedo insertarlo como se haria con un componente TScrollBox normal. Si alguien lo ve y me sabe decir como convertirlo en un componente visual para poder añadirlo como el original se lo agradecería. |
|
#6
|
||||
|
||||
|
Bueno amigos, he conseguido crear un componente al que he llamado ScrollBoxWithScrollsEvents y funciona perfectamente. Si alguien quiere examinarlo por si ve algo mal pues me haria un favor.
Aqui el enlace al componente: https://mega.co.nz/#!9pUjwCoK!R1104L...3W1txWTpWql7RE Espero que le pueda ayudar a otros. A mi si me ha ayudado a aprender como crear un componente descendiente de otro y la verdad es que es muy util. ![]() |
|
#7
|
||||
|
||||
|
Estaba preparando un ejemplo, pero veo que ya resolviste el problema. Aún así lo dejo.
Fíjate en este código basado en el tuyo. Es un componente visual que debes instalar: Menu->Component->Intall Component Código:
//---------------------------------------------------------------------------
#ifndef NewScrollBoxH
#define NewScrollBoxH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class PACKAGE TNewScrollBox : public TScrollBox
{
public:
__fastcall TNewScrollBox(TComponent* Owner);
private:
TNotifyEvent FOnVerticalScroll;
TNotifyEvent FOnHorizontalScroll;
private:
void __fastcall WMHScroll(TMessage& Msg);
void __fastcall WMVScroll(TMessage& Msg);
__published:
__property TNotifyEvent OnVerticalScroll =
{read=FOnVerticalScroll,
write=FOnVerticalScroll};
__property TNotifyEvent OnHorizontalScroll =
{read=FOnHorizontalScroll,
write=FOnHorizontalScroll};
public:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_HSCROLL, TMessage, WMHScroll)
MESSAGE_HANDLER(WM_VSCROLL, TMessage, WMVScroll)
END_MESSAGE_MAP(TScrollBox)
};
//---------------------------------------------------------------------------
#endif
Código:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "NewScrollBox.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//
static inline void ValidCtrCheck(TNewScrollBox *)
{
new TNewScrollBox(NULL);
}
//---------------------------------------------------------------------------
__fastcall TNewScrollBox::TNewScrollBox(TComponent* Owner)
: TScrollBox(Owner)
{
}
void __fastcall TNewScrollBox::WMHScroll(TMessage& Msg)
{
if (FOnHorizontalScroll != NULL)
{
FOnHorizontalScroll(this);
}
TScrollBox::Dispatch(&Msg);
}
void __fastcall TNewScrollBox::WMVScroll(TMessage& Msg)
{
if (FOnVerticalScroll != NULL)
{
FOnVerticalScroll(this);
}
TScrollBox::Dispatch(&Msg);
}
//---------------------------------------------------------------------------
namespace Newscrollbox
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TNewScrollBox)};
RegisterComponents("Samples", classes, 0);
}
}
//---------------------------------------------------------------------------
Saludos. Última edición por escafandra fecha: 03-10-2014 a las 11:55:41. |
|
#8
|
||||
|
||||
|
Pues como yo lo hice jejeje. Me costó porque nunca habia hecho algo asi pero es muy util saberlo hacer.
|
![]() |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| ¿Existe algún error en FireMonkey en el evento OnClosePopup de un ComboBox? | RedVenom | FireMonkey | 0 | 10-02-2014 18:56:43 |
| Frames. ¿Existe un evento similar a onActivate? | adebonis | Varios | 19 | 21-11-2008 13:26:50 |
| Comprobar en evento OnExit si valor de campo ya existe | JMGR | Conexión con bases de datos | 9 | 18-05-2008 03:42:31 |
| Llamar evento desde otro evento | nachito_tuc | OOP | 1 | 23-08-2006 21:37:43 |
| Existe ? | Descendents | Varios | 1 | 20-10-2003 18:04:25 |
|