Usar componentes de um Form em Outro

Delphi

15/03/2005

Olá pessoal do Forum, tudo Blz;

Gostaria de usar um componente (DBGRID) de um formulario que foi criado em tempo de execucao, mas estou posiconado em outro Formulario, e ai me dá um erro.
Se alguem souber eu agradeço.

Estou chamando os formularios com o seguinte Codigo:

FormClass := TFormClass(GetClass(´TFORMULARIO´));
Form := FormClass.Create(Application);
Form.Name := ´FORMULARIO´;
Form.Show;

Isaiasn


Isaiasn

Isaiasn

Curtidas 0

Respostas

Massuda

Massuda

15/03/2005

FormClass := TFormClass(GetClass(´TFORMULARIO´)); Form := FormClass.Create(Application); Form.Name := ´FORMULARIO´; Form.Show;
Não sei se esse é o problema, mas não há necessidade de atribuir um nome ao form, ou seja, deixe o Form.Name em branco. O Delphi não irá permitir que você tenha dois forms com o mesmo Form.Name. Se você realmente precisar dar nomes aos forms criados dinamicamente, gere um nome diferente para cado form criado dinamicamente.


GOSTEI 0
Somar

Somar

15/03/2005

Se eu entendi ..

crie um frame para o dbgrid e assim vc pode colocar em qualquer form.


GOSTEI 0
Silviogs

Silviogs

15/03/2005

Olá amigo,

não sei se entendi, mas se vc está usando formluário padrão e depois outros formulários usarem os memos componentes do padrão, se for isto crie o novo form herdando o form padrão. Neste caso todos os componentes serão utilizadosno novo form. Caso contrário favor explicar melhor a sua dúvida para que possamos lhe ajudar.

Atenciosamente


Silvio Guedes


GOSTEI 0
Isaiasn

Isaiasn

15/03/2005

Deixa eu explicar melhor

Estou posicionado em um formulario e quero usar um componente que esta em outro formulario

Ex. Estou posicionado no F_Estado e quero dar o seguinte comando:

if F_Cadastro.DGgrib.SelectRows > 0 then
begin
end;

Como que o F_Cadastro foi criado em tempo de execucao, ele da erro.

Obrigado.


GOSTEI 0
Isaiasn

Isaiasn

15/03/2005

Olá Amigos, acho que ainda nao fui muito claro.
Acho que agora vai dar para entender.

Eu quero usar as propriedades do Form1 e nao consigo:

if Form1.Grid.SelectedRows > 1 then
begin
end

ou

if Form1.Tag = 10 then
begin
end

Ai me da o famosso erro (Access Violation);

OBS: Chamo o Form1 assim:

FormClass := TFormClass(FindClass(´T´+Form1));
Formulario := FormClass.Create(Application);
Formulario.Name := Form1;
Formulario.ShowModal;

Obrigado pela Atenção
Isaias


GOSTEI 0
Massuda

Massuda

15/03/2005

FormClass := TFormClass(FindClass(´T´+Form1)); Formulario := FormClass.Create(Application); Formulario.Name := Form1; Formulario.ShowModal;
Analisando esse pedaço de código, dá para perceber que, nesse contexto, Form1 é na verdade uma variável do tipo string e não do tipo TForm (ou derivado). Quando você faz....
Formulario.Name := Form1;
...você está atribuindo o nome contido na string Form1 (que pode ser qualquer coisa) ao form referenciado pela variável Formulario.

Como o compilador só conhece as variáveis e não o conteúdo das variáveis quando vai gerar o código, este trecho...
if Form1.Grid.SelectedRows > 1 then begin end ou if Form1.Tag = 10 then begin end
se refere à variável Form1 do tipo TForm (ou derivado), não ao form criado através da variável Formulario.

Para seu código funcionar como você espera, seria preciso atribuir o valor de Formulario à Form1; se você tem múltiplos forms da mesma classe simultaneamente, então não deveria usar uma única variável global para receber todos os forms.

Não sei se ficou claro, qualquer dúvida posta aqui.


GOSTEI 0
Isaiasn

Isaiasn

15/03/2005

Para seu código funcionar como você espera, seria preciso atribuir o valor de Formulario à Form1; se você tem múltiplos forms da mesma classe simultaneamente, então não deveria usar uma única variável global para receber todos os forms.

Olá Massuda, realmente o Form1 é uma String, mas existe um formulario na Classe com o Nome de Form1.

Então como eu atribuo o valor de formulario a Form1.

Obrigado.
Isaiasn


GOSTEI 0
Massuda

Massuda

15/03/2005

...como eu atribuo o valor de formulario a Form1.
Posta aqui sua procedure/function onde você está criando o form usando a variável Formulario.


GOSTEI 0
Isaiasn

Isaiasn

15/03/2005

Eis ai a rotina....

procedure TF_Menu.ChamaClick(Sender: TObject);
Var
FormClass : TformClass;
Formulario : TForm;
begin

FormClass := TFormClass(FindClass(´T´+Form1));
Formulario := FormClass.Create(Application);
Formulario.Name := Form1;
Try
Formulario.ShowModal;
Finally
Formulario.Free;
Formulario:=Nil;
end;

end;

Obrigado pela atenção.
Isaiasn


GOSTEI 0
Massuda

Massuda

15/03/2005

Eis ai a rotina....
O form criado nessa procedure só existe durante a execução da procedure, já que ele é criado e destruído dentro da própria procedure.

Como o form é exibido usando ShowModal, a princípio nenhuma outra parte de seu programa seria executada, exceto a do form que está visível e, totalmente desaconselhável, código executado por reentrância. Note que o problema não é o ShowModal.

Imagino que você esteja tentando acessar o form depois dele ter sido destruído. O problema é[list=1:f5d3be4080][*:f5d3be4080]O form já foi destruído[*:f5d3be4080]A variável que você está usando para acessar o form provavelmente nunca recebeu uma referência válida a um form[/list:o:f5d3be4080]Uma solução possível seria, antes de destruir o form Formulario, copiar as informações que você precisa para alguma variável e posteriormente reutilizar essas informações.


GOSTEI 0
Isaiasn

Isaiasn

15/03/2005

Olá Massuda, eu queria usar as propriedades do Form1 que ainda esta visilvel, e nao depois de destruilo.

Depois que eu crio ele e dou um ShowModal quero usar as propriedades do Formulario que ainda esta na Tela.

Ex:
if Form1.Tag = 10 then
begin
end

Ai ele me da a mensagem (Access Violation)

Obrigado.


GOSTEI 0
Massuda

Massuda

15/03/2005

Você está tentando fazer isso...
if Form1.Tag = 10 then begin end
... onde exatamente? Isso é parte do código do form que foi criado pea procedure TF_Menu.ChamaClick? Ou é parte do código de outro form?


GOSTEI 0
Isaiasn

Isaiasn

15/03/2005

Você está tentando fazer isso...[quote:9a2ca42c30=´isaiasn´]if Form1.Tag = 10 then begin end
... onde exatamente? Isso é parte do código do form que foi criado pea procedure TF_Menu.ChamaClick? Ou é parte do código de outro form?[/quote:9a2ca42c30]

É do Form1 que foi criado pela procedure, e que esta sendo executado.

Ate +


GOSTEI 0
Massuda

Massuda

15/03/2005

É do Form1 que foi criado pela procedure, e que esta sendo executado.
Bom... se você está tentando acessar o form Form1 dentro do código da mesma classe TForm1, então você não precisa da variável Form1; isso deveria servir...
procedure TForm1.AlgumaProcedure;
begin
  if Tag = 10 then begin 
    // faz alguma coisa
  end;
end;



GOSTEI 0
POSTAR