Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-10-2005
juliopag1 juliopag1 is offline
Miembro
 
Registrado: abr 2004
Posts: 42
Poder: 0
juliopag1 Va por buen camino
Como fijar una ventana?

Quiero saber como fijar una ventana, osea que no la puedan mover.

Hay alguna opcion?

Thank's
Responder Con Cita
  #2  
Antiguo 06-10-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Supongo que por ventana quieres referirte a un formulario ("TForm"). Se me ha ocurrido una barbaridad, pero, en fin, allá va... Hemos de capturar el mensaje "WM_MOVE" en el formulario en cuestión; al crear el formulario guardaremos las propiedades "Top" y "Left" en sendas variables de tipo "integer". La declaración del formulario quedaría tal que así:

Código Delphi [-]
    type
      TfrmPrincipal = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        FTop, FLeft: integer;
        procedure WM_MOVE(var Msg: TMessage); message WM_MOVE;
      end;
El evento "OnCreate" del formulario de este modo:

Código Delphi [-]
    procedure TfrmPrincipal.FormCreate(Sender: TObject);
    begin
      FTop := Top;
      FLeft := Left;
    end;
Y el procedimiento "WM_MOVE" de este otro:

Código Delphi [-]
    procedure TfrmPrincipal.WM_MOVE(var Msg: TMessage);
    begin
      if (FTop <> 0) then
      begin
        Top := FTop;
        Left := FLeft;
      end;
    end;
Comprobamos antes que "FTop" no sea cero, pues el procedimiento se ejecuta incluso antes del evento "OnCreate" (a lo que parece) de tal modo que de no hacerlo así el formulario se situaría en la esquina superior izquierda de la pantalla y no habría luego quien lo moviera de ahí.

Ahora, por favor, decidme que me calme y que me tranquilize, porque hay alguna propiedad, algún método, en fin, alguna forma mucho más elegante, aparente, práctica y efectiva de hacer lo que se trata de llevar a cabo. ¿Eh?
Archivos Adjuntos
Tipo de Archivo: zip ejemplo.zip (1,3 KB, 30 visitas)
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 06-10-2005 a las 19:04:24. Razón: Solucionar un error en el ejemplo adjunto.
Responder Con Cita
  #3  
Antiguo 06-10-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Hola,

El problema con la opción que comenta dec es que el efecto no es muy bueno: si la opción DragFullWindows (en propiedades de la pantalla) está activada, se nota un redibujado conforme se intenta mover la ventana. Si está desactivada entonces el usuario puede ver cómo se mueve la silueta de la ventana mientras la arrastra aun que al final se quede donde estaba.

Recomiendo revisar el hilo Como hacer que un usuario no mueva la form?

// Saludos
Responder Con Cita
  #4  
Antiguo 06-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Lo mismo pero de otra forma.
Código Delphi [-]
  private
    { Private declarations }
    //
    procedure noMove(var Msg:Twmwindowposchanging);message wm_windowposchanging;
end;


procedure TForm1.noMove(var Msg: Twmwindowposchanging);
begin

  Msg.WindowPos.x := 100; // left
  Msg.WindowPos.y:= 200; // top
  Msg.WindowPos.cx:= 500; // ancho
  Msg.WindowPos.cy:= 600 // alto
end;

Cuando se cambie de posición, nosotros ponemos los valores

Saludos
Responder Con Cita
  #5  
Antiguo 06-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
En mi caso no ocurre, ya que antes de mover la ventana, es cuando le cambio los valores, así que no hay redibujado de pantalla.

En el ejemplo de Roman ¿hay que deshabilitar el maximizado? ... jamás quisiera empezar una contienda con roman.... bueno, tomando cervezas a lo mejor, pero en el resto de temas... paso


Edito: Retiro todo lo dicho, con este método tambien pasa lo mencionado por roman

Última edición por Lepe fecha: 06-10-2005 a las 17:56:09.
Responder Con Cita
  #6  
Antiguo 06-10-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Lepe
Retiro todo lo dicho, con este método tambien pasa lo mencionado por roman
Así es. No sucede si DragFullWindows está activo pero sí en el otro caso. Quizá podrías corregir un poco lidiando también con WM_MOVING, que es el que se encarga del dibujado de la silueta, pero entonces ya la cuestión se complica más de la cuenta.

A final de cuentas, para mover una ventana hay muchos pasos involucrados:

WM_NCHITTEST, WM_ENTERSIZEMOVE, WM_MOVING, WM_EXITSIZEMOVE, WM_MOVE, WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED

y uno puede intentar frenar los necesarios. Pero al quitar el comando SC_MOVE te evitas todo esto, simplemente le dices: está prohibido mover.

En cuanto a lo de maximizar la ventana pues esto lo puedes evitar quitando biMaximize de la propiedad BorderIcons.

Si además se desea evitar que se cambie el tamaño de la ventana, se puede añadir:

DeleteMenu(GetSystemMenu(Handle, false), SC_SIZE, MF_BYCOMMAND);

aunque en este caso también hay que trabajar WM_NCHITTEST para que el cursor del ratón no cambie de forma cuando se coloca sobre los bordes:

Código Delphi [-]
inherited;

if Msg.Result in [HTSIZEFIRST..HTSIZELAST] then
  Msg.Result := Windows.HTNOWHERE;

// Saludos
Responder Con Cita
  #7  
Antiguo 06-10-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
El método tiene un problema que antes no había visto:

Si se quitan todos los iconos de la barra de título, entonces la ventana ya se puede mover. Veremos si se puede solucionar esto.

// Saludos
Responder Con Cita
  #8  
Antiguo 06-10-2005
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
Hola

Bueno pues me había construido este ejemplito:

Código Delphi [-]
  type
  TForm1 = class(TForm)
  private
    { Private declarations }
     procedure WMNCMOUSEDOWN(var Message: TMessage);
            message WM_NCLBUTTONDOWN;
....
 
implementation
...
 
procedure TForm1.WMNCMOUSEDOWN(var Message: TMessage);
begin
   if Message.wParam  <> HTCAPTION   then
      inherited;
end;

pero después de haber visto el hilo recomendad por roman....

mejor voy a estudiar

Saludos
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

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


La franja horaria es GMT +2. Ahora son las 23:37:42.


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