TComponent.FreeNotification

Documentação: http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Classes.TComponent.FreeNotification http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Classes.TComponent.Notification

Existem alguns casos onde um componente precisa saber quando outro componente foi destruído. Isso ocorre principalmente na construção de componentes, mas pode ser utilizados em qualquer outro caso em que a lógica se aplique.

Utilizamos o método FreeNotification para realizar a essa tarefa de forma muito simples no Delphi.

Basicamente, FreeNotification registra o componente em uma lista que será disparada no momento de sua destruição, alertando todos os outros componentes alí registrados que ele foi destruído.

Como exemplo, vamos criar a classe TTeste abaixo:

TTeste é uma classe que herda de TComponent e reimplementa o método virtual Notification:

Depois disso, vamos olhar o código abaixo:

O que foi feito aqui em cima foi adicionar Teste (TTeste) na lista de componentes a serem notificados quando Shape for destruído. No momento que chamamos Shape.Free, o método Notification de TTeste é executado. Assim, TTeste pode tratar como cuidará dessa informação.

Isso geralmente é utilizado quando existem referências em um objeto de outro objeto. Comumente vemos essa situação em componentes que referenciam popups menus ou datasets. Assim, caso o popup menu ou o dataset seja destruído, é possível alterar a referência para nil, evitando apontar para um endereço de memória que não mais está utilizável.

Esse tratamento não é necessário quando o componente está no mesmo form (dependendo da lógica) ou quando ambos componentes possuem o mesmo owner. Isso devido a forma como o Delphi trabalha com a memória. Componentes do mesmo form são destruídos na destruição do form e componentes que possuem o mesmo dono (owner) são destruídos na destruíção do owner. Além disso, Notification não é executado na destruição do owner, porque trata-se de uma liberação natural da memória, e um evento esperado.

Tem outra ideia onde isso possa ajudar no desenvolvimento de aplicações? Compartilhe conosco seus pensamentos.

Problemas na conexão com Dephi e Oracle em máquinas 64bits

Se você está tendo problemas em conectar sua aplicação Delphi em um banco de dados Oracle, e você utiliza uma máquina 64bits, não se preocupe. O problema é chato de diagnosticar, mas a solução é simples, embora trabalhosa. Provavelmente, na instalação do Delphi (ou RAD Studio), você, assim como eu, instalou-o na pasta padrão para aplicativos de 32bits (x86), ou seja:

Após muito pesquisar, descobrí que o problema ocorre porque o “Client” do Oracle não conecta através de pastas com alguns tipos de caracteres, entre eles o parênteses “(” e “)”. Tanto que se você gerar um executável e colocá-lo no seu desktop, por exemplo, ele irá conectar normalmente. Por isso, o fato de sua máquina ser 64bits não interfere na conexão, mas sim o caminho de onde a conexão será chamada. Só nos resta agora a solução, que será reinstalar o Delphi (RAD Studio) em outro caminho, como por exemplo, “C:\Arquivos de Programas” ou mesmo “C:\Delphi”, para podermos então testar a conexão em tempo de “Design”.