Trabalhando com Pacotes em Delphi
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.
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
Curtidas 0
Respostas
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:
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?
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
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.
- 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
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
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