Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-04-2013
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
He visto un molesto efecto cuando las ventanas hijas tienen borde y Caption, son mas de una y movemos la ventana padre. Se trata de un cambio rápido se foco de una a otra. La solución es sencilla y basta con añadir SWP_NOACTIVATE y SWP_NOZORDER en SetWindowPos en el procedimiento TForm1.WMMoving:

Código Delphi [-]
SetWindowPos(Handle, HWND_TOPMOST, Message.DragRect.Left + Left - self.Left,
                                         Message.DragRect.Top + Top - self.Top,
                                         0, 0, SWP_NOSIZE or SWP_NOACTIVATE or SWP_NOZORDER);


Saludos.

Última edición por escafandra fecha: 05-04-2013 a las 20:41:43.
Responder Con Cita
  #2  
Antiguo 06-04-2013
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 20
cesarsoftware Va por buen camino
Hola escafandra, he probado tu codigo (delphi 2010 y windows 7 64) y no mueve las hijas por que no detecta bien el nombre de la clase en
Código Delphi [-]
    if Application.Components[i].ClassName <> 'TForm2' then continue;
Solo ve las clases THintWindows y TForm1
Si lo comprueba con "if Application.Components[i].Unitname" solo ve Controls y Unit1.
Es como si para la aplicacion no tuviera los formularios creados en tiempo de ejecucion
En Application.ComponentCount siempre tiene le valor 2, aunque cree 10 ventanas "hijas"

¿Sera algo del compilador o se puede comprobar de otra manera?

Saludos.
__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.
Responder Con Cita
  #3  
Antiguo 06-04-2013
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Debes eliminar Appliation, puesto que el owner de los formularios TForm2 es TForm1:
Código Delphi [-]
if Components[i].ClassName <> 'TForm2' then continue;
Tal como el código que expongo aquí.


El código es un boceto y puede irse mejorando según las necesidades.

Vuelvo a subir el código completo por si las moscas...


Saludos.

Última edición por escafandra fecha: 09-03-2020 a las 08:00:24.
Responder Con Cita
  #4  
Antiguo 06-04-2013
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 20
cesarsoftware Va por buen camino
Ahora si

Probare tu codigo en mi aplicacion y te cuento si es mejor (que seguro que si)

Thanks.

PD: Esta funcion hace que cuando pulse el raton en la ventana (no en el caption) mande el mensaje de mover, veo que ReleaseCapture deja al cursor hacer lo que estaba haciendo, pero.. porque se manda Perform(VM_SYSCOMMAND, $F012, 0); y que valor es $F012.

Código Delphi [-]
procedure TForm2.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then
  begin
    ReleaseCapture;
    Perform(WM_SYSCOMMAND, $F012, 0);
  end;
end;

Un saludo
__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.

Última edición por cesarsoftware fecha: 06-04-2013 a las 21:13:57.
Responder Con Cita
  #5  
Antiguo 06-04-2013
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Se trata de enviar un mensaje WM_SYSCOMMAND con el parámetro wParam SC_MOVE (F010h) or 2. Conseguimos el efecto de mover la ventana sin pinchar en la barra del caption.


Saludos.
Responder Con Cita
  #6  
Antiguo 07-04-2013
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 20
cesarsoftware Va por buen camino
Gracias por la aclaracion

__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.
Responder Con Cita
  #7  
Antiguo 07-04-2013
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 20
cesarsoftware Va por buen camino
Con tu codigo en el formulario principal, el movimiento de las ventanas hijas es mucho mas fino, sigue sin funcionar en server 2003, pero no me importa demasiado (ahora en vez de dejar las ventanas hijas donde estan las mueve arriba y a la izquerda a toda velocidad).
Código Delphi [-]
procedure WMMoving(var Message: TWMMOVING); message WM_MOVING;

procedure TFormMain.WMMoving(var Message: TWMMOVING);
var
  i: integer;
begin
  for i := 0 to ComponentCount - 1 do
  begin
    if Components[i].ClassName <> 'TForm' then
      continue; // Si los hijos de TFormMain no son TFORM
    with Components[i] as TForm do
      SetWindowPos(Handle, HWND_TOPMOST,
                   Message.DragRect.Left + Left - self.Left,
                   Message.DragRect.Top + Top - self.Top,
                   0, 0, SWP_NOSIZE or SWP_NOACTIVATE or SWP_NOZORDER);
  end;
end;

Con mi codigo se ve (al ojo) el desplazamiento de las ventanas hijas sobre el formulario principal.
Código Delphi [-]
    procedure WMWindowPosChanging(var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;

procedure TFormMain.WMWindowPosChanging(var Message: TWMWindowPosChanging);
var
  i, t: word;
begin
  // Mover objetos DCx junto con la ventana principal
  t := Length(DCx);
  if t = 0 then
    Exit;
  for i := 0 to t - 1 do
  begin
    if DCx[i] = nil then
      Continue;
    DCx[i].Forma.Top := Self.Top + PxArriba + DCx[i].Top;
    DCx[i].Forma.Left := Self.Left + PxBorde + DCx[i].Left;
  end;
  inherited;
end;

Lo que no he sabido hacer es como implementar
Código Delphi [-]
procedure WMMoving(var Message: TWMMOVING); message WM_MOVING;
en las ventanas hijas por que se crean "on the fly y sin forma", pero es que ademas como controlo las pulsaciones del raton entonces aprovecho para mover las ventanas hijas.
Código Delphi [-]
  Forma := TForm.CreateNew(FormularioPadre, 0);
  Forma.Position := poDesigned;
  Forma.BorderStyle := bsNone;
  Forma.Left := FormularioPadre.Left + PxBorde + Left;
  Forma.Top := FormularioPadre.Top + PxArriba + Top;
  Forma.Color := clHotLight;
  Forma.Visible := Visible;
  Forma.AlphaBlend := True;
  Forma.AlphaBlendValue := Opacidad;
  Forma.ShowHint := True;
  Forma.Hint := 'Left-Click y arrastre para mover';
  Forma.OnMouseDown := LedOnMouseDown;
  Forma.OnMouseMove := LedOnMouseMove;
  Forma.OnMouseUp := LedOnMouseUp;

asi que sigo usando las que me van bien
Código Delphi [-]
procedure TcapturadorDCx.LedOnMouseDown(Sender: TObject; Button: TMouseButton;
                                        Shift: TShiftState; X, Y: Integer);
begin
  // Capturar posicion inicial del ratón al comenzar a mover
  oldLeft := X;
  oldTop := Y;
  // Solo si es Shape LedOn
  if Sender is TForm then
    Exit;
  // Cambiar estado a icono o detalle
  if Button = mbRight then
  begin
    if Icono = True then
      SetIcono(False)
    else
      SetIcono(True);
    Exit;
  end;
  // comprobar si ha pulsado doble-click
  if ssDouble in Shift = False then
    Exit;
  // Encender o Apagar el capturador
  if DCx = nil then
    ActivaDCx // si no ha sido activado
  else
    if DCx.abierto = True then
      DesactivaDCx
    else
      if (DCx.conectando = False) and (Conectando = False) then
        ActivaDCx; // si las tarea DCx y el objeto TcapturadorDCx estan parados
end;

procedure TcapturadorDCx.LedOnMouseMove(Sender: TObject; Shift: TShiftState;
                                        X, Y: Integer);
var
  nX, nY, nLeft, nTop: integer;
begin
  if ssLeft in Shift = False then
    Exit;
  // Mover la posicion del objeto
  if X < oldLeft then
  begin
    nX := oldLeft - X;
    nLeft := Forma.Left - nX;
  end
  else
  begin
    nX := X - oldLeft;
    nLeft := Forma.Left + nX;
  end;
  if Y < oldTop then
  begin
    nY := oldTop - Y;
    nTop := Forma.Top - nY;
  end
  else
  begin
    nY := Y - oldTop;
    nTop := Forma.Top + nY;
  end;
  // Controlar los limites
  // Izquierda
  if nLeft < (FormularioPadre.Left + PxBorde) then
    nLeft := FormularioPadre.Left + PxBorde;
  // Derecha
  if (nLeft + Forma.Width) > (FormularioPadre.Left + FormularioPadre.Width - PxBorde) then
    nLeft := (FormularioPadre.Left + FormularioPadre.Width) - Forma.Width - PxBorde;
  // Arriba
  if nTop < (FormularioPadre.Top + PxArriba) then
    nTop := FormularioPadre.Top + PxArriba;
  // Abajo
  if (nTop + Forma.Height) > (FormularioPadre.Top + FormularioPadre.Height - PxAbajo) then
    nTop := (FormularioPadre.Top + FormularioPadre.Height) - Forma.Height - PxAbajo;
  // reposicionar objecto
  Forma.Left := nLeft;
  Forma.Top := nTop;
end;

procedure TcapturadorDCx.LedOnMouseUp(Sender: TObject; Button: TMouseButton;
                                      Shift: TShiftState; X, Y: Integer);
begin
  Left := Forma.Left - (FormularioPadre.Left + PxBorde);
  Top := Forma.Top - (FormularioPadre.Top + PxArriba);
  Movido(Sender);
end;

Por tanto, de momento, me quedo con el tuyo en el formulario padre y con el mio en el formulario hijo en tiempo de ejecucion.

__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Crear un form fsMDIForm y varios forms hijos citlalliDgp Varios 11 07-12-2007 15:13:31
¿Quien es mi Form Padre? gabrio OOP 4 16-10-2007 20:33:06
Nodo padre sin hijos en TTreeView jorgesl OOP 3 10-04-2006 20:24:11
Formulario padre con hijos oscarsanta Conexión con bases de datos 2 31-01-2006 13:17:13
como puedo poner form hijos ronimaxh Varios 5 22-10-2003 22:55:23


La franja horaria es GMT +2. Ahora son las 02:38:08.


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