PDA

Ver la Versión Completa : Form al frente de todo, y todos.


pape19
14-03-2012, 21:25:29
Tengo un form, que al mostrarlo, no ocupa toda la pantalla. Sin embargo, no quiero que se pueda hacer absolutamente nada, solo la posibilidad de presionar un botón que está en medio de ese Form.

He visto métodos, pero que son un desperdicio en cuanto a rendimiento. Por ejemplo usando timers, y que se ejecute

Aplication.BringtoFront;

Hay alguna manera de realizar lo planteado, sin usar timers que traigan el foco del form continuamente???

ecfisa
14-03-2012, 22:02:11
Hay alguna manera de realizar lo planteado, sin usar timers que traigan el foco del form continuamente???
Hola pape19.

Si, tenes que ajustar algunos valores. Supongamos que el form que solo permite la pulsación de un TButton se llame Form2 (¿ Original no ? :) ) y sea creado desde Form1.

Entonces en Form1:

uses Unit2; // Form2

procedure TForm1.Button1Click(Sender: TObject);
begin
with TForm2.Create(Self) do
begin
BorderIcons:= []; // configurable desde Object Inspector
BorderStyle:= bsDialog; // configurable desde Object Inspector
FormStyle:= fsStayOnTop; // configurable desde Object Inspector
ShowModal;
end;
end;


Y en Form2 agregar el Button cerrar y este código para que no lo se pueda mover:

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

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

Y ahí querdará fijo, hasta pulsar el botón que lo cierra...

Saludos.

ElDioni
15-03-2012, 13:26:27
Hola,

aparte de lo que te señala el compañero, no acabo de entender que comportamiento quieres conseguir, ¿necesitas que cada cierto tiempo se habra un formulario?, ¿no tiene que cumplir ninguna condición?.

Saludos.

pape19
15-03-2012, 14:59:36
Con la ayuda de ecfisa pude lograr lo que quería, aunque solo la primera vez que muestro el Form2. Cuando apreto el botón de ese Form2, vuelve al Form1, y si llamo de vuelta al Form2, se pierde lo que logré la vez anterior, no se si me explico.

Lo que quiero es que se muestre el Form2, llamado desde el form1. Y mientras este activo el form2, cualquier programa que ejecute, que nada tenga que ver con mi aplicación, se muestre detrás del Form2; hasta que aprete un botón del Form2.

ElDioni
15-03-2012, 16:58:22
Hola este código lo saqué del club hace ya tiempo, me sirvió para crear un programa de mensajería interna que al hacer la comprobación de si tenías mensajes pendientes de leer te ponía el mensaje pendiente (el formulario correspondiente) encima de todos los programas que tenías abiertos en ese momento. Supongo que si utilizas el mismo código en un timer que se actualice cada poco tiempo conseguiras que el formulario que quieres se quede siempres encima de todo.


var
FgThreadId : DWORD; { Hilo de la app. que tenga el foco }
AppThreadId : DWORD; { Hilo de nuestra aplicación }


form3.FormStyle:=FsStayOnTop;
Form3.Showmodal;
Form3.FormStyle:=FsNormal;
{ Obtener los hilos }
FgThreadId := GetWindowThreadProcessId(GetForegroundWindow, nil);
AppThreadId := GetWindowThreadProcessId(Handle, nil);
{ Anexar el hilo de nuestra app. al de la que tenga el foco }
AttachThreadInput(AppThreadId, FgThreadId, true);
{ Ahora sí, activar la applicación }
SetForegroundWindow(Handle);
{ Separar el hilo de nuestra app de la otra }
AttachThreadInput(AppThreadId, FgThreadId, false);



Espero que te sirva.

Saludos.