Sobre a Modularização
Att. Wendel Galvão.
Deltakronos
Respostas
Massuda
26/08/2005
Fhenrique
26/08/2005
desde ja agradeço
Technos
26/08/2005
Zumbi
26/08/2005
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.
Titanius
26/08/2005
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
Wiltefran
26/08/2005
Wiltefran Silva
Titanius
26/08/2005
Titanius
26/08/2005
Alguém tem mais alguma idéia?
Zumbi
26/08/2005
Marcio.theis
26/08/2005
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...
Renatacoimbra
26/08/2005
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.
Titanius
26/08/2005
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
Renatacoimbra
26/08/2005
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.
Renatacoimbra
26/08/2005
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´ );
Titanius
26/08/2005
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
Renatacoimbra
26/08/2005
Todos os Packages com os demais forms faria referencia a Package principal onde ficaria a conexão e Classes etc..
Titanius
26/08/2005
Porem como sou novato em OO, nao teria algum tutorial explicando isso que vc me mostrou? como funcionaria?
[]s
Renatacoimbra
26/08/2005
Titanius
26/08/2005
Certo, mas no caso fico preocupado com a conexao... como seria feito? pois nunca vi nada parecido, vc nao teria um exemplo?
[]s
Renatacoimbra
26/08/2005
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.
Titanius
26/08/2005
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
Renatacoimbra
26/08/2005
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
Titanius
26/08/2005
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
Zumbi
26/08/2005
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?
Renatacoimbra
26/08/2005
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
Michaell
26/08/2005
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
Mmoreira
26/08/2005
Voce conseguiu fazer funcionar brother?
Estou querendo modularizar minha aplicação mas estou tendo problemas com o DataModule.
Qualquer dica sera de grande ajuda
Vqds
26/08/2005
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
Emerson Nascimento
26/08/2005
titanius, você sanou sua dúvida quanto à conexão com o banco de dados?
Powerlog Tecnologia
26/08/2005
Acabei de baixar as vídeo-aulas ( https://www.devmedia.com.br/articles/viewcomp.asp?comp=8151 ) , vamos ver no que dá !!!!
Andrew
26/08/2005
BPL´s
DLL´s
EXE´s
Qual das três formas é melhor?
Conto com a colaboração de vocês.
Eniorm
26/08/2005
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á.
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
Powerlog Tecnologia
26/08/2005
Eniorm
26/08/2005
BPL pelo visto nada mais é do que um package (dpk) compilado.
Andrew
26/08/2005
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á.
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.
Eniorm
26/08/2005
não posso dizer nem prós nem contras rsrsrsrs
particularmente eu não faria assim....