Erro ao abrir Form pela classe

Delphi

08/07/2014

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

Everton Carlesso

Curtidas 0

Respostas

Valquiria Silva

Valquiria Silva

08/07/2014

Use assim

   Self.Edit1.Text := '1';
GOSTEI 0
Everton Carlesso

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.
GOSTEI 0
Valquiria Silva

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

   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

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:
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
POSTAR