Ir para conteúdo
Fórum Script Brasil
  • 0

Vários Forms Em Dlls Dinâmicas


Arthavus

Pergunta

Saudações pessoal,

Estou atualmente convertendo um de meus sistemas que

carregava forms de pacotes delphi dinamicamente, uma

interface era usada para carregar a janela de forma

que o meu form MDI nunca se preoculpava com o form

dinamicamente carregado.

Agora estou portando o uso de pacotes delphi para

DLLS, e estou tendo o problema de excessões quando tento

abrir mais de uma instância de uma janela, ou quando

fecho o form e o abro novamente.

Na minha MDI para um item de menu tem a seguinte chamada:

	
	type TGetJanela = function (ANomJanela: PChar; Appli: Pointer): TpJanelaPBase; stdcall;
...
  @GetJan := GetProcAddress(Handle, PChar('GetJanela'));
  SetLength(Aux, (Length(AJanClassName) + 1));
  StrCopy(PChar(Aux), PChar(AJanClassName));
  Janela := GetJan(PChar(Aux), Pointer(Application));
E em minha DLL tem o seguinte:
	function GetJanela(ANomJanela: PChar; Appli: Pointer): TpJanelaPBase; stdcall;
	var
   n: String;
	begin
   Application := TApplication(Appli);
   n := ANomJanela;
   if n = 'FCadastroMaterial' then
     Result := TFCadastroMaterial.Create(nil)
   else if n = 'FCadastroSimples' then
     Result := TFCadastroSimples.Create(nil)
   else
     Result := nil;
	end;

Então resumidamente, como fazer para uma DLL retornar um

form que eu possa manipular em uma MDI, e possa também

abrir várias instâncias deste form ? A minha idéia é

preservar a característica de meu sistema atual, onde

meu form MDI se comunica com o form (de uma DLL

dinamicamente carregada) através de uma interface ou de

uma classe ancestral básica.

Atualmente minhas janelas que estão retornando pela DLL

utilizam interfaces em suas declaração, no meu form MDI

eu as utilizava e também ocorria as excessões ao tentar

abrir nova instâncias, ou ao fechar e abrir novamente a

jenala. Alguém saberia oque pode ser feito ?

Desde já, obrigado pela atenção.

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

você deve estar dando Show na sua aplicação e não na dll.

Eu utilizo forms não modais em dlls, mas na função da dll existe um var fm:TxxFM, onde TxxFM é descendente de TForm. Então na dll ocorre o seguinte:

function xExibaForm(ParsDll:TParsDll):TObject; stdcall;

var fm:TxxFM;

begin

fm := TxxFM.Create(Application);

Result := fm;

fm.Show;

end;

No meu caso, TParsDll já são parâmetros predefinidos.

A Dll é que se encarrega de todo o processamento do Form e daí é possível chamar a função xExibaForm várias vezes sem dar problemas, pois a variável fm é local e a cada chamada é criada uma nova instância.

Vale lembrar também que no compartilhamento de objetos entre a aplicação com a dll, tem que ser colocado ShareMem na primeira linha do Uses do .dpr da aplicação e no .dpr da dll.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,2k
×
×
  • Criar Novo...