Janelas topmost em aplicação totalmente modal?

13/08/2004

Preciso da ajuda dos colegas ...

Tenho uma aplicação 100¬ modal, exceto uma janela de avisos (deve vir sobre qualquer aplicação ou sobre as próprias janelas abertas do programa), que é disparada por um timer de tempo em tempos.

Onde consegui chegar. Ela vem no topo.
Mas, se a janela de avisos for criada antes de uma chamada modal para outra janela da aplicação, a janela de avisos vem no topo, mas não tem foco, cursor, etc. Não consigo operar sobre ela. A operação não sai da janela modal.

Gostaria de saber como fazer além de vir no topo, que a janela de avisos se tornasse a janela operante independente de eu estar numa janela modal, quando a janela de avisos for posta no topo.

Alguns códigos e o que já tentei


{TIMER INICIO}
procedure Tnprincipal.TimerRecepcaoTimer(Sender: TObject);
begin
if nrecepcaoAvisos=nil then
begin
Application.CreateForm(TnrecepcaoAvisos, nrecepcaoAvisos);
end;
recepcaoAvisosOS.create(false); //chama uma thread
end;
{FIM TIMER}


{THREAD INICIO}
unit TrecepcaoAvisosOS;

interface

uses
Classes, SysUtils, windows, forms;

type
recepcaoAvisosOS = class(TThread)
private
procedure EventoOnTerminate(Sender: TObject);
protected
procedure Execute; override;
public
constructor criate(criatesuspended: Boolean);
end;

implementation

uses frecepcaoAvisos, datamoduleOS;

constructor recepcaoAvisosOS.criate(criatesuspended: Boolean);
begin
inherited Create(criatesuspended);
priority:=tplower; // tpIdle tpLowest tplower tpNormal tpHigher tpHighest tpTimeCritical
FreeOnTerminate := True;
end;

procedure recepcaoAvisosOS.Execute;
var primeiravez:boolean;
begin
{OUTROS CÓDIGOS NÃO RELEVANTES}
onterminate:=EventoOnTerminate;
end; //end do método execute

procedure recepcaoAvisosOS.EventoOnTerminate(Sender: TObject);
begin
if nrecepcaoAvisos.StringGrid1.Cells[0,0]<>´´ then
begin
nrecepcaoAvisos.Show;
nrecepcaoAvisos.WindowState:=wsnormal;
{RECURSOS DO WINDOWS QUE JÁ TENTEI}
SetWindowPos nrecepcaoAvisos.Handle,HWND_TOPMOST ,520,100,272,156, SWP_SHOWWINDOW);
setactivewindow(nrecepcaoAvisos.Handle);
SetForegroundWindow(nrecepcaoAvisos.Handle);
end;
end;
end.
{FIM THREAD}

{Já tentei várias combinações com setwindowpos, setactivewindow, setforegroundwindow}

Preciso muito da ajuda.
Obrigado por qq atenção.
Delmar


Delmar