Ver Mensaje Individual
  #39  
Antiguo 30-10-2011
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Reputación: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Me gustaría aportar mi granito de arena.

Si no entiendo mal, pretendes realizar una aplicación multiformulario que no sea MDI. Entonces Tu formulario principal se pone delante de todos tapándolos cuando se activa, siendo esto lo que quieres evitar. ¿Es así?.

Aunque pienso, coincidiendo con otros, que lo mejor es usar MDI, te propongo este ejemplo de aplicación multiformulario no MDI:

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure WndProc(var Message: TMessage); override;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2, Unit3;

{$R *.dfm}

function GetBackForm(Form: TForm): TForm;
var
  hWnd: Cardinal;
begin
  hWnd:= Form.Handle;
  Result:= Form;
  repeat
     if (FindControl(hWnd) is TForm) then Result:= FindControl(hWnd) as TForm;
     hWnd:= GetNextWindow(hWnd, GW_HWNDNEXT);
  until hWnd = 0;
end;

// Mostramos o creamos varios formularios
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show;
  Form3.Show;
end;

// Interceptamos los mensajes de MainForm
procedure TForm1.WndProc(var Message: TMessage);
begin
  case Message.Msg of
    WM_MOUSEACTIVATE:
    begin
      if Lo(Message.lParam) = HTCAPTION then  
         Message.Result := MA_NOACTIVATEANDEAT
      else
         Message.Result:= MA_NOACTIVATE;
      exit;
    end;
    WM_WINDOWPOSCHANGED:
    begin
      // Aseguramos que MainForm esté siempre detrás
      SetWindowPos(Handle, GetBackForm(self).Handle, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
      exit;
    end;
  end;
  inherited WndProc(Message);
end;

end.


Aunque no me termina de convencer del todo, este ejemplo mantiene al formulario principal, siempre detrás del resto de los formularios de la aplicación.


Saludos.

Última edición por Casimiro Noteví fecha: 31-10-2011 a las 00:41:03.
Responder Con Cita