Sobre a Modularização

Delphi

26/08/2005

Tem como fazer com que um projeto modularizado, acesse os arquivos BPL´s de dentro de uma pasta por exemplo: ´\USR\PROJETO\MODULOS´ a ultima pasta modulos no caso seria onde estive-se os arquivos BPL´s. Por que atualmente so consigo acesser os BPL´s dentro da pasta onde estar o executavel do meu projeto. Caso exista alguma maneira, por favor, se tiver como mim ajudem.

Att. Wendel Galvão.


Deltakronos

Deltakronos

Curtidas 0

Respostas

Massuda

Massuda

26/08/2005

Pelo que me lembro, a carga dos packages respeita as mesmas regras da carga de DLLs, ou seja, quando um BPL vai ser carregado ele e procurado no:[list:4e8f699712][*:4e8f699712]diretório do programa[*:4e8f699712]diretório ativo do programa[*:4e8f699712]diretório System/System32 do Windows[*:4e8f699712]diretório do Windows[*:4e8f699712]diretórios listados no PATH[/list:u:4e8f699712]Se você estiver carregando dinamicamente o BPL, você pode especificar o caminho na chamada do LoadPackage.


GOSTEI 0
Fhenrique

Fhenrique

26/08/2005

Amigos, aproveitando, onde eu encontro material para modulos em bpl?


desde ja agradeço


GOSTEI 0
Technos

Technos

26/08/2005

tb to a espera sobre essa resposta


GOSTEI 0
Zumbi

Zumbi

26/08/2005

Vamos compartilhar o conhecimento galera, eu tb estou a algum tempo atraz de como fazer isso e não consegui muita coisa não.

Vamos nos unir e fazer um material consistente para nossos amigos programadores, não ficar muito tempo atraz da mesma coisa como eu estuo.

Vlw pessoal, e vamos compartilhar nossos conhecimentos.


GOSTEI 0
Titanius

Titanius

26/08/2005

Estou de acordo zumbi, estou a muito, muito tempo mesmo atrás de algo sobre isso, o que me encana é a conexão com o banco de dados... pois não quero que cada modulo tenha um Connection, assim pra cada sistema com 4 modulos rodando teria 4 conexoes com o banco fora o principal... isso arrebenta ...

um amigo de outro forum, me falou sobre o Hydra, da RemObjects, fiquei muito interessado nele, o porem, é que ele é pago, e muito caro por sinal, algo em torno de 200 Euros... :( me desanimou...

Mas isso aí, quanto mais gente discutindo melhor... agrega valores à comunidade. :wink:

[]s


GOSTEI 0
Wiltefran

Wiltefran

26/08/2005

Eu concordo plenamente, estou procurando informações sobre isso a algum tempo tambem, mas nao achei nada q me levasse a frente.



Wiltefran Silva


GOSTEI 0
Titanius

Titanius

26/08/2005

Alguem mais se habilita? :roll: :roll:


GOSTEI 0
Titanius

Titanius

26/08/2005

Opa, tentando reavivar esta discussão, pois considero de extrema importância :oops:

Alguém tem mais alguma idéia?


GOSTEI 0
Zumbi

Zumbi

26/08/2005

Alguem tem algum material, ou saberia algum lugar que poderia achar material sobre esse assunto?


GOSTEI 0
Marcio.theis

Marcio.theis

26/08/2005

Eu também entro na questão de como fazer isto.... Pois estou passando os relatórios para BPL e não quero ter várias connections no projeto... Massuda me passou estes dois link´s:
http://users.tpg.com.au/vinorodr/insight/delphi/dpackage/dpackage.shtml
http://users.tpg.com.au/vinorodr/insight/delphi/advdpack/advdpack.shtml
Mas participo da discussão e no desenvolvimento de como dar uma solução para o problema...


GOSTEI 0
Renatacoimbra

Renatacoimbra

26/08/2005

Olá Pessoal !

Meu Sistema é todo dividido em BPLs, tive muito trabalho pois sou novata em Delphi, mais está funcionando, se eu poder ajudar em alguma coisa estou a disposição.


GOSTEI 0
Titanius

Titanius

26/08/2005

Olá amigos,
O meu problema, é com a conexão e com MDI,

Conexão:
Teria que ter algum jeito de focalizar a conexão em um único modulo, o principal, ainda não conesegui...

MDI, tem como faz uma MDI Child nos Modulos? BPL?

Se puderem me ajudar.. poutz, fico muitissimo agradecido.. :-)

[]s


GOSTEI 0
Renatacoimbra

Renatacoimbra

26/08/2005

Olá titanius !

vc usa alguma OO nos seus projetos ?

Uma simples herança de Forms facilita muito.
vc pode criar um BPL pai e dentro dele colocar seu DM com a conexao principal, daí é só fazer referencia a ela nas outras BPLs.


GOSTEI 0
Renatacoimbra

Renatacoimbra

26/08/2005

Olá titanius !

Quanto a usar MDI em BPLs é quase a mesma coisa de usar SDI, eu uso duas funções, uma pra localizar a classe Form, (no meu caso uso uma classe TFrmPadrao) e a outra para instanciar o formulário da BPL.

[color=brown:33cfcca830]1.
Esta função faz meramente uma busca nos formulários MDI criados e visíveis caso encontre, retorna uma referência a ele como TFrmPadrao.
A mesma função poderia ser usada para SDI, se a aplicação fosse SDI, poder-se-ia substituir o MDIChildCount por Screen.FormCount e MDIChildren por Screen.Forms
formulários[/color:33cfcca830]


class function InstForm.LocalizarFormularioMDI( const s : ShortString ) : TfrmPadrao;
var Encontrou : TfrmPadrao;
    i : Byte;
    mf : TForm;
begin
   mf := Application.MainForm;
  Encontrou := nil;
  if mf.MDIChildCount <> 0 then begin
     for i := 0 to mf.MDIChildCount - 1 do begin
         if UpperCase( mf.MDIChildren[i].Name ) = UpperCase( s ) then begin
            Encontrou := TfrmPai( mf.MDIChildren[i] );
            Break;
         end;
     end;
  end;
  Result := Encontrou;
end;



[color=brown:33cfcca830]Essa outra tem a função de Instanciar o form da BPL:[/color:33cfcca830]



class procedure InstForm.InstanciarFormularioMDI( const Package, NomeForm : ShortString );
var h : THandle;
    f : TfrmPadrao;
    CriarNovoForm : function : TfrmPadrao;
begin
  // Verifica se o formulário já está na tela
  f := LocalizarFormularioMDI( NomeForm );
  if f <> nil then begin
     // Se já estiver na tela, apenas o traz para a frente de todos
     f.Show;
  end else begin
     // Carrega o package
     h := LoadPackage( Package );
     if h <> 0 then begin
        {
         Procura por uma função de inicialização do form. O nome foi
         padronizado, como se pode observar. Fique atento a detalhes de
         minúsculas e maiúsculas
        }
        @CriarNovoForm := GetProcAddress( h, PChar( ´CriarNovo´ + NomeForm ) );
        if Assigned(CriarNovoForm) then begin
           CriarNovoForm;
        end;
     end;
  end;
end;




Em todos os formulários colocar a função:


function CriarNovofrmA : TfrmPadrao;
begin
  CriarNovoNomeFormCriar := TNomeFormCriar.Create( Application );
end;

exports
  CriarNovoNomeFormCriar;




[color=brown:33cfcca830]Para chamar a função instanciar form fica assim:[/color:33cfcca830]


  TInstForm.InstanciarFormularioMDI( BPL, ´NomeFormDentroBPL´ );




GOSTEI 0
Titanius

Titanius

26/08/2005

Olá titanius ! vc usa alguma OO nos seus projetos ? Uma simples herança de Forms facilita muito. vc pode criar um BPL pai e dentro dele colocar seu DM com a conexao principal, daí é só fazer referencia a ela nas outras BPLs.


Olá Renata,

A única coisa que mexi em OO, foi fazer meus forms de Cadastros instaciados de um único Form Basico..
Com isto vc me deixou com um outra duvida, sendo os forms herdados, ele herdaria este form de onde? do modulo principal?eu eu teria que ter o FormBasico em todos os BPL?

E uma outra questao, como vc faz com a conexao ao banco?

[]s


GOSTEI 0
Renatacoimbra

Renatacoimbra

26/08/2005

Vc teria um Package para a Conexão e Classes,

Todos os Packages com os demais forms faria referencia a Package principal onde ficaria a conexão e Classes etc..


GOSTEI 0
Titanius

Titanius

26/08/2005

Opa, você começou a me animar novamente Renata.

Porem como sou novato em OO, nao teria algum tutorial explicando isso que vc me mostrou? como funcionaria?


[]s


GOSTEI 0
Renatacoimbra

Renatacoimbra

26/08/2005

Sobre OO, não pesquisei, mais acredito que aqui mesmo no forum tenha muita coisa a respeito.


GOSTEI 0
Titanius

Titanius

26/08/2005

Sobre OO, não pesquisei, mais acredito que aqui mesmo no forum tenha muita coisa a respeito.


Certo, mas no caso fico preocupado com a conexao... como seria feito? pois nunca vi nada parecido, vc nao teria um exemplo?


[]s


GOSTEI 0
Renatacoimbra

Renatacoimbra

26/08/2005

Acho q da forma que eu trabalho não vai te ajudar muito, pois uso 100¬ OO

mais vai aí, essa é uma Unit da Classe que cria a conexão com BD, eu tenho essa unit na BPL principal, todas as demais BPLs faz referencia a BPL principal, porém usam a classe ConexaoBD.






unit ConexaoBD;

interface

uses Classes, DBXpress, DB, SqlExpr, SysUtils,
     ConfigBD;

type TConexaoBD = class

private
  FTipoBanco: TTipoBanco;
protected
  FConexao: TSQLConnection;
public
  procedure conectar(config: TConfigBD);
  procedure setTipoBanco(tipoBanco: TTipoBanco);
  function getConexao(): TSQLConnection;
  function getTipoBanco(): TTipoBanco;
  procedure startTransaction(var td: TTransactionDesc);
  procedure commitTransaction(td: TTransactionDesc);
  procedure rollbackTransaction(td: TTransactionDesc);
end;

var
  conexao: TConexaoBD;

implementation

{ TUntBD }


procedure TConexaoBD.commitTransaction(td: TTransactionDesc);
begin
  if FConexao.InTransaction then
    FConexao.Commit(td);
end;

procedure TConexaoBD.conectar(config: TConfigBD);
begin
  FConexao := TSQLConnection.Create(nil);
  with FConexao do
  begin
    Connected := false;
    LoginPrompt := False;
    ConnectionName := config.getConnectionName;
    VendorLib := config.getVendorLib;
    LibraryName := config.getLibraryName;
    DriverName := config.getDriverName;
    GetDriverFunc := config.getDriverFunc;
    Params.Text := config.getParamConexao;
    Connected := True;
  end;
end;

function TConexaoBD.getConexao: TSQLConnection;
begin
  Result := FConexao;
end;

function TConexaoBD.getTipoBanco: TTipoBanco;
begin
  Result := FTipoBanco;
end;

procedure TConexaoBD.rollbackTransaction(td: TTransactionDesc);
begin
  if FConexao.InTransaction then
    FConexao.Rollback(td);
end;

procedure TConexaoBD.setTipoBanco(tipoBanco: TTipoBanco);
begin
  FTipoBanco := tipoBanco;
end;

procedure TConexaoBD.startTransaction(var td: TTransactionDesc);
begin
  with td do
  begin
    TransactionID := 1;
    GlobalID := 1;
    IsolationLevel :=  xilREADCOMMITTED;
  end;
  FConexao.StartTransaction(td);
end;

end.




GOSTEI 0
Titanius

Titanius

26/08/2005

Certo, deixa eu ver se eu entendi:

Eu tenho o executavel Principal, onde devera ter o acesso ao banco de dados, nele eu adiciono esta unit, e chamo [b:63c266519c]conectar[/b:63c266519c]

blz... mas no BPL, como referencio a conexao? como ligo a Query? se eu adicionar a mesma unit, e chamar o [b:63c266519c]conectar[/b:63c266519c] novamente estarei abrindo 2 conexoes...

[]s


GOSTEI 0
Renatacoimbra

Renatacoimbra

26/08/2005

titanius, te aconselho a pesquisar mais sobre OO,

Essa Unt que coloquei vou mais para exemplificar, tem muito mais envolvido aí, tem várias outras classes por trás disso.

Infelismente não disponho de muito tempo pra escrever um exemplo pra vc agora, pois estou no meio de um projeto.

mais vou te dar algumas dicas, te aconselho a usar um DM para colocar a conexão com BD.

então vc vai ter o Dm, mais a ClasseFormBasica, certo ?
vc vai criar um Package e chamar de BplPai por exemplo e colocar e Dm e a classe Form dentro, blz ?

e todas os Pckages que vc criar com forms vc vai fazer referencia a BplPai que contém o Dm+Conexao e Classe Form, dessa forma funciona blz.

[]´s


GOSTEI 0
Titanius

Titanius

26/08/2005

Muito obrigado Renata, você já ajudou bastante... :D

Só uma pergunta, como vou estar com a conexão ´fora´ dos meus projetos, a conexão não irá aparecer no combo no OI, irá? Terei que setar tudo na mão, não é?


[]s


GOSTEI 0
Zumbi

Zumbi

26/08/2005

Como que eu poderia ter os modulos carregados dinamicamente, sendo que eu teria o nome do modulo gravado em um banco de dados.

por exemplo:

o cliente a tem o modulo de clientes e vendas ai eu teria no banco de dados dele somente 2 registros clientes, vendas.

o cliente b teria modulo de clientes, vendas, faturamento e estoque.

ai teria as respectivas entradas no banco de dados, sendo q o menu tb seria criado dinamicamente ´Isso ele ja faz´.

Como eu poderia implementar isso?


GOSTEI 0
Renatacoimbra

Renatacoimbra

26/08/2005

Isso eu faço na inicialização do sistema.

Assim como vc cria o menu dinamicamente, vc pode dentro de um laço iniciar algumas Var com os módulos disponiveis:


Const

  Finan = ´finan.bpl´;
  Escrita = ´escrita.bpl´;




[]´s


GOSTEI 0
Michaell

Michaell

26/08/2005

Pessoal,

Estou com dúvidas em relação ao Load e Unload... Se eu criar um procedimento que vai ser chamado no evento OnClick de um item de menu, por exemplo... Neste evento, atualmente, estou fazendo chamada ao LoadPackage... Qual seria a melhor forma e local para chamar o Unload?! Se caso não chamar o Unload, quando fechar o aplicativo ele ´libera´ a memória do pacote?!

[]´s


GOSTEI 0
Mmoreira

Mmoreira

26/08/2005

titanius,

Voce conseguiu fazer funcionar brother?
Estou querendo modularizar minha aplicação mas estou tendo problemas com o DataModule.

Qualquer dica sera de grande ajuda


GOSTEI 0
Vqds

Vqds

26/08/2005

Tem como fazer com que um projeto modularizado, acesse os arquivos BPL´s de dentro de uma pasta por exemplo: ´\USR\PROJETO\MODULOS´ a ultima pasta modulos no caso seria onde estive-se os arquivos BPL´s. Por que atualmente so consigo acesser os BPL´s dentro da pasta onde estar o executavel do meu projeto. Caso exista alguma maneira, por favor, se tiver como mim ajudem. Att. Wendel Galvão.


voce quando for executar a bpl dinamicamente aponta para ´.\modulos\arquivo.bpl´ ja que o ´.\´ indica ao sistema que apartir do local onde esta, vá para a pasta modulo. A outro coisa é incluir na variavel PATH de ambiente o caminho do executavel e da pasta onde esta as bpl. com isso o seu sistema será possivel de localizar os arquivo sem problema


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

26/08/2005

e aí, galera? como anda o desenvolvimento com bpl?
titanius, você sanou sua dúvida quanto à conexão com o banco de dados?


GOSTEI 0
Powerlog Tecnologia

Powerlog Tecnologia

26/08/2005

Colegas, também vou ingressar em modularização...
Acabei de baixar as vídeo-aulas ( https://www.devmedia.com.br/articles/viewcomp.asp?comp=8151 ) , vamos ver no que dá !!!!


GOSTEI 0
Andrew

Andrew

26/08/2005

Pessoal estava discutindo com um colega meu, que inclusive é colega de fórum de vocês também, falavamos sobre esse assunto, modularização, pensei em modularizar com DLL, mas o Martins me deixou um pouco desanimado, então fica a pergunta, qual a melhor forma de modulariza um sistema?

BPL´s
DLL´s
EXE´s

Qual das três formas é melhor?

Conto com a colaboração de vocês.


GOSTEI 0
Eniorm

Eniorm

26/08/2005

algum tempo atras eu pensei em modularizar por DLL

mas notei que, para cada dll eu seria obrigado a ter uma instancia do datamodulo com a conexão ao banco.

Usando BPL eu posso ter um pacote com o datamodulo e este compartilhado com os pacotes restantes do sistema...

Uma vez o datamodulo instanciado, os demais pacotes irão usá-lo.

Para iniciar o aprendizado de Packages BPL eu segui esses dois tudoriais... depois pesquisei bastante pra ir solucionando um erro ou outro que foi surgindo aqui e acolá.

Modularização de aplicações com Packages BPL Fábio Simões http://www.enio.pro.br/packages-partei.pdf http://www.enio.pro.br/packages-parteii.pdf


Atualmente estou implementando um modelo de aplicação modularizada com pacotes BPL usando forms MDI e tenho gostado do resultado, mas confesso que fritei a massa cinzenta no começo... rsrsrsrs

mas vale a pena!

se vc tentar algo parecido, tenha em mente que o Project Manager será seu melhor amigo :D


GOSTEI 0
Powerlog Tecnologia

Powerlog Tecnologia

26/08/2005

E esses BPLs podem ser feitos no Delphi 7 também ?


GOSTEI 0
Eniorm

Eniorm

26/08/2005

sim, se não me engano o delphi desde os seus primórdios suportam as BPL´s, antigamente tinha um outro nome....

BPL pelo visto nada mais é do que um package (dpk) compilado.


GOSTEI 0
Andrew

Andrew

26/08/2005

[quote:163b748366=´Enio Marconcini´]algum tempo atras eu pensei em modularizar por DLL

mas notei que, para cada dll eu seria obrigado a ter uma instancia do datamodulo com a conexão ao banco.

Usando BPL eu posso ter um pacote com o datamodulo e este compartilhado com os pacotes restantes do sistema...

Uma vez o datamodulo instanciado, os demais pacotes irão usá-lo.

Para iniciar o aprendizado de Packages BPL eu segui esses dois tudoriais... depois pesquisei bastante pra ir solucionando um erro ou outro que foi surgindo aqui e acolá.

Modularização de aplicações com Packages BPL Fábio Simões http://www.enio.pro.br/packages-partei.pdf http://www.enio.pro.br/packages-parteii.pdf


Atualmente estou implementando um modelo de aplicação modularizada com pacotes BPL usando forms MDI e tenho gostado do resultado, mas confesso que fritei a massa cinzenta no começo... rsrsrsrs

mas vale a pena!

se vc tentar algo parecido, tenha em mente que o Project Manager será seu melhor amigo :D[/quote:163b748366]

Valeu Enio, quanto ao uso de arquivos EXE o que você tem a dizer? Já usou assim?

Módulos assim:

MEstoque.exe
MFinanceiro.exe
MVendas.exe

qual metódo é mais robusto e de melhor manutenção? Ou depende do desenvolvedor?

Obrigado.


GOSTEI 0
Eniorm

Eniorm

26/08/2005

nunca usei dessa forma...

não posso dizer nem prós nem contras rsrsrsrs

particularmente eu não faria assim....


GOSTEI 0
POSTAR