Fórum Abrir form #295638

15/09/2005

0

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

Responder

Posts

15/09/2005

Massuda

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?).


Responder

Gostei + 0

15/09/2005

Sistemald

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?


Responder

Gostei + 0

15/09/2005

Massuda

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;



Responder

Gostei + 0

15/09/2005

Sistemald

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´;



Responder

Gostei + 0

15/09/2005

Marco Salles

[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´;



Responder

Gostei + 0

15/09/2005

Sistemald

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???


Responder

Gostei + 0

15/09/2005

Sistemald

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



Responder

Gostei + 0

15/09/2005

Massuda

...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´) );



Responder

Gostei + 0

15/09/2005

Sistemald

Bingo!!!!!!!!


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


Valeu galera pela atenção.

Muito Obrigado.


Responder

Gostei + 0

15/09/2005

Marco Salles

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]


Responder

Gostei + 0

15/09/2005

Sistemald

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


Responder

Gostei + 0

11/10/2005

Sistemald

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


Responder

Gostei + 0

20/10/2005

Sistemald

sobe...


Responder

Gostei + 0

21/10/2005

Sistemald

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;



Responder

Gostei + 0

21/10/2005

Martins

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

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

só apra eu me situar!

valew!!!


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar