Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Cual es el evento que se ejecuta al mover un formulario (https://www.clubdelphi.com/foros/showthread.php?t=90466)

MARX 16-06-2016 00:36:55

Cual es el evento que se ejecuta al mover un formulario
 
Hola a todos.
Quiero hacer una consulta que a lo mejor es un poco tonta pero a mi me está volviendo loco
Quiero saber cual es el evento que se ejecuta al mover un formulario. Lo que necesito es que cuando mueva el formulario, otro formulario siga al primero como si fuera parte de el.
Desde ya agradezco sus comentarios.

Saludos
Jorge

roman 16-06-2016 02:22:08

No es una pregunta tonta. Creo que Delphi no provee un evento como tal pero puedes interceptar el mensaje WM_SYSCOMMAND. En este hilo hay una forma de hacerlo aunque ahí el objetivo era impedir que se moviera el formulario.

LineComment Saludos

ecfisa 16-06-2016 02:52:37

Hola Jorge.

Podrías capturar el mensaje WM_MOVING, vg.:
.h
Código PHP:

...
class 
TForm1 : public TForm
{
__published:    // IDE-managed Components
 
private:    // User declarations
  
void virtual __fastcall WMMoving(TMessageMessage);
protected:
  
BEGIN_MESSAGE_MAP
    VCL_MESSAGE_HANDLER
(WM_MOVINGTMessageWMMoving);
  
END_MESSAGE_MAP(TForm);
public:        
// User declarations
  
__fastcall TForm1(TComponentOwner);
}; 

.cpp
Código PHP:

...
void __fastcall TForm1::WMMoving(TMessageMessage)
{
  if (
Message.Msg == WM_MOVING)
    
ShowMessage("Moviendo");
  
DefaultHandler(&Message);


O también el mensaje WM_SYSCOMMAND como te indicó roman:
.h
Código PHP:

...
class 
TForm1 : public TForm
{
__published:    // IDE-managed Components
private:    // User declarations
  
void virtual __fastcall WMSysCommand(TWMSysCommand &Message);
protected:
  
BEGIN_MESSAGE_MAP
  VCL_MESSAGE_HANDLER
(WM_SYSCOMMANDTWMSysCommandWMSysCommand)
  
END_MESSAGE_MAP(TForm)
public:        
// User declarations
  
__fastcall TForm1(TComponentOwner);
}; 

.cpp
Código PHP:

...
const 
SC_DRAGMOVE 0xF012;

void __fastcall TForm1::WMSysCommand(TWMSysCommand &Message)
{
 if (
Message.CmdType == SC_DRAGMOVE)
    
ShowMessage("Moviendo");
  
DefaultHandler(&Message);


Saludos :)

MARX 16-06-2016 04:02:57

Muchísimas gracias a los dos por las respuestas, son unos genios.
Estoy intentando ponerlo en practica. El primer método me tira varios errores, el segundo me anduvo pero con un problemita.
Solo ejecuta lo que está en el if cuando hago click en la barra para moverlo. Mientras estoy moviendo el formulario no ejecuta el bucle hasta que no vuelvo a hacer click en la barra de arriba.
¿Habrá alguna manera de que vaya actualizando los valores de Left y Top del formulario 2 a medida que vaya moviendo el formulario 1?

MARX 16-06-2016 04:11:50

[quote=ecfisa;506219]Hola Jorge.

Podrías capturar el mensaje WM_MOVING, vg.:
.h
Código PHP:

...
class 
TForm1 : public TForm
{
__published:    // IDE-managed Components
 
private:    // User declarations
  
void virtual __fastcall WMMoving(TMessageMessage);
protected:
  
BEGIN_MESSAGE_MAP
    VCL_MESSAGE_HANDLER
(WM_MOVINGTMessageWMMoving);
  
END_MESSAGE_MAP(TForm);
public:        
// User declarations
  
__fastcall TForm1(TComponentOwner);
}; 

.cpp
Código PHP:

...
void __fastcall TForm1::WMMoving(TMessageMessage)
{
  if (
Message.Msg == WM_MOVING)
    
ShowMessage("Moviendo");
  
DefaultHandler(&Message);


Ya encontré el problema. Gracias ecfisa hay un ";" de mas.
Anduvo perfecto y ya se mueven los dos formularios juntos.
Muchísimas gracias, esta es la tercera vez que me das la solución a lo que necesito.
Gracias a los dos por tomarse el tiempo para contestarme.
Voy a continuar con la programación y espero no tener que volver a molestarlos.

Hasta pronto :D

ecfisa 16-06-2016 04:34:22

Hola.

Otra opción mas:
.h
Código PHP:

class TForm1 : public TForm
{
__published:    // IDE-managed Components
  
void __fastcall FormClick(TObject *Sender);
private:    
// User declarations
  
void __fastcall WMNCHitTest(TMessageMsg);
protected:
  
BEGIN_MESSAGE_MAP
  MESSAGE_HANDLER
(WM_NCHITTESTTMessageWMNCHitTest)
  
END_MESSAGE_MAP(TForm)
public:        
// User declarations
  
__fastcall TForm1(TComponentOwner);
}; 

.cpp
Código PHP:

void __fastcall TForm1::WMNCHitTest(TMessage &Msg)
{
   
// mover el segundo form
   
Form2->Left Form1->Left Form1->Width;
   
Form2->Top  Form1->Top 20;
   
   if (
Msg.Result == HTCLIENT
     
Msg.Result HTCAPTION;
   
TForm::Dispatch(&Msg);


Saludos :)

MARX 16-06-2016 05:07:51

Muchas gracias.
Que diferencia tiene este ultimo con los otros?
En los otros uno muestra el mensaje cuando se hace click en la barra y el otro es cuando se mueve el formulario.
Este código cuando se ejecutaría?

ecfisa 16-06-2016 17:07:07

Hola Jorge.

Podes encontrar la descripción (y diferencias) en la referencia de Microsoft:
(*) SC_DRAGMOVE sólo funciona con descendientes de TWinControl. No funciona por ejemplo, con un TImage.

Saludos :)

Lepe 17-06-2016 11:33:54

Yo también miraría WM_WINDOWPOSCHANGING y WM_WINDOWPOSCHANGED quizás te sean de utilidad. Yo los he usado para adosar una ventana a la ventana que se está arrastrando, (Como la ventana de TeamViewer de contactos).


La franja horaria es GMT +2. Ahora son las 09:00:40.

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