Fórum Errroo Impresssionante ..... #204717

07/01/2004

0

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


Diogoalles

Diogoalles

Responder

Posts

07/01/2004

Luizfernando777

qual seria o erro?


Responder

Gostei + 0

07/01/2004

Diogoalles

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


Responder

Gostei + 0

07/01/2004

Luizfernando777

vc poderia mandar esse form para mim dar uma olhada?
luizfernando777@yahoo.com.br


Responder

Gostei + 0

07/01/2004

Cabelo

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


Responder

Gostei + 0

07/01/2004

Diogoalles

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


Responder

Gostei + 0

07/01/2004

Cabelo

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


Responder

Gostei + 0

01/02/2004

Ildefonso

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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar