Errroo Impresssionante .....
Pesssoal
Tô com um problema impressionante acontecendo com um form MdiChild. É o 1º caso destes q estou tendo.
Tenho um Form1 que é chamado a apartir do menu:
if not assigned(form1)then
form1 := tform1.create(application);
aí ele abre certinho e mostra tudo o q preciso.
Agora se eu fechar este form1 e tentar abrí-lo de novo ele dá erro no evento OnChange de um PageControl. O Impressionante de tudo isso é q na 1ª vez q abro o form NÃO DÁ ERRO, agora se eu fechar e abrí-lo novamente DÁ ERRO, INCRÍVEL ... ME AJUDEM !!!!!
no Form1.Onclose: (achei q isso destruiria tudo)
Action := CaFree;
Form1 := nil;
ajudem ..obrigado
Diogo
Tô com um problema impressionante acontecendo com um form MdiChild. É o 1º caso destes q estou tendo.
Tenho um Form1 que é chamado a apartir do menu:
if not assigned(form1)then
form1 := tform1.create(application);
aí ele abre certinho e mostra tudo o q preciso.
Agora se eu fechar este form1 e tentar abrí-lo de novo ele dá erro no evento OnChange de um PageControl. O Impressionante de tudo isso é q na 1ª vez q abro o form NÃO DÁ ERRO, agora se eu fechar e abrí-lo novamente DÁ ERRO, INCRÍVEL ... ME AJUDEM !!!!!
no Form1.Onclose: (achei q isso destruiria tudo)
Action := CaFree;
Form1 := nil;
ajudem ..obrigado
Diogo
Diogoalles
Curtidas 0
Respostas
Luizfernando777
07/01/2004
qual seria o erro?
GOSTEI 0
Diogoalles
07/01/2004
no caso, eu tenho alguma rotinas no PageControl.ONChange ... e ele manda o foco para um Edit. é onde dá o erro dizendo q ñ pode focar uma local invisvel ou desabilitado !
mas como eu já disse, na primeira vez q abro a tela ñ dá erro nenhum, aogra se eu fechar o form e abrir de novo dá erro ... Impressionante ..to indignado !!
eu sei q seria simples, pegar e tirar a rotina do Setfocus, mas ñ posso acreditar q na primeira vez q abre o form está tudo ok, e se depois eu fechar e abrir de novo dá erro ..
Valeuuu
abraço
mas como eu já disse, na primeira vez q abro a tela ñ dá erro nenhum, aogra se eu fechar o form e abrir de novo dá erro ... Impressionante ..to indignado !!
eu sei q seria simples, pegar e tirar a rotina do Setfocus, mas ñ posso acreditar q na primeira vez q abre o form está tudo ok, e se depois eu fechar e abrir de novo dá erro ..
Valeuuu
abraço
GOSTEI 0
Luizfernando777
07/01/2004
vc poderia mandar esse form para mim dar uma olhada?
luizfernando777@yahoo.com.br
luizfernando777@yahoo.com.br
GOSTEI 0
Cabelo
07/01/2004
Caro Amigo o que acontece é o seguinte, este form ainda está residente na memório do micro, por isso ele não consegue criá-lo novamente, e tenta utilizar uma instancia já existente, o que vc deve fazer é perguntar se este form está residente na memória, e se True então somente dá um Show. Entendeu?
Sem mais
Cabelo
Sem mais
Cabelo
GOSTEI 0
Diogoalles
07/01/2004
Mas eu já realizei testes no OnClose do Form, colocando inclusive um Form1.Release, tb Action := CaFree e Form1 := Nil;
Como eu faço pra verificar se está na memoria ?
abraço
Como eu faço pra verificar se está na memoria ?
abraço
GOSTEI 0
Cabelo
07/01/2004
procedure ShowChild (TfrmClass:TFormClass; Var reference);
var i:integer;
begin
if (TForm(reference) <> nil) then
for i := 0 to Application.MainForm.MDIChildCount-1 do
begin
if Application.MainForm.MDIChildren[i] = TForm(reference) then
begin
if TForm(reference).Windowstate = wsMinimized then
TForm(reference).Windowstate := wsNormal
else
TForm(reference).BringToFront;
exit;
end;
end ;
Application.CreateForm(TfrmClass, TForm(reference));
end;
Utilize esta função e vê se dá certo, coloque ela no lugar em que vc carrega a variável form1.
Cabelo
var i:integer;
begin
if (TForm(reference) <> nil) then
for i := 0 to Application.MainForm.MDIChildCount-1 do
begin
if Application.MainForm.MDIChildren[i] = TForm(reference) then
begin
if TForm(reference).Windowstate = wsMinimized then
TForm(reference).Windowstate := wsNormal
else
TForm(reference).BringToFront;
exit;
end;
end ;
Application.CreateForm(TfrmClass, TForm(reference));
end;
Utilize esta função e vê se dá certo, coloque ela no lugar em que vc carrega a variável form1.
Cabelo
GOSTEI 0
Ildefonso
07/01/2004
ALÔÔÔÔ, Diogo.
Vi sua mensagem apenas hoje e pensei o seguinte:
...no OnClose, o Delphi ainda não destruiu o Form1. Talvez a classe volte a usar a variável em seus procedimentos depois do evento.
Em meus forms MDIChild eu uso uma variável privada para os abrir:
No [b:5a71496fe9]OnClose[/b:5a71496fe9] do TFilho, uso normalmente o [b:5a71496fe9]Action := caFree;[/b:5a71496fe9] e, em relação à destruição deste objeto, [u:5a71496fe9]mais nada[/u:5a71496fe9].
A vantagem desta abordagem é que eu posso criar vários formulários filhos a partir de um mesmo tipo, todos funcionarão independentes, sem problemas.
Como a variável é local (a [b:5a71496fe9]newF[/b:5a71496fe9]) o Delphi deve saber tratar o tipo TPersistente, do qual o TForm é baseado, para manipular o objeto sem um nome de variável específico.
Bom trabalho. 8)
Vi sua mensagem apenas hoje e pensei o seguinte:
...no OnClose, o Delphi ainda não destruiu o Form1. Talvez a classe volte a usar a variável em seus procedimentos depois do evento.
Em meus forms MDIChild eu uso uma variável privada para os abrir:
procedure TMestre.OpenChild; var newF: TFilho; begin Application.CreateForm(TFilho, newF); end;
No [b:5a71496fe9]OnClose[/b:5a71496fe9] do TFilho, uso normalmente o [b:5a71496fe9]Action := caFree;[/b:5a71496fe9] e, em relação à destruição deste objeto, [u:5a71496fe9]mais nada[/u:5a71496fe9].
A vantagem desta abordagem é que eu posso criar vários formulários filhos a partir de um mesmo tipo, todos funcionarão independentes, sem problemas.
Como a variável é local (a [b:5a71496fe9]newF[/b:5a71496fe9]) o Delphi deve saber tratar o tipo TPersistente, do qual o TForm é baseado, para manipular o objeto sem um nome de variável específico.
Bom trabalho. 8)
GOSTEI 0