Delphi "problem": TForm. Criar () - Nulo, Próprio ou Aplicativo?

click fraud protection

Quando você cria Objetos Delphi dinamicamente que herdam do TControl, como um TForm (representando um formulário / janela em aplicativos Delphi), o construtor "Create" espera um parâmetro "Owner":

construtor Create (AOwner: TComponent);

O parâmetro AOwner é o proprietário do objeto TForm. O proprietário do formulário é responsável por liberar o formulário - ou seja, memória alocada pelo formulário - quando necessário. O formulário aparece na matriz Componentes de seu proprietário e é destruído automaticamente quando seu proprietário é destruído.

Você tem três opções para o parâmetro AOwner: Nada, auto, e inscrição.

Para entender a resposta, primeiro você precisa conhecer o significado de "nulo", "eu" e "Aplicativo".

  • Nada especifica que nenhum objeto possui o formulário e, portanto, o desenvolvedor é responsável por liberar o formulário criado (chamando myForm. Gratuito quando não precisar mais do formulário)
  • Auto especifica o objeto no qual o método é chamado. Se, por exemplo, você estiver criando uma nova instância de um formulário TMyForm a partir do manipulador OnClick de um botão (em que esse botão é colocado no MainForm),
    instagram viewer
    auto refere-se a "MainForm". Assim, quando o MainForm for liberado, ele também liberará o MyForm.
  • Inscrição especifica uma variável global do tipo TApplication criada quando você executa seu aplicativo. "Aplicativo" encapsula seu aplicativo, além de fornecer muitas funções que ocorrem no plano de fundo do programa.

Exemplos:

  1. Formas modais. Quando você cria um formulário para ser exibido modalmente e liberado quando o usuário fecha o formulário, use "nil" como proprietário:
    var myForm: TMyForm; inicie o myForm: = TMyForm. Crio(nada); tente o myForm. ShowModal; finalmente myForm. Livre; fim; fim;
  2. Formas sem modelo. Use "Aplicativo" como proprietário:
    var
    myForm: TMyForm;
    ...
    myForm: = TMyForm. Criar (Aplicativo);

Agora, quando você finaliza (sai) o aplicativo, o objeto "Aplicativo" libera a instância "myForm".

Por que e quando é o TMyForm. Criar (aplicativo) NÃO é recomendado? Se o formulário for modal e será destruído, você deve passar "nil" para o proprietário.

Você pode passar no "aplicativo", mas o atraso causado pelo envio do método de notificação para cada componente e formulário pertencente ou indiretamente ao Aplicativo pode ser perturbador. Se seu aplicativo consistir em muitos formulários com muitos componentes (aos milhares), e o formulário que você estiver criando tiver muitos controles (às centenas), o atraso da notificação poderá ser significativo.

Passar "nil" como proprietário em vez de "aplicativo" fará com que o formulário apareça mais cedo e não afetará o código.

No entanto, se o formulário que você precisa criar não for modal e não for criado a partir do formulário principal do aplicativo, quando você especificar "self" como proprietário, fechar o proprietário liberará o formulário criado. Use "self" quando não quiser que o formulário sobreviva ao criador.

Atenção: Para instanciar dinamicamente um componente Delphi e liberá-lo explicitamente algum tempo depois, sempre passe "nil" como o proprietário. Não fazer isso pode apresentar riscos desnecessários, além de problemas de desempenho e manutenção de código.

Dentro Aplicações SDI, quando um usuário fecha o formulário (clicando no botão [x]), o formulário ainda existe na memória - ele fica oculto. Nos aplicativos MDI, o fechamento de um formulário filho MDI o minimiza.
o OnClose evento fornece uma Açao parâmetro (do tipo TCloseAction) que você pode usar para especificar o que acontece quando um usuário tenta fechar o formulário. Definir este parâmetro como "caFree" liberará o formulário.

Navegador de dicas do Delphi:
»Obtenha o HTML completo do componente TWebBrowser
«Como converter pixels em milímetros

instagram story viewer