Dúvidas sobre erro em aplicação MDI (Formulário Pai e filhos)
Estou tendando criar uma aplicação MDI, já criei o formulário principal e os forms MDIChild
porém ao chamar uma função clicando no botão Novo, onde é chamado a função codigoauto() é
exibido o seguinte erro:
Project Projeto1.exe raised exception class EAccessViolation with message
Access violation at address 004B85FA in module Project1.exe Read of
Address 00000304. Process Stopped. Use Step or Run to continue.
Sendo que o erro se dá no ponto Frmform2.Edit1.Seltext := dm1.tabCat.Fieldvalues[Codigo]+1, ou
em qualquer referência ao Form2 com recebimento de atribuição de valor, como mostra os exemplos abaixo
var
Frmform2: TFrmform2;
implementation
uses udm1;
{$R *.dfm}
A função código automático verifica se já existem registros, se existir cria um registro com o valor do último código + 1
Function CodigoAuto(): String;
begin
dm1.tabCat.Last;
if dm1.tabCat.FieldValues[Codigo] >= 1 then
Frmform2.Edit1.Seltext := dm1.tabCat.Fieldvalues[Codigo]+1
else
Frmform2.Edit1.Seltext := 1;
dm1.tabCat.Insert;
Frmform2.Edit1.SetFocus;
end;
a outra função
A função Registroautual apresenta o código do registro atual na edit1
Function Registroatual(): String;
Var Vcod :String;
begin
begin
if Form2.Edit1.text = then
begin
Dm1.tabCat.First;
end;
end;
Vcod := dm1.tabCat.FieldValues[Codigo];
Form2.Edit1.text := Vcod;
Depois das funções vem o chamado da função no botão novo
procedure TFrmForm2.Button1Click(Sender: TObject);
begin
codigoauto();
end;
*****************************
*
* Código
* [.......]
*
* Descrição
* [.......................]
*****************************
O que ocorre é que bem na chamada da rotina Frmform2.Edit1.Seltext já é dado um erro de violação de chave
porém se logo após o function declarar novamente var Frmform2: TFrmform2; o mesmo consegue passar, mas na chamada de uma outra
função em que é refrenciado o nome do formulário dentro da função o mesmo erro ocorre, mesmo se for declarado novamente o form
o retorno que está dando no form é nil, bem se fosse um formumário SDI não necessitaria nem de declara apenas atribur o formulário
e funcionaria normalmentee, porém com o MDI não é a mesma coisa pelo que parece.
A dúvida é o porque do erro, e como o corrigir utilizando o form MDI mesmo, pois como SDI, não tenho problema algum.
Grato.
porém ao chamar uma função clicando no botão Novo, onde é chamado a função codigoauto() é
exibido o seguinte erro:
Project Projeto1.exe raised exception class EAccessViolation with message
Access violation at address 004B85FA in module Project1.exe Read of
Address 00000304. Process Stopped. Use Step or Run to continue.
Sendo que o erro se dá no ponto Frmform2.Edit1.Seltext := dm1.tabCat.Fieldvalues[Codigo]+1, ou
em qualquer referência ao Form2 com recebimento de atribuição de valor, como mostra os exemplos abaixo
var
Frmform2: TFrmform2;
implementation
uses udm1;
{$R *.dfm}
A função código automático verifica se já existem registros, se existir cria um registro com o valor do último código + 1
Function CodigoAuto(): String;
begin
dm1.tabCat.Last;
if dm1.tabCat.FieldValues[Codigo] >= 1 then
Frmform2.Edit1.Seltext := dm1.tabCat.Fieldvalues[Codigo]+1
else
Frmform2.Edit1.Seltext := 1;
dm1.tabCat.Insert;
Frmform2.Edit1.SetFocus;
end;
a outra função
A função Registroautual apresenta o código do registro atual na edit1
Function Registroatual(): String;
Var Vcod :String;
begin
begin
if Form2.Edit1.text = then
begin
Dm1.tabCat.First;
end;
end;
Vcod := dm1.tabCat.FieldValues[Codigo];
Form2.Edit1.text := Vcod;
Depois das funções vem o chamado da função no botão novo
procedure TFrmForm2.Button1Click(Sender: TObject);
begin
codigoauto();
end;
*****************************
*
* Código
* [.......]
*
* Descrição
* [.......................]
*****************************
O que ocorre é que bem na chamada da rotina Frmform2.Edit1.Seltext já é dado um erro de violação de chave
porém se logo após o function declarar novamente var Frmform2: TFrmform2; o mesmo consegue passar, mas na chamada de uma outra
função em que é refrenciado o nome do formulário dentro da função o mesmo erro ocorre, mesmo se for declarado novamente o form
o retorno que está dando no form é nil, bem se fosse um formumário SDI não necessitaria nem de declara apenas atribur o formulário
e funcionaria normalmentee, porém com o MDI não é a mesma coisa pelo que parece.
A dúvida é o porque do erro, e como o corrigir utilizando o form MDI mesmo, pois como SDI, não tenho problema algum.
Grato.
Carlos
Curtidas 0
Respostas
Marco Salles
17/07/2012
este form2 seria o filho ??
Com ovc esta o instanciando ??
Qual o codigo que vc esta utilizando ?
Com ovc esta o instanciando ??
Qual o codigo que vc esta utilizando ?
GOSTEI 0
Carlos
17/07/2012
este form2 seria o filho ??
Com ovc esta o instanciando ??
Qual o codigo que vc esta utilizando ?
Com ovc esta o instanciando ??
Qual o codigo que vc esta utilizando ?
Este form2 é o filho o form principal é o FormMenu nele eu chamo esse form da seguinte forma:
TFrmform2.Create(Self);
Cascade;
O código que estou utilizando já está no tópico, clico no botão novo que chama a função codigoauto, ai quando executada a função o erro é acarretado exatamente (Frmform2.Edit1.Seltext := dm1.tabCat.Fieldvalues[Codigo]+1 ), ou seja no momento que tento enviar uma valor a edit do form, quando o erro está em progresso ele está me retornando nil para o form.
Quanto a instanciar (atribuir outro nome de referencia) não foi feito, como devo proceder para isso?
Grato
GOSTEI 0
Carlos
17/07/2012
este form2 seria o filho ??
Com ovc esta o instanciando ??
Qual o codigo que vc esta utilizando ?
Com ovc esta o instanciando ??
Qual o codigo que vc esta utilizando ?
Este form2 é o filho o form principal é o FormMenu nele eu chamo esse form da seguinte forma:
TFrmform2.Create(Self);
Cascade;
O código que estou utilizando já está no tópico, clico no botão novo que chama a função codigoauto, ai quando executada a função o erro é acarretado exatamente (Frmform2.Edit1.Seltext := dm1.tabCat.Fieldvalues[Codigo]+1 ), ou seja no momento que tento enviar uma valor a edit do form, quando o erro está em progresso ele está me retornando nil para o form.
Quanto a instanciar (atribuir outro nome de referencia) não foi feito, como devo proceder para isso?
Grato
Veja que o código declara o formulário como Frmform2 como TfrmForm2
var
Frmform2: TFrmform2;
implementation
uses udm1;
sendo que o arquivo Frmform2 é o nome do formulário Uform2 o nome da unit .pas
em project/optins o autocreate está somente para o formulario principal FrmMenu(nome do formulário) e o dm1, enquanto que o form2 está em available forms.
O FrmMenu está configurado no formstyle: fsMDIForm enquanto que o form2 esta como: fsMDIChild
chamo o formulário form2 da seguinte forma
TFrmCadCli.Create(Self);
Cascade;
GOSTEI 0
Marco Salles
17/07/2012
entendo , então neste caso utilize o código
if form2 = nil then
Application.CreateForm(TForm2,form2);
form2.Show;
e no onclose fo seu form2 faça
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=cafree;
form2:=nil; //
end;
if form2 = nil then
Application.CreateForm(TForm2,form2);
form2.Show;
e no onclose fo seu form2 faça
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=cafree;
form2:=nil; //
end;
GOSTEI 0