Formulário em DLL

18/01/2006

Galera procurei no forum mas não encontrei assunto correlato ao que vou mensionar, o que acontece é o seguinte:
Criei uma dll e coloque nela varios forms, e tenho observado que a cada form eu abro é criado um novo item na barra do iniciar do windows, a questão é a seguinte, tem como contornar isto, ou mesmo ocultar estes novos itens que teimam em aparecer?
Desde já Obrigado.


Madrick

Respostas

18/01/2006

Ipc$

Tente sobrescrever o método CreateParams:
procedure CreateParams(var Params: TCreateParams); override;

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle + WS_EX_ToolWindow;
end;



Responder Citar

03/03/2006

Thiago Vidal

Só pra deixar aqui registrado, caso alguém faça esta busca no futuro...

Tive este mesmo problema, e assim como esta solução oferecida, a maioria das soluções encontradas aqui no fórum obriga a propriedade BorderStyle da janela a ser bsToolWin, o que no meu caso, não era uma coisa boa, eu precisava da janela com BorderStyle bsDialog, abrindo a partir da DLL, sem criar outro botao na barra de tarefas, visto que o form da minha DLL chama diversos outros forms, e deixaria a barra de tarefas abarrotada de botões.

Uma solução que eu encontrei, foi passar para o método da DLL, o Handle do objeto Application do executavel, e usar um CreateParented com este handle.

Segue o exemplo:

Na DLL:
library Project2;

uses
  Windows,
  SysUtils,
  Classes,
  Forms,
  Unit2 in ´Unit2.pas´ ;

{$R *.res}

procedure Abrir(Handle: THandle); stdcall;
begin
  with TForm2.CreateParented(Handle) do
  try
    BorderStyle := bsDialog;
    Position := poScreenCenter;
    ShowModal;
  finally
    Free;
  end;
end;

exports
  Abrir;

begin
end.


No Executavel:
...
implementation

{$R *.dfm}

procedure Abrir(Handle: THandle); stdcall; external ´project2.dll´;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Abrir(Application.Handle);
end;
...


chamei a DLL estaticamente por simplicidade, mas tambem funciona se for utilizado LoadLibrary/FreeLibrary.

Lembrando mais uma vez, que a propriedade BorderStyle do Form deve ser bsDialog, se for bsSingle ou bsSizeable, o Form não fica visível, e a aplicação fica travada.


Responder Citar