Projeto paint – quinta parte



Ao rodar a aplicação, você deve ter notado que a janela filha está sendo criada automaticamente na inicialização do programa. Vamos mudar essa sistemática.

Dê um clique em Project, e depois em Options. Na paleta Form da caixa que se abrir, vamos alterar a lista Auto-create forms. Selecione EdtDsnh e dê um clique na seta >, o que fará que EdtDsnh seja movido para a janela Available forms. Dê um OK e pronto, a janela filha já não mais inicializa mais automaticamente.

Agora vamos incluir os códigos necessários à criação das janelas filhas em tempo de execução:



void __fastcall TFrmPncel::Novo1Click(TObject *Sender)
{
new TEdtDsnh(this); //Cria janela filha em tempo de execução
}



Quando um programa é executado, o sistema operacional reserva um espaço de memória para o código (ou instruções do programa) e outro espaço para as variáveis usadas durante a execução. De um modo geral, esses espaços ocupam uma mesma região, que podemos denominar memória local. Também existem outras zonas de memória, como a pilha, usada, entre outras coisas, para realizar o intercâmbio de dados entre as funções. O resto, a memória que não estiver em uso por nenhum programa, é o que se conhece por memória livre (área de alocação dinâmica, heap ou free store). Quando um programa usa a área de alocação dinâmica, naturalmente estará usando parte desse resto de memória.


O maior poder esperado na utilização de ponteiros decorre talvez, justamente, de seu uso junto a esse conceito de alocação de memória no free store.


C++ dispõe de dois operadores que atuam em conjunto para acesso à memória dinâmica: new e delete. O operador new oferece um meio para alocação de espaço na memória livre, de uma forma parecida, porém muito superior àquela alocação oferecida pela função malloc() da livraria padrão da linguagem C. O operador new precisa, necessariamente, ser suprido com o tipo de dados para o qual está alocando memória, a fim de que o compilador saiba exatamente quanta memória deverá reservar para colocar os dados no heap. O operador delete é o meio tradicional fornecido por C++ de liberar a memória alocada pelo operador new.


Em funções-membros não static, a palavra-chave this é um ponteiro que contém o endereço do objeto pelo qual a função-membro é chamada. Toda chamada a funções-membros não static passa o ponteiro this como um argumento oculto.



this é uma variável local disponível no corpo de qualquer função-membro não static. Use this implicitamente dentro da função para referências de membros. this não precisa ser declarado e raramente é referido explicitamente na definição de uma função. No código acima this determina que a janela filha pertença à janela pai. Em determinadas situação, se quiséssemos que o objeto pertencesse a outro componente diferente do formulário em que se encontra, deveríamos trocar a palavra-chave this pelo nome do componente ao qual queremos que o objeto pertença.



void __fastcall TEdtDsnh::Novo1Click(TObject *Sender)
{
//Chama o método NovoClick de FrmPncel
FrmPncel->Novo1Click (Sender);  
}



Podemos usar OnClose para efetuar algum processo especial no fechamento do form. O evento OnClose especifica qual o evento handler será chamado quando o form estiver quase fechado. O handler especificado em OnClose pode ser usado para forçar, por exemplo, um teste para verificar se todos os campos de entrada de dados num form possuem conteúdo válido, antes de permitir que o form seja encerrado.


Um form é fechado pelo método Close ou quando o usuário escolhe Fechar desde o system menu do form.


O tipo TCloseEvent aponta para o método que trata o fechamento do form. O valor do parâmetro Action determina se o form realmente fecha. Esses são os possíveis valores do parâmetro Action: caNone, caHide, caFree e caMinimize.



void __fastcall TEdtDsnh::FormClose(TObject *Sender, TCloseAction &Action)
{
// Libera os recursos alocados na criação da janela filha
Action = caFree;  
}



Setando Action para caFree, determinamos que o form seja fechado e toda a memória alocada para o form seja liberada.

Se um form é um form MDI child, e a propriedade BorderIcons do mesmo estiver para biMinimize, então a default para Action é caMinimize, determinando que o form seja minimizado em detrimento de ser fechado. Se um form MDI child não possuir esta marcação, então a default para Action é caNone, o que significa que nada acontece quando o usuário tenta fechar o form.


Se um form é um form SDI child, o default para Action é caHide. caHide faz com que o form seja escondido, porém ativo, podendo ser acessado pela aplicação.


Para fechar o form acima criado pelo operador new e liberá-lo num evento OnClose, devemos marcar o parâmetro Action para caFree, o que provocará a liberação da memória alocada em sua criação, dispensando-se, nestes casos, o uso do operador delete para a desalocação da memória.


Feito isso, precisamos adicionar o arquivo de cabeçalho EdtDesenh.h. No menu File dê um clique em Include Unid Hdr... Na caixa de diálogo que se abrir, escolha o arquivo correspondente e dê um OK.

Para que as janelas abertas sejam listadas como itens de menu, selecione o form FrmPncel e ajuste a propriedade WindowMenu para Janela1.





anterior

índice

próxima


HOME || MAPA DO SITE || CURSOS || TUTORIAIS || LINKS || FORUM || CONTATO