PDA

Ver la Versión Completa : Como hacer que el usuario no mueva la form?


Waldo
16-11-2003, 02:58:46
Pues la pmisma pregunta
como hacer que el usuario no mueva la form?

roman
16-11-2003, 03:40:05
Dos opciones:


Atándole las manos
Con el siguiente código:



type
TForm1 = class(TForm)
private
procedure WMSysCommand(var Message: TWMSysCommand);
message WM_SYSCOMMAND;
end;

implementation

procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
begin
if Message.CmdType and $FFF0 = SC_MOVE
then Message.Result := 0
else inherited;
end;


// Saludos

marcoszorrilla
16-11-2003, 09:13:20
Otra posibilidad es capturando y tratando el mensaje

WM_WINDOWPOSCHANGING:

Pon esta linea en la parte private de la declaración de tu form:

type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }

procedure Quieto(var m: TWMWINDOWPOSCHANGED); message
WM_WINDOWPOSCHANGING ;

{ Y luego, en la implementation pon este procedimiento: }

procedure Tform1.Quieto(var m : TWMWINDOWPOSCHANGED);
begin
m.windowpos.x := 200; {X/posición izquierda}
m.windowpos.y := 100; {Y/posoción derecha}
end;

En Cuanto al punto 1º de Román, yo también le ataría los pies, nunca se sabe.

Un Saludo.

__cadetill
16-11-2003, 09:34:35
yo me inclino por la 1era de Román con la observación de Marcos. Las otras soluciones.... no me gustan :D :D

roman
16-11-2003, 20:33:05
Hay otra forma que en realidad me gusta más. Funcionalmente es lo mismo pero tanto la de marcos como la mía dejan habilitado el menú "Mover" del cuadro de control de la ventana mientras que esta de plano lo quita.


procedure TForm1.FormCreate(Sender: TObject);
begin
DeleteMenu(GetSystemMenu(Handle, false), 1, MF_BYPOSITION);
end;


// Saludos

marcoszorrilla
16-11-2003, 20:46:43
Hola Román:

Acabo de hacer una prueba y finalmente me quedo con esta última opción, manteniendo como quedó dicho al usuario atado de pies y manos y si usara algún sistema de reconocimiento de voz amordazado.

Un Saludo.

roman
16-11-2003, 21:08:25
Claro que en realidad son demasiadas complicaciones para algo que puede resolverse mucho más fácil:


try
try
if User.Action = uaMoveForm then
User.Remove;
except
User.PunishHim;
end;
finally
User.Remove;
end;


// Saludos

roman
23-11-2003, 06:33:02
roman comentó:
Hay otra forma que en realidad me gusta más

[...]


procedure TForm1.FormCreate(Sender: TObject);
begin
DeleteMenu(GetSystemMenu(Handle, false), 1, MF_BYPOSITION);
end;



El problema aquí es que el ítem "Mover" no siempre está en la misma posición. Por ejemplo, si el formulario tiene su propiedad BorderStyle en bsDialog, la posición del ítem ya no es 1 sino 0.

Creo que es mejor así:


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


// Saludos

marcoszorrilla
23-11-2003, 10:43:38
Aquí va otra:


type
TyourForm = class(TForm)
private
{ Private declarations }
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
end;

procedure TyourForm.WMNCHitTest(var Message: TWMNCHitTest);
begin
inherited;

with Message do
if Result = HTCAPTION then
Result := HTNOWHERE;
end;


Un Saludo.

roman
23-11-2003, 10:55:18
marcoszorrilla comentó:
Aquí va otra:


Código que inhibe los clicks en la barra de título



¡Ah! Pero esta forma es demasiado inhibitoria ya que de plano inhabilita toda la barra de título incluyendo el menú contextual y además no evita que se mueva el formulario:

Menú sistema->Mover

(Creo que te hace falta tu café matutino :D )

Por cierto, creo que a quien finalmente ataron las manos fue a quien originalmente hizo la pregunta. Eso o salió mal parado en el intento.

:D

// Saludos

marcoszorrilla
23-11-2003, 11:00:52
Cierto, me lo tomaré en breve. En cuanto al demandante de la información parece ser que alguien lo dejo en Enabled:=False;

Un Saludo.