Abrir form
Oi,
eu utlizo o seguinte código para criar o form
até aí tudo bem
depois eu fiz uma função que fará uma verificação e depois executara o código acima
e chamo da seguinte maneira
O FORM ABRE NORMAL, porém a próxima linha da erro, como se form frmpessacadastro não tivesse sido criado
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
Curtidas 0
Respostas
Massuda
15/09/2005
Mude a sua procedure que cria o form de......para...
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?).
Procedure Abrirfrm(VTform:TcomponentClass; Vform: Tform; Vacesso:string);
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
15/09/2005
Fiz a tróca, mas passou a dar erro em todas as linha onde chamo a procedure
Devo mudar a chamada 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
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
15/09/2005
desculpa minha falta de conhecimento.... :oops:
Fiz a troca para função
mas na chamada devo fazer
Fiz a troca para função
mas na chamada devo fazer
frmpessoacadastro:= abrirfrm(TfrmPessoacadastro,frmpessoacadastro,´guf´); frmpessoacadastro.pessoa:= ´cliente´;
GOSTEI 0
Marco Salles
15/09/2005
[b:f6c8064afc]Troque [/b:f6c8064afc]
[b:f6c8064afc]por [/b:f6c8064afc]
[b:f6c8064afc]Procedure Abrirfrm(VTform:TcomponentClass;var Vform; Vacesso:string); [/b:f6c8064afc]
Ficando assim :
A Chamada não precisa alterar ;
Código:
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
15/09/2005
O problema que eu uso, herança no forms.
se eu fizer isto
da Incomplatibes types Tform and Tfrmpessoacadastro.
se usar um var temporaria como vou acessar uma var publica do form acima???
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
15/09/2005
Caro Marcos Salles
essa dica Massuda me passou, porém deu o seguinte problema:
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
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
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.
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
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
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
Vou testar do jeito que você me falou, talvez fique melhor!
Obrigado novamente!!!
:D
GOSTEI 0
Sistemald
15/09/2005
Marcos
Olhe fiz a troca mas o seguinte trecho não funcionou:
Tem alguma idéia
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
15/09/2005
sobe...
GOSTEI 0
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
15/09/2005
Uma perguntinha besta sô, lá vai...
pessoa é uma variável pública ou o q?
só apra eu me situar!
valew!!!
pessoa é uma variável pública ou o q?
só apra eu me situar!
valew!!!
GOSTEI 0
Sistemald
15/09/2005
Pessoa é uma var publica que foi declardo na unit unitpessoacadastro(frmPessoaCadastro).
GOSTEI 0
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