Array
(
)

Formulário em DLL

Madrick
   - 18 jan 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.


Ipc$
   - 18 jan 2006

Tente sobrescrever o método CreateParams:#Código

procedure CreateParams(var Params: TCreateParams); override;

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



Thiago Vidal
   - 03 mar 2006

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:
#Código

library Project2;

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

{$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:
#Código
...
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.