Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-08-2008
santus santus is offline
Miembro
 
Registrado: ene 2006
Posts: 130
Poder: 19
santus Va por buen camino
Mover dos formularios al mismo tiempo

Hola amigos. Tengo que hacer una aplicacion simple. El tema complejo es que tengo que lograr mover dos formularios al mismo tiempo en tiempo de ejecución.

Los formularios son sismples. Nomas tienen unas cosillas que mostrar pero nada mas. Tengo un formulario principal, y tengo otro formulario al lado, que se abre para mostrar información al hacer click en un botón. Este se muestra al lado del principal.

Ya logré mover el fomulario desde cada de las ventanas. Arrastrando el mouse sobre cada una, me las mueve en forma independiente. Para ello usé esta funcion:

Código Delphi [-]

procedure TfMain.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    ReleaseCapture;    
    Perform(WM_SYSCOMMAND, SC_DRAGMOVE, Integer(PointToSmallPoint(Point(X,Y))));
end;

Hasta aquí todo bien. Cada una de las ventanas se mueve en forma independiente. Ahora bien. Estoy intentantando que se muevan los dos al mismo tiempo. Osea, cuando arrastro el mouse sobre uno, se mueva tambien el otro.

Se me ocurrió sin muchos resultados, enviar un mensaje personalizado a cada formulario para que se muevan todos juntos. Algo asi como:

Código Delphi [-]
CONST
  WM_MOVERFORM = WM_USER + 0;
  SC_DRAGMOVE = $F012;

procedure TfMain.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 SendMessage(Handle,WM_MOVERFORM,SC_DRAGMOVE,Integer(PointToSmallPoint(Point(X,Y))));
end;

procedure OnMoverVentana(var Msg: TMessage); message WM_MOVERFORM;

procedure TfMain.OnMoverVentana(var Msg: TMessage);
begin
    ReleaseCapture;
    Perform(WM_SYSCOMMAND, Msg.WParam,Msg.LParam);
end;

Para el segundo formulario hago lo mismo. Le envio el handle del otro fomulario así:

Código Delphi [-]
procedure TfMain.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    SendMessage(Handle,WM_MOVERFORM,SC_DRAGMOVE,   Integer(PointToSmallPoint(Point(X,Y))));
    SendMessage(form2.handle,WM_MOVERFORM,SC_DRAGMOVE,   Integer(PointToSmallPoint(Point(X,Y))));

end;

Y así. El problema que luego de enviar el primer mensaje la aplicación no envia el próximo mensaje hasta que no termino de soltar el mouse, osea que se mueve sólo el que primero recibe el mensaje.

Estoy perdido. Buscando aqui y en internet no encotré ni siquiera una idea de como seguir. Si alguien tiene alguna idea, siempre va a ser bienvenida porque a esta altura, ya ni se si esta implementación es correcta.

Bien, gracias a todo, y espero no haberlos aburrido con este laaarrggooo post. Gracias.
__________________
"El ordenador nació para resolver problemas que antes no existían." Bill Gates.
Responder Con Cita
  #2  
Antiguo 01-08-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Hola, creo que deberias seguir enviando el mensaje mediante onmousemove. no he revisado tu codigo, pero la idea seria seguir actualizando la posicion de la form destino mientras el mouse esta pulsado
Responder Con Cita
  #3  
Antiguo 01-08-2008
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.271
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
En la sección de ejemplos de mi página, hay uno tiitulado "Simular barras flotantes en torno al formulario" y creo que es más o menos lo que necesitas. Al mover un formulario arrastra otro "pegado" a él.
Se utiliza el mensaje WM_WINDOWPOSCHANGING.

Está con el código fuente, así que puedes descargarlo y echarle un vistazo.
__________________
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.
Responder Con Cita
  #4  
Antiguo 01-08-2008
santus santus is offline
Miembro
 
Registrado: ene 2006
Posts: 130
Poder: 19
santus Va por buen camino
excelente!!!

Gracias Neftali.
Me funcionó de diez el ejemplo de tu página.

Lo unico que hice fue agregarle el mensaje al formulario principal, y que se acomoden las posiciones del segundo. Por si a alguien le interesa, quedaría algo asi:

Código Delphi [-]
unit uMain;
...
private
   procedure WMWindowPosChanging(var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
...
implementation

...
// evento OnMouseDown del formulario.
// esto sirve para mover el formulario de tipo BorderStyle = bsNone.
procedure TfMain.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
const
  SC_DRAGMOVE = $F012;
begin
  ReleaseCapture;
  Perform(WM_SYSCOMMAND, SC_DRAGMOVE, Integer(PointToSmallPoint(Point(X,Y))));
end;


// actualiza la posición del segundo form cuando lo movemos.
procedure TfMain.WMWindowPosChanging(var Message: TWMWindowPosChanging);
begin
  inherited;
  if (Assigned(form2)) and (form2.Visible) then
    form2.acomodarVentana;
end;
...

Y en el segundo formulario:

Código Delphi [-]
unit unit2;
...
public
    procedure acomodarVentana;
...
implementation
...

// elegimos a donde va el form. En mi caso, que lo muestre a la izq.
procedure TForm2.acomodarVentana;
begin
  Self.Top := fMain.Top;
  Self.Left := fMain.Left - Self.Width;
end;
...

Si al moverlo se ve el efecto del parpadeo en el formulario, simplemente agregar al evento OnCreate del form2:

Código Delphi [-]
   Self.DoubleBuffered := true;

En fin. Gracias Neftali por tu ayuda. Me ha venido muy bien, ya que no sabía como seguir. Hasta llegue a pensar que simplemente no se podia hacer esto. Y gracias tambien a todos los que se tomaron el trabajo de intentar entenderme!!

Saludos.
__________________
"El ordenador nació para resolver problemas que antes no existían." Bill Gates.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Dos formularios al mismo tiempo nostrajara Gráficos 2 31-10-2007 17:13:09
mover imagen por un tiempo determinado leodelca23 Varios 1 28-03-2007 07:54:13
Dos Formularios al mismo tiempo lucasarts_18 Varios 5 19-04-2005 03:46:05
mover componentes en tiempo de ejecución Dantael OOP 3 06-02-2005 12:29:46
Cerrar dos formularios creados dinamicamente (al mismo tiempo) ctronx Varios 7 02-09-2004 00:19:04


La franja horaria es GMT +2. Ahora son las 21:28:11.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi