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
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;
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Show;
Form3.Show;
end;
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
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.