Trabalhando com Pacotes em Delphi

Delphi

01/10/2008

Bom dia a Todos.
Estou ingressando nesse forum agora, e já trago um problema bem complicado... pelomenos pra mim.
Estou começando a trabalhar com Pacotes em Delphi para modularizar um sistema e tenho encontrado várias barreiras, uma delas é a falta de material de pesquisa. Mas vamos lá, o problema hoje é:
Presiso fazer uma referencia circular entre dois pacotes que criei, por exemplo:
Criei os pacotes P01 e P02, onde, P01 referencia o P02 e o P02 referencia o P01.
Porem quando P02 referencia o P01 e tento compilar o pacote P02 recebo o seguinte erro: ´[Error] P02.dpk(54): Package ´P02´ already contains unit ´Unit1´´
Se alguem puder me ajudar, por favor, isso é muito urgente pra mim hoje.


Albervan

Albervan

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

01/10/2008

para usar essa referencia cíclica, você precisa adicionar um dos pacotes na cláusula requires do outro pacote.

usando seu exemplo, seria assim:
P01.dpk
 |
 +-- contains
 |     +--- unit1.pas
 |     +--- unit2.pas
 |     +--- unit3.pas
 |
 +-- requires
       +--- rtl.dcp

P02.dpk
 +-- contains
 |     +--- unit1.pas
 |     +--- unit4.pas
 |     +--- unit5.pas
 |
 +-- requires
       +--- rtl.dcp
       +--- P01.dcp

note que o pacote P01 contém [i:e788855f7d]unit1.pas[/i:e788855f7d], [i:e788855f7d]unit2.pas[/i:e788855f7d] e [i:e788855f7d]unit3.pas[/i:e788855f7d].
o pacote P02 contém [i:e788855f7d]unit1.pas[/i:e788855f7d], [i:e788855f7d]unit4.pas[/i:e788855f7d] e [i:e788855f7d]unit5.pas[/i:e788855f7d].

a [i:e788855f7d]unit1[/i:e788855f7d] é comum aos dois pacotes, porém, no pacote P02 foi indicado o uso do P01 na cláusula [i:e788855f7d]requires[/i:e788855f7d]. assim, o compilador procura pelas units nos pacotes refereciados ali na cláusula [i:e788855f7d]requires[/i:e788855f7d].

então as units [i:e788855f7d]unit4[/i:e788855f7d] e [i:e788855f7d]unit5[/i:e788855f7d] serão compiladas dentro de P02, porém a [i:e788855f7d]unit1[/i:e788855f7d] será utilizada a partir do P01, sendo somente referenciada no P02.

dessa forma, ele saberá que a unit1.pas será obtida do pacote P01 e não irá gerar erro em tempo de compilação.

deu pra entender?


GOSTEI 0
Albervan

Albervan

01/10/2008

Olá Emerson, muito obrigado pela dica, mas talvez isso não resolva o meu problema. Veja bem, a situação é a seguinte:
- A Unit1.pas do P01.dpk é uma unit de funções somente, sendo usada em praticamente todos os pacotes do sistema, tendo variáveis globais e etc;
- A Unit4.pas do P02.dpk é um formulário de busca;
- Na Unit1.pas tenho uma função que abre esse formulário Unit4.pas e recebe o valor que foi selecionado nele, retornando o valor para onde a função foi chamada, porem no formulário Unit4.pas eu utilizo outras funções da Unit1.pas;

A principio estou dividindo essa unit de funções em várias units dentro dos pacotes especificos, mas não vejo essa solução como a melhor, ainda acredito que tenha uma outra forma de fazer isso, só não conheço... hehehe...

Caso voce tenha alguma idéia melhor, fico grato.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

01/10/2008

ponha a unit1 e a unit4 no mesmo pacote ou referencie também o P02 na cláusula [i:f0c79f4495]requires[/i:f0c79f4495] do P01.


GOSTEI 0
Albervan

Albervan

01/10/2008

Realmente a solução que eu encontrei foi juntar a Unit com o formulário, pois se eu refereciar os pacotes ciclicamente, não consigo compilar.


GOSTEI 0
POSTAR