Abrir form

Delphi

15/09/2005

Oi,

eu utlizo o seguinte código para criar o form

if frmPessoaProcura = nil then
 application.CreateForm(TfrmPessoaProcura,frmPessoaProcura)
 else frmPessoaProcura.show;


até aí tudo bem

depois eu fiz uma função que fará uma verificação e depois executara o código acima

Procedure Abrirfrm(VTform:TcomponentClass; Vform: Tform; Vacesso:string);
begin
//verificar acesso
if Vacesso <> ´´ then
begin
 //fazer a verificação
 if module.TableVUsuario.FieldByName(Vacesso).AsBoolean <> true then
 begin
 messagedlg(´Acesso restrito, para acessar está funcão contate o administrador do sistema´,mtwarning,[mbok],0);
 exit;
 end;
end;
if Vform = nil then
application.CreateForm(VTform, Vform) else
Vform.Show;
end;


e chamo da seguinte maneira

abrirfrm(TFrmPessoaCadastro,FrmPessoaCadastro,´GUFPESSOA´);
frmpessoacadastro.pessoa = ´CLIENTE´;


O FORM ABRE NORMAL, porém a próxima linha da erro, como se form frmpessacadastro não tivesse sido criado


Sistemald

Sistemald

Curtidas 0

Respostas

Massuda

Massuda

15/09/2005

Mude a sua procedure que cria o form de...
Procedure Abrirfrm(VTform:TcomponentClass; Vform: Tform; Vacesso:string);
...para...
Procedure Abrirfrm(VTform:TcomponentClass; var Vform: Tform; Vacesso:string);

O [b:cc7ca37fb6]var[/b:cc7ca37fb6] vai fazer com que o form criado dentro da procedure seja retornado no parametro Vform; sem o [b:cc7ca37fb6]var[/b:cc7ca37fb6], esse valor não é retornado (já pensou em fazer uma function ao invés de uma procedure?).


GOSTEI 0
Sistemald

Sistemald

15/09/2005

Fiz a tróca, mas passou a dar erro em todas as linha onde chamo a procedure

[Error] UnitPrincipal.pas(609): Types of actual and formal var parameters must be identical


Devo mudar a chamada a procedure?


GOSTEI 0
Massuda

Massuda

15/09/2005

Devo mudar a chamada a procedure?
Acho que o mais fácil seria mudar para uma function. Algo assim...
function Abrirfrm(VTform:TcomponentClass; Vform: TForm; Vacesso:string): Tform;
begin 
  //verificar acesso 
....

  if Vform = nil then 
    application.CreateForm(VTform, Vform) else 
  Vform.Show;

  Result := vform; 
end;



GOSTEI 0
Sistemald

Sistemald

15/09/2005

desculpa minha falta de conhecimento.... :oops:

Fiz a troca para função

mas na chamada devo fazer

frmpessoacadastro:= abrirfrm(TfrmPessoacadastro,frmpessoacadastro,´guf´);
frmpessoacadastro.pessoa:= ´cliente´;



GOSTEI 0
Marco Salles

Marco Salles

15/09/2005

[b:f6c8064afc]Troque [/b:f6c8064afc]

Procedure Abrirfrm(VTform:TcomponentClass; Vform: Tform; Vacesso:string);


[b:f6c8064afc]por [/b:f6c8064afc]

[b:f6c8064afc]Procedure Abrirfrm(VTform:TcomponentClass;var Vform; Vacesso:string); [/b:f6c8064afc]

Ficando assim :

Procedure Abrirfrm(VTform:TcomponentClass;var Vform; Vacesso:string); 
begin 
//verificar acesso 
if Vacesso <> ´´ then 
begin 
 //fazer a verificação 
 if module.TableVUsuario.FieldByName(Vacesso).AsBoolean <> true then 
 begin 
 messagedlg(´Acesso restrito, para acessar está funcão contate o administrador do sistema´,mtwarning,[mbok],0); 
 exit; 
 end; 
end; 
if Vform = nil then 
application.CreateForm(VTform, Vform) else 
Vform.Show; 
end;


A Chamada não precisa alterar ;
Código:
abrirfrm(TFrmPessoaCadastro,FrmPessoaCadastro,´GUFPESSOA´); 
frmpessoacadastro.pessoa = ´CLIENTE´;



GOSTEI 0
Sistemald

Sistemald

15/09/2005

O problema que eu uso, herança no forms.


se eu fizer isto
frmpessoacadastro:= abrirfrm(TFrmPessoaCadastro,FrmPessoaCadastro,´GUFPESSOA´);


da Incomplatibes types Tform and Tfrmpessoacadastro.

se usar um var temporaria como vou acessar uma var publica do form acima???


GOSTEI 0
Sistemald

Sistemald

15/09/2005

Caro Marcos Salles

essa dica Massuda me passou, porém deu o seguinte problema:

[Error] UnitPrincipal.pas(609): Types of actual and formal var parameters must be identical



GOSTEI 0
Massuda

Massuda

15/09/2005

...na chamada devo fazer...
Sim. Ficou esquisito, mas foi o jeito de aproveitar o código que você já tem.

...Incomplatibes types Tform and Tfrmpessoacadastro.
Esse erro (de compilação) dá porque estamos tentando atribuir um objeto de uma classe pai para uma variável de uma classe filho. Teria que fazer um typecast...
frmpessoacadastro:= abrirfrm(TFrmPessoaCadastro,FrmPessoaCadastro,´GUFPESSOA´) as TFrmPessoaCadastro;

// OU

frmpessoacadastro:= TFrmPessoaCadastro( abrirfrm(TFrmPessoaCadastro,FrmPessoaCadastro,´GUFPESSOA´) );



GOSTEI 0
Sistemald

Sistemald

15/09/2005

Bingo!!!!!!!!


Problema resolvido, sabia que teria que fazer um Typecast, só não sabia como.


Valeu galera pela atenção.

Muito Obrigado.


GOSTEI 0
Marco Salles

Marco Salles

15/09/2005

Caro Marcos Salles essa dica Massuda me passou, porém deu o seguinte problema: Citação: [Error] UnitPrincipal.pas(609): Types of actual and formal var parameters must be identical


caro sistemald Sei que o problema seu foi resolvido , mas acho que voce se enganou com relação ao que eu lhe passei.. [b:9973e5741b]Ha uma pequena diferença nas postagems[/b:9973e5741b]

Veja :

sistemald
Procedure Abrirfrm(VTform:TcomponentClass; Vform: Tform; Vacesso:string);


massuda
Procedure Abrirfrm(VTform:TcomponentClass; var Vform: Tform; Vacesso:string);


Marco salles escreveu
Procedure Abrirfrm(VTform:TcomponentClass;var Vform; Vacesso:string);


[b:9973e5741b]Do seu jeito inicial voce com certeza consegueria resolver também[/b:9973e5741b]


GOSTEI 0
Sistemald

Sistemald

15/09/2005

Verdade, a uma diferença, peço desculpa, uma diferença tão pequena, mas faz uma grande diferença,

Vou testar do jeito que você me falou, talvez fique melhor!

Obrigado novamente!!!

:D


GOSTEI 0
Sistemald

Sistemald

15/09/2005

Marcos

Olhe fiz a troca mas o seguinte trecho não funcionou:

if Vform = nil then  <- Icompatible types
application.CreateForm(VTform, Vform) else 
Vform.Show; <- record, object or class type required
end;


Tem alguma idéia


GOSTEI 0
Sistemald

Sistemald

15/09/2005

sobe...


GOSTEI 0
Sistemald

Sistemald

15/09/2005

Resolvi o problema, mas creio que nã seja a melhor forma, mas por enquanto ficará essa mesmo.

Procedure Abrirfrm(VTform:TcomponentClass; var Vform; Vacesso:string);
var
i:integer;
criado:boolean;
begin
criado:= False;
//verificar acesso
if not veracesso(Vacesso) then
exit;
//agora vai abrir o form
//if Vform = nil then
for I:=0 to application.ComponentCount - 1 do
begin
if application.Components[i] is VtForm then
begin
(application.Components[i] as Tform).Show;
criado:= true;
end;
end;
if criado = False then
application.CreateForm(VTform, Vform);
end;



GOSTEI 0
Martins

Martins

15/09/2005

Uma perguntinha besta sô, lá vai...

pessoa é uma variável pública ou o q?

só apra eu me situar!

valew!!!


GOSTEI 0
Sistemald

Sistemald

15/09/2005

Pessoa é uma var publica que foi declardo na unit unitpessoacadastro(frmPessoaCadastro).


GOSTEI 0
Martins

Martins

15/09/2005

Pessoa é uma var publica que foi declardo na unit unitpessoacadastro(frmPessoaCadastro).


Ah!!!
tudo bem, e quais valores vc passa para essa variável posso saber?

Outra pergunta seus Forms estão em Avaiable Forms?


GOSTEI 0
POSTAR