Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Form al frente de todo, y todos. (https://www.clubdelphi.com/foros/showthread.php?t=78037)

pape19 14-03-2012 21:25:29

Form al frente de todo, y todos.
 
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

Código Delphi [-]
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

Cita:

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:
Código Delphi [-]
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:
Código Delphi [-]
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.

Código Delphi [-]
var
FgThreadId  : DWORD; { Hilo de la app. que tenga el foco }
AppThreadId : DWORD; { Hilo de nuestra aplicación        }
Código Delphi [-]
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.


La franja horaria es GMT +2. Ahora son las 09:01:39.

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