Visibilidade(escopo) em componentes

Delphi

09/11/2006

Bom dia Pessoal!

Sou novo aqui no fórum e estou com um probleminha em um componente que estou dando manutenção.

Acontece que meu componente guarda a classe de um Form e o cria em um método internamente. O problema é que perco toda a visibilidade da clausula Uses do form que guardei após criar este mesmo form. Não consigo acessar variáveis que estão em outros forms ligados pela cláusula Uses:

Código que estou usando no componente:
..
private
FFormDetail : TFormClass;
procedure setFormDetail(const Value : TFormClass);
public
vFormDetail : TForm;
procedure CreateFormDetail;
published
Property FormDetail : TFormClass read FFormDetail write setFormDetail;

...

procedure setFormDetail(const Value: TFormClass);
begin
if (FFormDetail <> Value) then
begin
FFormDetail := Value;
if (not(csDesigning in ComponentState)) and (vFormDetail <> nil) then
begin
FOnFormClose := vFormDetail.OnClose;
vFormDetail.OnClose := FormClose;
end;
end;
end;

procedure CreateFormDetail;
begin
try
if vFormDetail = nil then
begin
vFormDetail := FormDetail.Create(Self); {Esse Form vai perder a visibilidade da cláusula uses}
FOnFormClose := vFormDetail.OnClose;
vFormDetail.OnClose := FormClose;
vFormDetail.ShowModal;
end
else
begin
vFormDetail.ShowModal;
end;
finally
vFormDetail.close;
end;
end;

...


Será que alguém sabe o que estou fazendo de errado?
Agradeço qualquer comentário !


Bueno.box

Bueno.box

Curtidas 0

Respostas

Massuda

Massuda

09/11/2006

vFormDetail := FormDetail.Create(Self); {Esse Form vai perder a visibilidade da cláusula uses}
Não entendi o que você quis dizer com ´visibilidade da cláusula uses´. Poderia explicar melhor?


GOSTEI 0
Bueno.box

Bueno.box

09/11/2006

Quando eu crio o form, eu perco as referências da Cláusula Uses. Eu não consigo Por Excemplo acessar variáveis de outro form declarado na cláusula Uses:

Exemplo:

{Tenho o Form de classe Tform e passo ele para o componente, o qual irá criá-lo}

TForm
.
.
uses U_FormAmigo {nome F_FormAmigo com variavel teste declarada}

...

Não consigo acessar por exemplo a variável F_FormAmigo.teste do Form criado.

Não sei se consegui esclarecer mas é isso que acontece.
Se vc souber de algo que possa fazer para resolver isso, por favor responda!
Obrigado


GOSTEI 0
Massuda

Massuda

09/11/2006

Não consigo acessar por exemplo a variável F_FormAmigo.teste do Form criado.
Continuo sem entender. Por favor, coloque o código que dá problema ou que você acha que deveria funcionar.


GOSTEI 0
Bueno.box

Bueno.box

09/11/2006

é o seguinte ... vou tentar explicar

Tenho um componente que desenvolvi que cria um Form.
Esse form eu passo para o componente em forma de Classe.
Quando o componente cria o form passado, perde-se as referências do form. Assim, vasmos dizer que o form fica isolado na aplicação (não conhece mais ninguém que declarei na cláusula uses anteriormente).

Os Códigos para criar o form eu postei acima e queria saber se estou fazendo algo errado ou acontece isso mesmo.


GOSTEI 0
Massuda

Massuda

09/11/2006

Baseado no que entendi...

Note que você declara vFormDetail como sendo um TForm. Não importa qual seja a classe de form que você use na hora de criar o form, pelas regras da linguagem vFormDetail será sempre um TForm.

Vamos supor que a classe usada para criar o seu vFormDetail seja TSeuForm que implementa o método FazAlgo. Este código não compila...
var
  vFormDetail: TForm;
...
  vFormDetail := TSeuForm.Create(...);
  vFormDetail.FazAlgo;
...
...simplesmente porque vFormDetail é um TForm e TForm não tem o método FazAlgo.

Soluções possíveis:[list:cad1109ef5][*:cad1109ef5]declarar vFormDetail como sendo do mesmo tipo do form que está sendo criado, mas isso não me parece ser a idéia desse código que você postou[*:cad1109ef5]declarar vFormDetail como sendo de uma classe derivada de TForm que sirva de base para os forms usados no seu programa[*:cad1109ef5]testar se vFormDetail é de determinada classe (use o operador [b:cad1109ef5]is[/b:cad1109ef5]) e então fazer o typecast apropriado para poder acessar os métodos/membros específicos dessa classe[/list:u:cad1109ef5]

Não é possível fazer cast


GOSTEI 0
POSTAR