Erro estranho: Internal Error: L681

Delphi

02/03/2006

Olá, estou programando, e simplesmente ao compilar apareceu este erro maluco.

Internal Error: L681

E ao compilar novamente, aparece o seguinte erro:

[Fatal Error] teste.dpr(10): Unit Dialogs was compiled with a different version of Forms.TForm

Nunca aconteceu isso... e eu não fiz nada.. simplesmente coloquei uma função no meu menu e ao compilar apareceu isso...

Uso Delphi 7 Ent.

Desde já agradeço.

[]s


Titanius

Titanius

Curtidas 0

Respostas

Michael

Michael

02/03/2006

Esse erro infelizmente não é incomum de acontecer, e há várias causas possíveis para ele. Geralmente eu contruo toda a aplicação ([b:07c0a7f5cf]Build[/b:07c0a7f5cf]) e o problema desaparece. Outras vezes eu preciso fechar o projeto e abrí-lo de novo.

[url=http://qc.borland.com/wc/qcmain.aspx?d=5336]Neste link[/url] do Quality Central da Borland há mais informações e coisas que vc pode tentar para descobrir o problema e/ou eliminar o erro.

[]´s


GOSTEI 0
Titanius

Titanius

02/03/2006

Valeu Michael, olha só que doidera... esse codigo abaixo é que estava dando o erro:
 if PgCtrlPrincipal.ActivePageIndex >= 0 then
 begin
  (PgCtrlPrincipal.Pages[PgCtrlPrincipal.ActivePageIndex].Components[0] as TFormClass).Close;
  PgCtrlPrincipal.Pages[PgCtrlPrincipal.ActivePageIndex].Free;
 end;


Estou tentando fechar o Form associado à Page, e depois liberar a Sheet da memoria.. estou fazendo errado?

P.S.: Estou usando a sua funcao, do outro topico..

[]s


GOSTEI 0
Michael

Michael

02/03/2006

Estou tentando fechar o Form associado à Page, e depois liberar a Sheet da memoria.. estou fazendo errado?


Sim [b:a492ea795e]Titanius[/b:a492ea795e], há dois erros na sua abordagem. Vamos a eles:

1) [b:a492ea795e]TFormClass [/b:a492ea795e]é um tipo nativo do Delphi definido como [b:a492ea795e]class of TForm[/b:a492ea795e]. Isso quer dizer que ele pode receber referências à classes, e não à instâncias. Eu o usei pq desta forma posso chamar a função passando a classe do Form que quero criar, sem me preocupar em instanciá-lo antes, pois a rotina irá fazê-lo para mim. Desta forma o que vc fez não vai resultar no esperado. O correto seria:

(PgCtrlPrincipal.ActivePage.Components[0] as TCustomForm).Close


Aproveitei e usei a propriedade [b:a492ea795e]ActivePage [/b:a492ea795e]do [b:a492ea795e]PageControl [/b:a492ea795e]para economizar código. ;-)

2) Porém, como eu mencionei no outro tópico, vc [b:a492ea795e]não precisa[/b:a492ea795e] fechar o form, bastando apenas destruir a [b:a492ea795e]TabSheet[/b:a492ea795e]. Isso funciona pq o formulário foi criado com o [b:a492ea795e]Owner [/b:a492ea795e]definido para a aba em questão. Se vc tem algum código no evento [b:a492ea795e]OnClose [/b:a492ea795e]do form, mova-o para o [b:a492ea795e]OnDestroy [/b:a492ea795e]para as coisas ficarem mais coerentes.

Seu código final ficaria assim agora:

if Assigned(PgCtrlPrincipal.ActivePage) then
  PgCtrlPrincipal.ActivePage.Free;


[]´s


GOSTEI 0
Titanius

Titanius

02/03/2006

Opa Michael, você como sempre me tirando do buraco hein!?.. hehe...

Seguinte, tenho uma duvida... quanto ao Owner eu entendi, o porem é que eu precisava mesmo, é de algo que passasse dentro do OnClose do Form em questao, e o codigo
if Assigned(PgCtrlPrincipal.ActivePage) then 
  PgCtrlPrincipal.ActivePage.Free;


nao passava, ja tirava ele...

quanto ao primeiro codigo funcionou legal..

Obrigado,

[]s


GOSTEI 0
Michael

Michael

02/03/2006

Opa Michael, você como sempre me tirando do buraco hein!?.. hehe...

Vou começar a cobrar pela consultoria... ;-)

Seguinte, tenho uma duvida... quanto ao Owner eu entendi, o porem é que eu precisava mesmo, é de algo que passasse dentro do OnClose do Form em questao

Por que precisa usar especificamente o [b:dbfec786db]OnClose[/b:dbfec786db]? Não pode usar o [b:dbfec786db]OnDestroy [/b:dbfec786db]como eu mencionei? Se não, e dentro do [b:dbfec786db]OnClose [/b:dbfec786db]vc fizer isso:

Action := caFree;


Então vc não deve criar os formulários passando a [b:dbfec786db]TabSheet [/b:dbfec786db]como [b:dbfec786db]Owner[/b:dbfec786db], e sim [b:dbfec786db]nil[/b:dbfec786db].

Só vejo duas razões para usar o [b:dbfec786db]OnClose[/b:dbfec786db] neste contexto: ou vc quer poder impedir o fechamento do Form, e nesse caso tbm poderia usar o [b:dbfec786db]OnCloseQuery[/b:dbfec786db], ou se os forms são compartilhados entre projetos [b:dbfec786db]MDI/SDI[/b:dbfec786db] e [b:dbfec786db]MTI[/b:dbfec786db].

[]´s


GOSTEI 0
Rfb

Rfb

02/03/2006

Bom dia Michel.

Você demonstrar ter um grande conhecimento em Delphi.

Estou desenvolvendo um projeto e gostaria de saber se você se interessa em prestart consultoria.

Por favor, entre em contato e te dai mais detalhes. (rfbarrozo@gmail.com)

Fico no aguardo.

Um abraço.




GOSTEI 0
POSTAR