Erro ao abrir Form pela classe
Boa tarde!
Tenho uma função para abrir form dinamicamente pela classe, funciona, o form abre, porém, no evento onshow do form tenho um codigo
ex: Nome do Form FOrcamento
Quando passa por essa parte da erro de access violation porque o FOrcamento não está aberto, ou instanciado, não sei pq, é ai que está meu problema.
o código para abrir o form é o seguinte:
Por favor quem puder ajudar, estou precisando com certa urgencia.
Tenho uma função para abrir form dinamicamente pela classe, funciona, o form abre, porém, no evento onshow do form tenho um codigo
ex: Nome do Form FOrcamento
FOrcamento.Edit1.Text := '1';
Quando passa por essa parte da erro de access violation porque o FOrcamento não está aberto, ou instanciado, não sei pq, é ai que está meu problema.
o código para abrir o form é o seguinte:
procedure abrirtela;
var
Tela : TForm;
TClasse : TFormClass;
begin
TClasse := TFormClass(FindClass('TFOrcamento'));
application.CreateForm(TClasse,tela);
Tela.Show;
end;Por favor quem puder ajudar, estou precisando com certa urgencia.
Everton Carlesso
Curtidas 0
Respostas
Valquiria Silva
08/07/2014
Use assim
Self.Edit1.Text := '1';
GOSTEI 0
Everton Carlesso
08/07/2014
Muito obrigado Valquiria Silva... Quase deu certo, até parou de dar o erro de access violation, porém o Form FOrcamento continua = nil, ainda é como se ele não estivesse aberto.
Desse jeito tbm ficaria complicado para mim, pq eu teria que alterar todas as telas do sistema, e são mais de 900 formulários.
Obrigado pela atenção... Estou disposto a novos testes, mandem idéias por favor.
Desse jeito tbm ficaria complicado para mim, pq eu teria que alterar todas as telas do sistema, e são mais de 900 formulários.
Obrigado pela atenção... Estou disposto a novos testes, mandem idéias por favor.
GOSTEI 0
Valquiria Silva
08/07/2014
Everton, bom dia.
Sim continua nil, faça um teste com o Self, e com o FOrçamento.
Exemplo: Onshow do FOrcamento
FOrcamento continuara nil, pois não foi criado. Antes da sessão "implementation" verá algo assim:
var
Forcamento: TForcamento;
implementation
Esse var é do um obejto da classe TForcamento que não foi criado.
Quando você usa a função abretela ela instancia um outro objeto dessa mesma classe.
application.CreateForm(TClasse,tela);
Tela então é uma instancia do TForcamento.
Tudo isso pra te dizer que quando for fazer referencia ao form dentro do próprio form como no caso
use o Self, pois o Self é uma referência da classe que está se chamando ou declarando.
Abs.
Sim continua nil, faça um teste com o Self, e com o FOrçamento.
Exemplo: Onshow do FOrcamento
Self.Edit1.Text := '1'; Self.Caption:= Self.name; Forcamento.Edit1.Text := '1';
FOrcamento continuara nil, pois não foi criado. Antes da sessão "implementation" verá algo assim:
var
Forcamento: TForcamento;
implementation
Esse var é do um obejto da classe TForcamento que não foi criado.
Quando você usa a função abretela ela instancia um outro objeto dessa mesma classe.
application.CreateForm(TClasse,tela);
Tela então é uma instancia do TForcamento.
Tudo isso pra te dizer que quando for fazer referencia ao form dentro do próprio form como no caso
Forcamento.Edit1.Text := '1';
use o Self, pois o Self é uma referência da classe que está se chamando ou declarando.
Self.Edit1.Text := '1';
Abs.
GOSTEI 0
Everton Carlesso
08/07/2014
Muito obrigado pela ajuda Valquiria Silva!
Você saberia alguma forma do FOrcamento não ficar nil? para eu não precisar alterar todo o sistema.
Ex: tenho várias telas de consulta, consulta clientes, consulta loja, consulta fornecedores, etc.... e elas tem um código que usam os nomes dos forms.
Exemplo da consulta de cliente:
...
...
Cada tela de consulta tem esse tipo de código, e só nessa tela de consulta cliente tem mais umas 400 linhas desse tipo, fora as outras telas.
Se o Form 'FOrcamento', por exemplo, não ficasse nil não precisaria alterar todas as outras telas.
Desde já agradeço!
Você saberia alguma forma do FOrcamento não ficar nil? para eu não precisar alterar todo o sistema.
Ex: tenho várias telas de consulta, consulta clientes, consulta loja, consulta fornecedores, etc.... e elas tem um código que usam os nomes dos forms.
Exemplo da consulta de cliente:
if f2Principal.label1.caption = 'Orçamento.Cliente' then
FOrcamento.DBEdit3.text := QGen.fieldbyname ('Cliente').asstring;
if f2Principal.label1.caption = 'Export.Edit1' then
FExportarDados.Edit1.text := QGen.fieldbyname ('Cliente').asstring;
if f2Principal.label1.caption = 'Export.Edit2' then
FExportarDados.Edit2.text := QGen.fieldbyname ('Cliente').asstring;
if f2Principal.label1.caption = 'Email.Cliente' then
FEmail.EditPara.text := QGen.fieldbyname ('email').asstring;
if f2Principal.label1.caption = 'GeraServ.Edit1' then
FGera_Servicos.Edit1.text := QGen.fieldbyname ('Cliente').asstring;
if f2Principal.label1.caption = 'GeraServ.Edit2' then
FGera_Servicos.Edit2.text := QGen.fieldbyname ('Cliente').asstring;
if f2Principal.label1.caption = 'ReciboCob.Edit1' then
FCR_ReciboCob.Edit1.text := QGen.fieldbyname ('Cliente').asstring;...
...
Cada tela de consulta tem esse tipo de código, e só nessa tela de consulta cliente tem mais umas 400 linhas desse tipo, fora as outras telas.
Se o Form 'FOrcamento', por exemplo, não ficasse nil não precisaria alterar todas as outras telas.
Desde já agradeço!
GOSTEI 0