Metodos, propriedades e variáveis em uma bpl

16/07/2008

5

Hi pessoas!

Bom...
Vou tentar explicar meu problema de forma clara pra que uma boa alma me ajude... rsrs... Mas antes o fato: nunca usei bpl antes e estou com extrema necessidade em usar agora. Então eu to ralando atras de informação...

Seguinte:
Preciso ver dados da aplicação (exe) de dentro de um módulo (bpl) e vice-versa. Estou perdido porque sempre pensai ´proceduralmente´, então eu to me perdendo pra organizar as ideias...

Vou dar um exemplo:
Tenho uma bpl (Login) que mais de um sistema (exe) utiliza.
No form principal dos sistemas (exe), eu tenho uma constante com um ´ID´ que indica o sistema. Por exemplo: Sist1.exe tem uma constante ID : Integer = 1.

Esse ID eu uso numa instrução SQL que diz se o usuário tem ou não acesso àquele determinado módulo (no nosso caso, o módulo de ID = 1).

Perguntas:
1 - Como eu faço a bpl Login enxergar a constante ID?

2 - Como a aplicação vai ´controlar´ o ´resultado´ dessa bpl? (A minha tela de login tb verifica os ´acessos´ permitidos ao usuário dentro do sistema.)

Alguem pode me ajudar?
Qualquer crítica é bem-vinda. já que, como eu disse antes, eu sempre programei com procedures e functions... Pensar um pouco diferente desordena tudo na minha cabeça, embora eu esteja achando muito interessante esse lance de modularizar e estou querendo investir nisso... Se alguem tiver uma sugestão de um jeito melhor de fazer isso, por favor me manda a letra!!!! =)

Abração!!!!


Responder

Posts

16/07/2008

Davicarrano

cara, eu ja programo usando bpl. ja que vc ta começando vc ja esta por dentro de como fazer com que sua compilacao desvincule as bpl´s do executavel?
primeiro passo é esse.. depois vc tem q ter em mente, quem vai usar a bpl... se for o .exe é so adicionar no uses as units q estao dentro da bpl q vc quer usar.. se for ser usado por outra bpl, tem q adicionar referencia pra ela..
e pra passar dados pra bpl é so chamar as funções ou criar os objetos como se estivesse no exe...


Responder

16/07/2008

Powerslave7

Fala Davi.

Cara... Eu realmente to meio perdido nesse lance de bpl :?, mas to muito interessado em aprender.

Vou te explicar o que eu ´já´ fiz até agora com o que eu andei pesquisando.

Criei uma bpl que unicamente cria a minha conexão com o banco de dados (no meu caso, Oracle via BDE). Vou chamar aqui de bConn, só pra referenciar no texto. Compilei essa bpl e ela funciona certinho.

Criei um form (que eu quero implementá-lo como meu form de Login) em outra bpl, que vou chamar de bLogin, e essa bpl usa (requires) a bConn.

Aí fui criar minha aplicação (exe). Essa aplicação tem um form principal (frmPrincipal) que tem um único botão nele. Esse botão tem o seguinte código:

var
  PackageModule : HModule;
  AClass : TPersistentClass;
begin
  PackageModule := LoadPackage(´bLogin.bpl´);
  if PackageModule <> 0 then
  begin
    AClass := GetClass(´TfrmLogin´);
    if AClass <> nil then
      with TComponentClass(AClass).Create(Application)
        as TCustomForm do
      begin
        ShowModal;
        Free;
      end;
    UnloadPackage(PackageModule);
  end;
end;


Usando isso, eu consigo abrir o form que está na bLogin. O form da bLogin acessa bonitinho o banco de dados. Porém, eu não sei fazer os dois se comunicarem. Ou seja, não sei fazer o form que está na bpl ´enxergar´ a constante que tem no form da aplicação. Entre outras coisas.

Na verdade, isso que eu coloquei aí é tudo que eu consegui até agora... Não é muito, mas já é um começo.

Abraço!


Responder

16/07/2008

Davicarrano

é tão necessário assim não criar um link entre sua aplicacao e as bpl´s?
pq sem a criação desse link, realmente a aplicacao não conhece a bpl...essa forma q vc carregou a bpl trabalha assim, pra contornar isso vc conseguiria usando interface q seria implementada pela bpl mas tb conhecida pela aplicacao .... eu questiono isso pq tem como vc não compilar as bpl´s junto com o exe(tornando o exe pequeno e fazendo com q alterações na bpl não necessitem q se compile o exe novamente,somente a bpl - a nao ser q a alteração seja em alguma declaração de metodo q o exe chama explicitamente) mas sim criar um link, onde a aplicacao fica conhecendo as bpl´s.... vamos devagar q a gente chega na solucao ideal...


Responder

16/07/2008

Powerslave7

Xiii cara... To ficando mais perdido...

O que vc chama de link?

Não é que seja vital não criar esse link, mas é importante que mais de uma aplicação (exe) utilize essa bpl.

Os detalhes que não coloquei nos posts acima:
- A minha bConn eu declarei lá no Project > Options > Packages > Build with runtime packages.
- A minha bLogin está somente no uses do form principal da aplicação host (exe).

Vamos devagar que a gente consegue... rsrs
Agradeço a paciencia aí cara... :)


Responder

16/07/2008

Davicarrano

o link q digo é justamente vc colocar la no
Project > Options > Packages > Build with runtime packages..
ou seja, vc está criando o exe mas com um link pra akelas bpl´s, ou seja, o exe so vai rodar se conseguir enxergar essa bpl....
vc nao colocou o pacote da bLogin la no Build with runtime packages mas ele ta no uses do principal, isso ta fazendo com que essa bpl seja compilada junto com o exe.... entao eu sugiro q vc coloque ela tb no Build with runtime packages... dessa forma as duas bpl´s terão esse ´link´ com o exe...
ja q vc ja deu um uses da blogin no form principal, vc pode simplesmente declarar um objeto do tipo do formulario q esta la na blogin, vamos supor q é TFrmLogin, vc pode fazer assim:

var FLogin:TFrmLogin;
begin
FLogin:=TFrmLogin.create(self);
FLogin.Qualquer Property:=qualquer valor;
FLogin.Qualquer Função();
end;


vc pode passar qulquer valor, chamar qualquer função....

ahhh, e não precisa carregar a bpl com LoadPackage...


vc trabalha com as units classes tanto da blogin quanto da bconexao como se estivesses junto com o exe, dando apenas um uses na unit..... isso pq vc ja informou os pacotes no Build with runtime packages....


Responder

17/07/2008

Powerslave7

Ahhhnnn... Entendi...

Existe alguma maneira de fazer sem dar o uses na bLogin?
Porque eu não consigo fazer o formulário abrir sem que ela esteja na clausula uses...

Do jeito que vc explicou, colocando a bLogin na uses, eu não vejo vantagem... Se o exe vai compilar junto com a bpl, eu não vou ´economizar´ no tamanho dela... Certo? A bLogin vai simplesmente ser ´colada´ no executável... É isso mesmo ou eu viajei?

Eu tentei agora colocar a bLogin lá no ´Build with runtime packages´, só que eu não consigo mais abrir o formulário que está nela... =(

Abraço!


Responder

17/07/2008

Davicarrano

vc confundiu.... vc deve sim colocar no uses a blogin, so q colocar o pacote q a blogin está no ´Build with runtime packages´.... isso faz com que o exe seja construido sem essa bpl ser inserida nele, somente um ´link´ como eu ja havia dito.... e com ele no uses da principal, fica simples usar, é como se estivesse no proprio projeto da exe.....


Responder

17/07/2008

Powerslave7

Ahhhnnn... Entendi!
E assim se faz com todas as bpls?

Se é simples assim, porque essa complicação toda que a gente ve de ´LoadPackage´ e etc? Só pra complicar o meio de campo? rsrs...

Rapaz! Obrigado mesmo pela ajuda! Tá sendo de grande utilidade!

Qualquer dúvida eu volto aqui no fórum...

Abraço!


Responder

17/07/2008

Davicarrano

vou te contar o q aconteceu no seu primeiro exemplo....

var
  PackageModule : HModule;
  AClass : TPersistentClass;
begin
  PackageModule := LoadPackage(´bLogin.bpl´);
  if PackageModule <> 0 then
  begin
    AClass := GetClass(´TfrmLogin´);
    if AClass <> nil then
      with TComponentClass(AClass).Create(Application)
        as TCustomForm do
      begin
        ShowModal;
        Free;
      end;
    UnloadPackage(PackageModule);
  end;
end; 




vc so conseguiu chamar esse formulario do login, pq vc tinha colocado no uses do principal a unit do login.... dessa forma vc compilou a bpl do login junto com o exe, se quiser pode fazer até um teste, olha o tamanho do exe gerado, depois tira do uses do principal a unit do login e compila denovo, o exe vai diminuir.... e se vc tirar do uses a unit do login, não vai conseguir chamar, mesmo com o load package....isso pq o progarama.exe não conhece o q está dentro do bpl, então AClass := GetClass(´TfrmLogin´); vai retornar nil.... to te mostrando que a função LoadPackage, ta desnecessária pq o pacote foi carregado junto com o exe ja.... tanto é q o seguinte codigo vai funcionar da mesma forma
  AClass : TPersistentClass;
begin
    AClass := GetClass(´TfrmLogin´);
    if AClass <> nil then
      with TComponentClass(AClass).Create(Application)
        as TCustomForm do
      begin
        ShowModal;
        Free;
      end;
end; 



quero q vc entenda o q o loadpackage realmente faz, e como saber se vc o está utilizando corretamente...
o loadpackage carrega um pacote que esteja desvinculado do seu exe, mas não é pelo fato de ter carregado que o seu exe ja passa a conhecer td q tem dentro do bpl.... pra q isso seja alcançado vc tem q utilizar interfaces, tb sei como fazer, mas é um pouco mais complicado.... por isso te sujeri, colocar os pacotes no ´Build with runtime packages´, e usar eles na aplicação colocando somente no uses.... a desvantage dessa forma de trabalhar é q os pacotes serão carregados assim q a aplicação rodar, todos os pacotes, tanto q se tiver faltando algum ela nao roda.... e com o loadpackage o pacote só carrega na hora que a função for chamada....
[/code]


Responder

17/07/2008

Powerslave7

Eu cheguei a ver alguma coisa de Interface em Java... Mas como não trabalho com Java há muito tempo, o conceito enferrujou na minha cabeça.

Confesso que desconhecia que o Delphi era tão ´amplo´ assim. Acho que to precisando de atualização... rsrs

Pelo que eu to vendo, a maior vantagem mesmo é usar o LoadPackage e usar inteface, para que o executável se comunique de maneira eficiente com a bpl e o aproveitamento da memória seja o melhor possivel. Mas acredito que isso envolva conceito 100¬ de OO... Certo?

Abraço.


Responder

17/07/2008

Davicarrano

com certeza....


Responder

17/07/2008

Powerslave7

Ah tá...

Só mais uma perguntinha...
É obrigatório que a bpl esteja na mesma pasta do executável?

Por exemplo:
Ao inves de minha estrutura de pasta ficar assim:
C:\Empresa\Sistemas\App.exe
C:\Empresa\Sisteams\bConn.bpl

Eu queria que ficasse assim:
C:\Empresa\Sistemas\App.exe
C:\Empresa\Sistemas\lib\bConn.bpl

Tem como? Eu to tentando, mas ele diz que não acha a bConn.


Responder

17/07/2008

Davicarrano

se vc colocar no path do windows o caminho onde a bpl vai ficar funciona.....
essa localização das bpl´s segue a mesma regra das dll´s... procura primeiro na pasta do exe e depois nas pastas que estão no path do windows.....


Responder

17/07/2008

Davicarrano

fiz todos os testes aki, e pra corrigir até algumas coisas q eu disse anteriormente, elaborei esse explicativo....

* Aplicacao EXE sem Build with runtime Package
- se nao usar unit do pacote, compila o exe sem o bpl, permite o LoadPackage mas nao encherga as classes dele
- se usar unit do pacote, compila o exe com o bpl incluido, nao necessita usar o LoadPackage, e acessa todas as funcionalidades do bpl

* Aplicacao EXE com Build with runtime Package
+ nao informei o bpl na lista do ´Build with runtime Package´
- se usar unit do pacote, compila o exe com o bpl incluido, nao necessita usar o LoadPackage, e acessa todas as funcionalidades do bpl
- se nao usar unit do pacote, compila o exe sem o bpl, permite o LoadPackage e acessa todas as funcionalidades do bpl

/* quando se compila o exe o pacote nao é compilado automaticamente

+ informei o bpl na lista do ´Build with runtime Package´
- se usar unit do pacote, compila o exe sem o bpl, nao necessita usar o LoadPackage (o pacote sera carregado ao abrir o programa e carregar essa unit dele), e acessa todas as funcionalidades do bpl
- se nao usar unit do pacote, compila o exe sem o bpl, e necessita chamar o LoadPackage e acessa todas as funcionalidades do bpl

/* quando se compila o exe o pacote tb é compilado automaticamente


Responder

17/07/2008

Davicarrano

vou repetir o post anterior pq ficou sem a identação... vou colocar niveis...



1- Aplicacao EXE sem Build with runtime Package
1.1- se nao usar unit do pacote, compila o exe sem o bpl, permite o LoadPackage mas nao encherga as classes dele
1.2- se usar unit do pacote, compila o exe com o bpl incluido, nao necessita usar o LoadPackage, e acessa todas as funcionalidades do bpl

2- Aplicacao EXE com Build with runtime Package
2.1 nao informei o bpl na lista do ´Build with runtime Package´
2.1.1 se usar unit do pacote, compila o exe com o bpl incluido, nao necessita usar o LoadPackage, e acessa todas as funcionalidades do bpl
2.1.2 se nao usar unit do pacote, compila o exe sem o bpl, permite o LoadPackage e acessa todas as funcionalidades do bpl
2.1.3 quando se compila o exe o pacote nao é compilado automaticamente

2.2 informei o bpl na lista do ´Build with runtime Package´
2.2.1- se usar unit do pacote, compila o exe sem o bpl, nao necessita usar o LoadPackage (o pacote sera carregado ao abrir o programa e carregar essa unit dele), e acessa todas as funcionalidades do bpl
2.2.2 se nao usar unit do pacote, compila o exe sem o bpl, e necessita chamar o LoadPackage e acessa todas as funcionalidades do bpl

2.2.3 quando se compila o exe o pacote tb é compilado automaticamente


Responder