Componente visual é na verdade uma classe. Mas para escrever um controle, você deve usar um pacote. Selecione Novo no menu Arquivo e crie um novo pacote. Em seguida, clique no botão Adicionar na janela do pacote para adicionar um componente (unidade).
Selecione novo componente na parte superior da caixa de diálogo pop-up. Como todos os atributos, métodos e eventos de um controle não podem ser compostos por si só, você precisa selecionar a classe ancestral (ou "classe pai" ou "classe base") e adicionar seus próprios atributos, métodos e eventos. . Selecione a classe ancestral desejada na caixa suspensa após o tipo de ancestral. Como você precisa desenhar um quadro escrevendo um controle visual, o TgraphicControl é selecionado como a classe ancestral. Em seguida, digite o nome do novo controle (classe) na caixa de nome da classe, que geralmente começa com "t". A página da paleta é usada para selecionar o nome da página de controle do novo controle na janela Delphi, como "padrão", que pode ser tomado sozinho. Adicione o caminho e o nome do arquivo do novo arquivo de controle no nome do arquivo da unidade e clique no botão OK. Novos controles são adicionados. Agora você pode escrever código para este controle.
A seguir, é apresentado um exemplo de gravação de uma barra de rolagem que pode personalizar a imagem para ilustrar como escrever um controle visual.
Siga o método acima, selecione TgraphicControl como classe ancestral e o nome do novo controle é o TPIGHORIZONTALSCROLLER (barra de rolagem horizontal de porco). Depois de selecionar o caminho e o nome do arquivo, clique no botão OK para começar a gravar o código.
Cada controle será criado e excluído, então você deve primeiro escrever esses dois processos. Para cada processo no controle, ele deve ser definido primeiro e depois escrito posteriormente. Existem três tipos de processos ou atributos que são definidos:
1. O definido após o privado é usado internamente para o controle, e a pessoa que usa o controle não pode vê -lo;
2. O que é definido após a proteção é geralmente invisível e só pode ser visto quando outros usam o controle como uma classe ancestral para escrever outros controles;
3. Somente outros podem ser chamados no programa após o público;
4. O definido após a publicação pode ser visto na janela da propriedade (inspetor de objeto). Como o processo de criação e exclusão não é executado automaticamente quando o controle é criado durante o processo de programação, ele também pode ser chamado quando o controle é criado dinamicamente durante o programa em execução, para que seja definido após o público. (Esse número de sequência indica a localização do código no programa de origem anexado, o mesmo abaixo) agora, talvez eu não saiba o que escrever nesses dois processos e como editá -lo. Vamos falar sobre isso abaixo.
Vamos primeiro adicionar algumas propriedades a esse controle. Definimos uma propriedade Max para definir ou ler o valor máximo da barra de rolagem. Como os atributos não são usados diretamente nos programas, você precisa definir uma variável que corresponda ao atributo, modificando ou lendo seu valor. Como é usado apenas dentro do controle, nós o definimos após o privado ⑵. (Geralmente, as variáveis associadas aos atributos começam com "F", como FMAX) após definir a variável, define os atributos. Essa propriedade precisa ser visível na janela do Inspetor de Objeto, então defina -a e publique -a após ⑶. A sintaxe definida é:
Propriedade <Nome da propriedade>: <pype> leia <variável responsiva ao ler esta propriedade> Escreva <variável ou processo responsivo ao escrever esta propriedade>
Outras variáveis e atributos também são definidos da mesma forma (como valor mínimo mínimo, valor de corrente de valor etc.). Abaixo, definimos vários atributos e variáveis para definir a imagem da barra de rolagem (porque as variáveis de imagem são especiais, falarei sobre elas separadamente). Definimos a esquerdabuttonuppicture (imagem do botão esquerda), LeftButtondOwNPicture (botão esquerda Pressione a imagem) e assim por diante como tipo TbitMap (deve definir a variável correspondente).
Todos devem ter notado que, no programa de origem anexado, ao definir essas propriedades, a variável correspondente ao ler as propriedades especificadas após a leitura é f ... e a variável correspondente ao escrever as propriedades especificadas após a escrita não são variáveis, mas algo como Definir ..., é um processo personalizado. O processo como essa função é definido como:
Procedimento <Nome do processo> (Valor: <Tipo de valor da propriedade Set>)
Como outras coisas precisam ser feitas ao escrever os atributos desta classe, ela não pode ser processada com apenas uma variável, mas deve ser processada com um processo. Esse processo é geralmente definido após protegido. Nesse processo de classe, uma instrução como essa em ⑷ é usada para atribuir valores a uma variável do tipo TBITMAP, que é adotada porque as variáveis desse tipo não podem ser atribuídas diretamente.
Depois de definir as propriedades dessas variáveis do tipo TBBITMAP, o código precisa ser gravado no processo Criar e destruir o processo mencionado acima. Como o TBITMAP também é uma classe, ele deve ser criado no processo de criação ⑸ e gratuito deve ser liberado durante o processo de destruição. A declaração herdada referida aqui é usada para indicar que o processo é herdado da classe ancestral. (Isso não deve ser descartado).
Como escrevemos controles visuais, temos que desenhar figuras nos controles. A classe ancestral de nosso controle, TgraphicControl, encapsula um objeto de tela, que podemos usar diretamente para desenhar figuras. Se você não estiver familiarizado com o uso da tela, é melhor encontrar um livro para lê -lo.
O trabalho a seguir é desenhar figuras. Como desenhar figuras no controle? Há um evento de pintura no Ancestor Class TgraphicControl, que acionará automaticamente quando o controle precisar ser repintado. O que temos que fazer agora é escrever um programa para este evento. Primeiro, defina um objeto de tela após protegido. Como já está na classe ancestral, não há necessidade de adicionar nenhuma explicação⑻. Usaremos esse objeto para desenhar. Em seguida, você precisa definir um processo de pintura e escrever o código para desenhar o controle. Primeiro defina o processo de pintura em público. Como é acionado pela classe Ancestor, não pelo usuário, a substituição deve ser adicionada posteriormente, caso contrário, o controle não se tornará um controle visual porque o procedimento de tinta nunca será chamado. Vamos escrever o código para o processo de pintura⑽.
As variáveis como T_Height no processo de tinta do programa de origem anexadas a este artigo são usadas para salvar o tamanho dos botões, controles deslizantes etc. na barra de rolagem. , a maioria dos quais está correta, acredito que todos entenderão a operação da tela rapidamente. Vale a pena notar que o seguinte julgamento na variável fautosize⑾
O FAUTOSIZE é uma variável booleana associada à propriedade automaticamente do controle. Observe que no código de controle, o atributo não é chamado diretamente, mas a variável correspondente é usada.
Depois que o programa foi compilado aqui, mesmo se eu finalmente procurar meu novo controle, ele não pode rolar. Agora vamos escrever o evento do mouse para que possamos manipulá -lo. A definição do processo de evento do mouse é muito semelhante ao processo de tinta, exceto que as descrições de parâmetros devem ser adicionadas posteriormente.
Os eventos do mouse são divididos em Mousedown, Mousemove e MouseUp, e a substituição deve ser adicionada após a definição. Em seguida, escreva seu código mais tarde. Nota: O evento do mouse aqui é o mouse ..., não o OnMouse habitual…. Mas qual é a definição em ⒀ para? As definições de eventos aqui são todas para os usuários usarem, ou seja, ao usar esse controle, eles serão exibidos na página de evento no Inspetor de Objeto.
O código para esses eventos do mouse também é muito simples. Vale ressaltar que, ao chamar um evento personalizado, você deve primeiro usar essa instrução em ⒁ para determinar se o usuário escreveu código para o evento. Isso é muito importante, caso contrário, ocorrerá um erro na chamada.
Todo mundo percebeu que os eventos chamados agora são todos personalizados e o método de definição é muito simples, o que é semelhante ao atributo de definição, mas tnotifyEvent quando digitado.
O TNOTIFYEVENT é o evento padrão, que é definido como:
TnotifyEvent = Procedimento (remetente: Tobject)
Se você deseja definir outra forma de evento, deve fazer isso: primeiro escreva no tipo e depois
<Nome do tipo de evento> = Procedimento (<Marameter>: <type>)
Por exemplo:
Tcustomevent = procedimento (a: número inteiro; b: string);
Após a definição pública:
<Nome do evento>: <Nome do tipo de evento>
Por exemplo:
ANEVENT: Tcustomevent;
Depois de ler isso, você deve entender todo o programa. Se houver um erro na compilação ou operação, verifique os seguintes pontos:
1. Se existem declarações herdadas no processo de criação e destruição;
2. se as variáveis do tipo TBBITMAP criam e gratuitas são criadas ou gratuitas;
3. Existe um nome de controle antes do processo, por exemplo: tpighorizontalscroller.mosmove
Como determinar se o mouse entra ou deixa o controle:
Defina o seguinte processo:
Procedimento MouseEnter (var msg: tMessage);
Procedimento mouseleave (var msg: tmessage);
Basta escrever o código abaixo!
Este método é muito útil para escrever botões de três estados!