 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
vizca321 Lt


Registrado: 06 May 2008Mensajes: 83Ubicación: Mexico
|
Publicado: Mar 01 Jul, 2025 8:16 am Asunto: Desplazamiento sincrónico de dos TScrollBox |
|
|
Buen día, saludos a todos se puede sincronizar el movimiento de la barra de desplazamiento vertical de dos TScrollBox tengo el código para hacerlo con la rueda del ratón pero si los muevo al con clic directamente se desincronizan
| Código: |
void __fastcall TFGantt::FormMouseWheel(TObject *Sender, TShiftState Shift, int WheelDelta,
TPoint &MousePos, bool &Handled)
{
TImage *IShape = (TImage*) FindComponent(seleccionShape);
if(IShape && ILienzo->Tag == 0){
String cons = IShape->Name;
cons = cons.SubString(7,cons.Length());
TTrackBar *TrBar = (TTrackBar*) FindComponent("TrBar"+cons);
if (WheelDelta > 0) {
TrBar->Position +=1;
}
else {
TrBar->Position -=1;
}
}
if(ILienzo->Tag == 1 && Shift.Contains(ssAlt)){
if(WheelDelta > 0){
ScrollBox1->HorzScrollBar->Position+=35;
}
else{
ScrollBox1->HorzScrollBar->Position-=35;
}
}
else if(ILienzo->Tag == 1){
if(WheelDelta > 0){
ScrollBox1->VertScrollBar->Position-=35;
ScrollBox2->VertScrollBar->Position-=35;
}
else{
ScrollBox1->VertScrollBar->Position+=35;
ScrollBox2->VertScrollBar->Position+=35;
}
}
ICabecera->Left = ScrollBox1->HorzScrollBar->Position * -1;
Handled = true; // Mark event as handled
}
//---------------------------------------------------------------------------
|
_________________ [code:1]//----------------Att Gabriel----------------
void Gracias(){
if (Respuesta == true){
Showmessage("Muchisimas Gracias!")
else
Showmessage("Ojala te sirva... ^_^ ");
}[/code:1] |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mar 12 Ago, 2025 8:03 pm Asunto: |
|
|
Hace un par de años, contesté una pregunta parecida para sincronizar Srolls de dos ListView. Se basó en control por subclassing. Ese hilo ha desaparecido del foro. supongo que tras recuperar algún Bakup
Te muestro algo parecido para lo que hoy preguntas.
He puesto en un formulario dos TScrollBox con la misma imagen, mayor que ellos. Hago un subclassing para ambos e interceptar el mensaje WM_VSCROLL y WM_HSCROLL. Lo siguiente es repetir en uno lo que ocurre en el otro.
Pongo el código completo incluido el archivo cabecera
Cabecera:
Defino un tipo de puntero a función de mensajes.
Dos TScrollBox, Dos TImagen
Las funciones de Subclassing, una para cada SrollBox
| Código: |
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
#include <jpeg.hpp>
typedef void __fastcall(__closure *PWndProc)(Messages::TMessage &Message);
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TScrollBox *ScrollBox1;
TScrollBox *ScrollBox2;
TImage *Image1;
TImage *Image2;
private:
PWndProc SB1WndProc;
PWndProc SB2WndProc;
void __fastcall SubClassSB1WndProc(TMessage& Message);
void __fastcall SubClassSB2WndProc(TMessage& Message);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
|
Código:
| Código: |
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
void __fastcall SetSubCass(TWinControl *WC, PWndProc newProc, PWndProc *oldProc)
{
*oldProc = WC->WindowProc;
WC->WindowProc = newProc;
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
SetSubCass(ScrollBox1, SubClassSB1WndProc, &SB1WndProc);
SetSubCass(ScrollBox2, SubClassSB2WndProc, &SB2WndProc);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SubClassSB1WndProc(TMessage& Message)
{
// Se tratan los mensages originales antes de interceptarlos
SB1WndProc(Message);
// Se modifica la rueda del mouse para convertirlo en Scroll
if(Message.Msg == WM_MOUSEWHEEL){
Message.Msg = WM_VSCROLL;
Message.WParamLo = SB_LINEUP;
ScrollBox1->VertScrollBar->Position -= (short)Message.WParamHi/10;
}
// Tratamos los mensajer de Scroll
if(Message.Msg == WM_VSCROLL){
if(Message.WParamLo == SB_LINEUP)
ScrollBox2->VertScrollBar->Position = ScrollBox1->VertScrollBar->Position;
else if(Message.WParamLo == SB_LINEDOWN)
ScrollBox2->VertScrollBar->Position = ScrollBox1->VertScrollBar->Position;
else if(Message.WParamLo == SB_THUMBTRACK){
ScrollBox1->VertScrollBar->Position = Message.WParamHi;
ScrollBox2->VertScrollBar->Position = Message.WParamHi;
}
}
else if(Message.Msg == WM_HSCROLL){
if(Message.WParamLo == SB_LINELEFT)
ScrollBox2->HorzScrollBar->Position = ScrollBox1->HorzScrollBar->Position;
else if(Message.WParamLo == SB_LINERIGHT)
ScrollBox2->HorzScrollBar->Position = ScrollBox1->HorzScrollBar->Position;
else if(Message.WParamLo == SB_THUMBTRACK){
ScrollBox1->HorzScrollBar->Position = Message.WParamHi;
ScrollBox2->HorzScrollBar->Position = Message.WParamHi;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SubClassSB2WndProc(TMessage& Message)
{
// Se tratan los mensages originales antes de interceptarlos
SB1WndProc(Message);
// Se modifica la rueda del mouse para convertirlo en Scroll
if(Message.Msg == WM_MOUSEWHEEL){
Message.Msg = WM_VSCROLL;
Message.WParamLo = SB_LINEUP;
ScrollBox2->VertScrollBar->Position -= (short)Message.WParamHi/10;
}
// Tratamos los mensajer de Scroll
if(Message.Msg == WM_VSCROLL){
if(Message.WParamLo == SB_LINEUP)
ScrollBox1->VertScrollBar->Position = ScrollBox2->VertScrollBar->Position;
else if(Message.WParamLo == SB_LINEDOWN)
ScrollBox1->VertScrollBar->Position = ScrollBox2->VertScrollBar->Position;
else if(Message.WParamLo == SB_THUMBTRACK){
ScrollBox1->VertScrollBar->Position = Message.WParamHi;
ScrollBox2->VertScrollBar->Position = Message.WParamHi;
}
}
else if(Message.Msg == WM_HSCROLL){
if(Message.WParamLo == SB_LINELEFT)
ScrollBox1->HorzScrollBar->Position = ScrollBox2->HorzScrollBar->Position;
else if(Message.WParamLo == SB_LINERIGHT)
ScrollBox1->HorzScrollBar->Position = ScrollBox2->HorzScrollBar->Position;
else if(Message.WParamLo == SB_THUMBTRACK){
ScrollBox1->HorzScrollBar->Position = Message.WParamHi;
ScrollBox2->HorzScrollBar->Position = Message.WParamHi;
}
}
}
|
Se consigue un movimiento suave de ambos ScrollBox en ambas direcciones y en tiempo real.
 |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 14 Ago, 2025 1:38 am Asunto: |
|
|
| escafandra escribió: | Hace un par de años, contesté una pregunta parecida para sincronizar Srolls de dos ListView. Se basó en control por subclassing. Ese hilo ha desaparecido del foro. supongo que tras recuperar algún Bakup
|
Hola escafandra, en algún momento se debió hacer algún traslado del foro, no le he preguntado a Roberto (R.Porcar), y veo que el foro se dividió en dos:
https://cppbuilder.es/foros/
y
https://foros.ryanstudios.com/
Antes de eso los dos dominios apuntaban al mismo lugar. En el primero veo que hay más hilos (por si encuentras ahí el hilo que mencionas), pero veo que el poco movimiento que hay el que aparentemente más gente conoce es el segundo. No he querido darle mucho la lata a Roberto ya que total no hay mucho movimiento y yo tampoco entro mucho y creo que el hace mucho que dejó de usar C++Builder, aun así ha mantenido esto durante más de 25 años..
¿Quizás sea este hilo?:
[Sincronización de scroll vertical de dos TListViews]
https://cppbuilder.es/foros/viewtopic.php?t=15170 |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Jue 14 Ago, 2025 9:34 am Asunto: |
|
|
Efectivamente ese es el hilo. Solo me acordaba del tema. Yo conocía los dos dominios y que https://cppbuilder.es/foros/ comenzó a fallar.
Es una lástima que se haya dividido. Aunque no se tenga mucha actividad hay mucha información de consulta útil.
Gracias _Leo por el interés. |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|