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

Registrado: 11 Abr 2007Mensajes: 61
|
Publicado: Vie 24 Oct, 2008 5:50 pm Asunto: Mover varios shapes a la vez.¡AYUDA! |
|
|
Lo que intento hacer es mover Shapes por la ventana.
En un principio puedo crear varios shapes con diferentes tamaños sin problema.
Después a la hora de moverlos, consigo moverlos uno a uno por toda la pantalla.
Mi problema viene cuando intento mover varios a la vez.
Para ello, al tener la tecla control apretada y hacer mousedown sobre los diferentes shapes, estos cambian su borde de color, así simulo que los voy seleccionando.
Pero una vez tengo algunos seleccionados, es decir con el borde resaltado, ¿como puedo hacer para mover todos los que he seleccionado a la vez?
¿Alguna idea?
| Cita: |
void __fastcall TForm1::MouseMove1(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if (Shift.Contains(ssLeft))
{
((TShape*)(Sender))->Left = ((TShape*)(Sender))->Left - (PosX - X);
((TShape*)(Sender))->Top = ((TShape*)(Sender))->Top - (PosY - Y);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MouseDown1(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
PosX = X;
PosY = Y;
if (Shift.Contains(ssLeft) && Controlpress==true)//si está la tecla control apretada, cambio el borde de color
{
if(((TShape*)(Sender))->Pen->Color==clBlack && ((TShape*)(Sender))->Pen->Width==3)
{
((TShape*)(Sender))->Pen->Color=clWhite;
((TShape*)(Sender))->Pen->Width=2;
}
else
{
((TShape*)(Sender))->Pen->Color=clBlack;
((TShape*)(Sender))->Pen->Width=3;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
alto=ValueListEditor1->Cells[1][1].ToInt();//aqui le doy al shape valores de alto y ancho
ancho=ValueListEditor1->Cells[1][2].ToInt();
if(alto<1 || ancho<1>Parent=Form1;
Shape[i]->Name= nombre+IntToStr(i+1);
Shape[i]->Shape=stRectangle;
Shape[i]->Pen->Color=clWhite;
Shape[i]->Pen->Mode=pmMaskPenNot;
Shape[i]->Pen->Style=pmXor;
Shape[i]->Pen->Width=2;
Shape[i]->Brush->Color=clWhite;
Shape[i]->Brush->Style=bsSolid;
Shape[i]->Width=ancho;
Shape[i]->Height=alto;
Shape[i]->Top=64;
Shape[i]->Left=8;
Shape[i]->Tag=i-1;//les doy un numero a cada uno para diferenciarlos
Shape[i]->Cursor=crHandPoint;
Shape[i]->OnMouseDown = MouseDown1;
Shape[i]->OnMouseMove = MouseMove1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if (Key == VK_CONTROL)
{
Controlpress=true; //para controlar si la tecla control está presionada
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if (Key == VK_CONTROL)
{
Controlpress=false;//para controlar si la tecla control está presionada
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if (Shift.Contains(ssLeft) && Controlpress==false)//esto es para que no aparezca ninguno shape seleccionado si hago mousedown soble el form
{
int x=i;
while(x>0)
{
Shape[x]->Pen->Color=clWhite;
Shape[x]->Pen->Width=2;
x--;
}
}
}
|
Lo que he probado es crear una estructura donde está la posición "PosX" e "PosY" y además el Tag que identifica a cada Shape, y cada vez que hago un mousedown con la tecla control apretada, añado un elemento a la estructura con estos datos. Ahora lo que no se, es como utilizar estos datos cuando una vez seleccionados los shapes queridos, quiero moverlos.
En fin si alguien puede ayudarme...
Un saludo |
|
| Volver arriba |
|
 |
Isa1976 Lt Cmdr


Registrado: 23 Nov 2005Mensajes: 104
|
Publicado: Vie 24 Oct, 2008 7:57 pm Asunto: |
|
|
Hola,
Esto te tiene que funcionar (pero seguro que se puede mejorar):
Al seleccionar uno o varios Shapes les pones le Tag = 1, y al deseleccionar se lo pones a 0.
puedes moverlos todos de la siguiente manera:
en el mousemove: recorres con un for todos lo elementos
for(int n = 0; n <Form1>ControlCount; ++n)
, detectando que si el Tag es 1 ó 0. Si es uno es que esta seleccionado y puedes moverlo a las nuevas X e Y.
| Código: | void __fastcall TForm1::MouseMove1(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if (Shift.Contains(ssLeft))
{
for(int n = 0; n <Form1>ControlCount; ++n)
{
TControl *Control = dynamic_cast<TControl>(Form1->Controls[n]);
if (Control->Tag)
{
Control->Left = Control->Left - (PosX - X);
Control->Top = Control->Top - (PosY - Y);
}
}
}
} |
Un saludo. |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Dom 26 Oct, 2008 10:59 pm Asunto: |
|
|
Yo haría lo siguiente:
Crearía un array de shapes (TShape** AShapes) de tamaño igual al número de shapes seleccionado. Puedes hacerlo dinámico, añadiendo un shape a cada selección con el mouse (como habías pensado hacer con tu estructura) o si conoces el número total de shapes y es fijo, pues dimensionado al número máximo de shapes (por comodidad).
En fin con un array de shapes seleccionados, el movimiento es tan sencillo como con un sólo shape, sólo que en un bucle desde el 0 al nShapes.
Saludos. |
|
| Volver arriba |
|
 |
hetorsc Lt JG

Registrado: 11 Abr 2007Mensajes: 61
|
Publicado: Lun 27 Oct, 2008 9:48 am Asunto: |
|
|
Bueno, ya lo tengo, me funciona muy bien. Gracias a Isa1976 y a escafandra por responder a mis dudas, al final he hecho algo parecido a lo que ha explicado Isa1976.
Muchas gracias y un saludo |
|
| 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.
|