Array
(
)

Criar form por uma Var

Sistemald
   - 03 mar 2006

Oi

em em um form tenho as seguintes var:

#Código

var frm: TForm;
tfrm: TcomponentClass;


no oncreate do form faço o seguinte:

#Código

frm:= frmBrownseProduto;
Tfrm:= TfrmBrownseProduto;

Application.createForm(Tfrm,frm);


com ele criado, tento acessa-lo de outro form e não consigo.
por ex.:

#Código
showmessage(frmBrownseProduto.caption)


da o seguinte erro:

[list:94b5570a5b]First chance exception at @($5,$600052C,$11). Exception class System.NullReferenceException with message ´Object reference not set to an instance of an object.´. Process Marmore.exe (3016)[/list:u:94b5570a5b]

pelo que entendi o frmBrownseProduto não foi instanciado e sim o ´frm´ como posso resolver este problema?

ja tentei colocar #Código
var frm: TForm;
tfrm: TcomponentClass;
mas não deu certo


Thiago Vidal
   - 03 mar 2006

Veja se isto resolve o seu problema:

#Código

procedure TForm1.Button1Click(Sender: TObject);
var
Frm: ^TForm;
FrmClass: TComponentClass;
begin
Frm := @Form2;
FrmClass := TForm2;
Application.CreateForm(FrmClass, Frm^);
Form2.ShowModal;
end;


na verdade, foi utilizada uma variavel Frm, que é um Ponteiro para um Form, e a ela foi associado o endereço de memória da variável Form2. (Frm := @Form2;)

no Application.CreateForm, voce passa a variavel que o ponteiro aponta, e nao o ponteiro em si, para isso, o ^ após o Frm.


Marco Salles
   - 03 mar 2006

seria muito fácil eu lhe passar assim:

var
frm: TfrmBrownseProduto;
tfrm: TcomponentClass;

e no oncrete do form

Tfrm:=TfrmBrownseProduto;
Frm:=frmBrownseProduto;
Application.CreateForm(TFrm,Frm);
Frm.ShowModal;
etc...

que ira funcionar e não dara erro quando voce fizer:

showmessage(frmBrownseProduto.caption)

So que pouco talvez , va lhe ajudar , isto é , trocar seis por meia duzia..

Então se o amigo passar o que te fato ele gostaria ( Se é criar um método geral de criação de forms , se é criar forms Apenas passando o nome sem ter que ao menos declarar na unit do formulario o Nome do formulario, etc...)

Eu confesso fiquei meio sem entender o que o colega deseja e numa coisa eu concordo com voce:


Citação:
pelo que entendi o frmBrownseProduto não foi instanciado e sim o ´frm´


É vero.. Pode ate testar assingned (frmBrownseProduto) Mo ´novo frm´
que dara nill....


Sistemald
   - 04 mar 2006

vamos a explicação

eu crei um form frmpesquisa de onde é herdado todos os outros de pesquisa. e um frmdados de onde é herdados todos os outros para inclusão e edição.

no form de pesquisa precisa chamar o de edição.

então no form pai de pesquisa, coloquei as seguintes var:

#Código

frm: TForm; 
tfrm: TcomponentClass;


e no oncreate do forms derivados

dou valor a elas

#Código
frm:= frmBrownseProduto; 
Tfrm:= TfrmBrownseProduto;


e no botão incluir e alterar eu crio o form

#Código
Application.createForm(Tfrm,frm);


porém fui acessar um compenente do form deu o problema.

acredito os ponteiros que nosos colega falou deva resolver, mas estou usando vcl.net, a unica form que consegui usar pointer foi colocando
#Código
procedure qualquer; unsafe;


sendo que para usar o UNSAFE é necessário colocar uma diretiva de compilação.


Marco Salles
   - 04 mar 2006

como opção voce pode criar uma procedure generica assim

#Código

procedure CriarFomr(FrmClass:TComponentClass; var Frm);
begin
Application.CreateForm(FrmClass,Frm);
TForm(Frm).ShowModal;
TForm(Frm).Release;
end;


e para chama-la simplesmenmte assim

#Código
procedure TForm1.Button2Click(Sender: TObject);
begin
CriarFomr(Tform2,form2);
end;



Sistemald
   - 04 mar 2006

oi

não vejo como posso adptar a procedure ao meu caso, lembre-se que o poderá ser criado por 3 ou mais botões (procedimentos),

como posso fazer algo assim, eu estou instaciado na verdade é a var ´frm´ ( ex.: form1.frm) , ou seja posso usar form1.frm.caption, que funciona, como passo o endereço deste frm para o que eu quero form2.
algo assim form2:= frm;


Marco Salles
   - 04 mar 2006


Citação:
não vejo como posso adptar a procedure ao meu caso, lembre-se que o poderá ser criado por 3 ou mais botões (procedimentos),


:?: :?: :?: não lhe entendi


Citação:
como posso fazer algo assim, eu estou instaciado na verdade é a var ´frm´ ( ex.: form1.frm) ,


Da maneira que lhe passei , assim com a maneira que o thiago_vidal , lhe passou , voce esta instanciado de fato o formulario frmBrownseProduto;..

Claro que este mesmo frmBrownseProduto; ja deve ter sido previamente criado e estando em avalaible forms.. Isto é uma condição , e acredito que voce deva estar fazendo previamente assim

:arrow:
Apos ter feito isso:


#Código

CriarFomr(TfrmBrownseProduto,frmBrownseProduto);


o form criado sera de fato o frmBrownseProduto..

#Código
Bata testar apos aparecer o formulario que 
if Assigned(frmBrownseProduto) é <> nil



Em diversos botoes voce poderia fazer :


#Código
CriarForm(TMeuForm, MeuForm) que o form criado serao MeuForm


Não é isso que voce quer ???? Senão , não entendi nada



Citação:
ou seja posso usar form1.frm.caption, que funciona, como passo o endereço deste frm para o que eu quero form2.
algo assim form2:= frm;

Veja , da maneira que eu te sugeri como o parâmetro Frm é passado por valor, o form criado dentro da procedure é de fato o formulario frmBrownseProduto..

Não é isso que voce quer :?: :?: :?:


Sistemald
   - 08 mar 2006

Amigos,

valeu pelas dicas

t+