El componente visual es en realidad una clase. Pero para escribir un control, debe usar un paquete. Seleccione nuevo en el menú Archivo y cree un nuevo paquete. Luego haga clic en el botón Agregar en la ventana del paquete para agregar un componente (unidad).
Seleccione un nuevo componente en la parte superior del cuadro de diálogo emergente. Debido a que todos los atributos, métodos y eventos de un control no pueden ser compuestos por sí mismo, debe seleccionar la clase de antepasados (o "clase principal" o "clase base") y luego agregar sus propios atributos, métodos y eventos en ella. . Seleccione la clase de antepasado deseado en el cuadro desplegable después del tipo de antepasado. Dado que debe dibujar una imagen escribiendo un control visual, TgraphicControl se selecciona como la clase de antepasados. Luego ingrese el nombre del nuevo control (clase) en el cuadro Nombre de clase, que generalmente comienza con "T". La página de la paleta se utiliza para seleccionar el nombre de la página de control del nuevo control en la ventana Delphi, como "estándar", que puede ser tomada por usted mismo. Agregue la ruta y el nombre del archivo del nuevo archivo de control en el nombre del archivo de la unidad y haga clic en el botón Aceptar. Se agregan nuevos controles. Ahora puede escribir código para este control.
El siguiente es un ejemplo de escribir una barra de desplazamiento que puede personalizar la imagen para ilustrar cómo escribir un control visual.
Siga el método anterior, seleccione TGraphicControl como la clase Ancestor, y el nombre del nuevo control es TPighorizontalsCroller (barra de desplazamiento horizontal de cerdos). Después de seleccionar la ruta del archivo y el nombre del archivo, haga clic en el botón Aceptar para comenzar a escribir el código.
Cada control se creará y eliminará, por lo que primero debe escribir estos dos procesos. Para cada proceso en el control, debe definirse primero y luego escribir más tarde. Hay tres tipos de procesos o atributos definidos:
1. La definida después del privado se usa internamente al control, y la persona que usa el control no puede verlo;
2. Lo que se define después de protegido es generalmente invisible, y solo se puede ver cuando otros usan el control como clase de antepasado para escribir otros controles;
3. Solo se puede llamar a otros en el programa después del público;
4. La definida después de la publicación se puede ver en la ventana de propiedades (Inspector de objetos). Dado que el proceso de creación y deleción no solo se ejecuta automáticamente cuando el control se crea durante el proceso de programación, también puede llamarse cuando el control se crea dinámicamente durante el programa en ejecución, por lo que se define después del público⑴. (Este número de secuencia indica la ubicación del código en el programa de origen adjunto, lo mismo a continuación) Ahora, tal vez no sé qué escribir en estos dos procesos y cómo editarlo. Hablaremos de ello a continuación.
Primero agregemos algunas propiedades a este control. Definimos una propiedad máxima para establecer o leer el valor máximo de la barra de desplazamiento. Debido a que los atributos no se usan directamente en los programas, debe definir una variable que corresponda al atributo, al modificar o leer su valor. Dado que solo se usa dentro del control, lo definimos después de privado ⑵. (Generalmente, las variables asociadas con los atributos comienzan con "F", como Fmax) Después de definir la variable, definen los atributos. Esta propiedad debe ser visible en la ventana del inspector de objetos, así que defínela y publíquela después de ⑶. La sintaxis definida es:
Propiedad <Nombre de propiedad>: <Proye> Read <Variable receptiva Al leer esta propiedad> Escribir <Variable receptiva o proceso Al escribir esta propiedad>
Otras variables y atributos también se definen de manera similar (como el valor mínimo mínimo, el valor de valor actual, etc.). A continuación definimos varios atributos y variables para establecer la imagen de barra de desplazamiento (porque las variables de imagen son especiales, hablaré de ellas por separado). Definimos la álfeera izquierda (imagen del botón izquierdo), izquierda -Buttondownpicture (imagen del botón izquierdo presione) y así sucesivamente como tipo TBITMAP (debe definir la variable correspondiente).
Todos deben haber notado que en el programa fuente adjunto, al definir estas propiedades, la variable correspondiente al leer las propiedades especificadas después de la lectura es f ..., y la variable correspondiente al escribir las propiedades especificadas después de escribir no son variables, sino algo así como Establecer ..., es un proceso personalizado. El proceso como esta función se define como:
Procedimiento <Nombre de proceso> (valor: <tipo de valor de la propiedad establecida>)
Debido a que se deben hacer otras cosas al escribir los atributos de esta clase, no se puede procesar con una sola variable, pero debe procesarse con un proceso. Este proceso generalmente se define después de protegido. En este proceso de clase, una declaración como esta en ⑷ se usa para asignar valores a una variable de tipo TBITMAP, que se adopta porque las variables de este tipo no se pueden asignar directamente.
Después de definir las propiedades de estas variables de tipo TBITMAP, el código debe escribirse en el proceso Crear y destruir el proceso mencionado anteriormente. Debido a que TBITMAP también es una clase, debe crearse en el proceso Crear ⑸, y el libre debe liberarse durante el proceso de destrucción. La declaración hereditaria mencionada aquí se utiliza para indicar que el proceso se hereda de la clase de antepasados. (Esto no debe ser eliminado).
Debido a que escribimos controles visuales, tenemos que dibujar imágenes en los controles. La clase de antepasados de nuestro control, tGraphicControl, encapsula un objeto de lienzo, que podemos usar directamente para dibujar imágenes. Si no está familiarizado con el uso de lienzo, es mejor encontrar un libro para leerlo.
El siguiente trabajo es dibujar imágenes. ¿Cómo dibujar imágenes sobre el control? Hay un evento de pintura en la clase de antepasado TGraphicControl, que se activará automáticamente cuando el control sea necesario volver a pintar. Lo que tenemos que hacer ahora es escribir un programa para este evento. Primero, defina un objeto de lienzo después de protegido. Como ya está en la clase de antepasados, no hay necesidad de agregar ninguna explicación⑻. Usaremos este objeto para dibujar. A continuación, debe definir un proceso de pintura y escribir el código para dibujar el control. Primero defina el proceso de pintura en público. Dado que la clase de antepasados lo desencadena, no por el usuario, la anulación debe agregarse después, de lo contrario el control no se convertirá en un control visual porque el procedimiento de pintura nunca se llamará. Escribamos el código para el proceso de pintura⑽.
Las variables como T_HEight en el proceso de pintura del programa de origen adjunto a este artículo se utilizan para guardar el tamaño de los botones, controles deslizantes, etc. en la barra de desplazamiento. , la mayoría de los cuales son correctos, creo que todos entenderán el funcionamiento del lienzo de un vistazo. Vale la pena señalar que el siguiente juicio sobre la variable de fautosize⑾
Fautosize es una variable booleana asociada con la propiedad del control del control. Tenga en cuenta que en el código de control, el atributo no se llama directamente, pero se utiliza la variable correspondiente.
Después de que el programa se haya compilado aquí, incluso si finalmente eché un vistazo a mi nuevo control, no puede desplazarse. Ahora escribamos el evento del mouse para que podamos manipularlo. La definición del proceso del evento del mouse es muy similar al proceso de pintura, excepto que las descripciones de parámetros deben agregarse más adelante.
Los eventos del ratón se dividen en mousedown, mouseMove y mouseup, y la anulación debe agregarse después de la definición. A continuación, escriba su código más tarde. Nota: El evento del mouse aquí es el mouse ..., no el habitual en el mouse ... Pero, ¿para cuál es la definición de ⒀? Las definiciones de eventos aquí son todas para los usuarios, es decir, cuando se usan este control, se mostrarán en la página del evento en el Inspector de Objetos.
El código para estos eventos del mouse también es muy simple. Vale la pena señalar que al llamar a un evento personalizado, primero debe usar dicha declaración en ⒁ para determinar si el usuario ha escrito código para el evento. Esto es muy importante, de lo contrario, se producirá un error en la llamada.
Todos han notado que los eventos llamados ahora están personalizados, y el método de definición es muy simple, lo que es similar al atributo de definición, pero tnotifyEvent cuando se escribe.
TNotifyEvent es el evento predeterminado, que se define como:
TnotifyEvent = procedimiento (remitente: tobject)
Si desea definir otra forma de evento, debe hacer esto: primero escríbalo en el tipo y luego
<Name de tipo de evento> = procedimiento (<amarréter>: <prey>)
Por ejemplo:
TcustomEvent = procedimiento (a: entero; b: string);
Luego, después de la definición pública:
<Nombre del evento>: <Nombre de tipo de evento>
Por ejemplo:
Anevent: tcustomevent;
Después de leerlos, debe comprender todo el programa. Si hay un error en la compilación u operación, verifique los siguientes puntos:
1. Si hay declaraciones hereditarias en el proceso Crear y destruir;
2. Si las variables del tipo TBITMAP crean y se gratuito son creadas o gratuitas;
3. ¿Hay un nombre de control antes del proceso, por ejemplo: tpighorizontalscroller.mosemove
Cómo determinar si el mouse entra o deja el control:
Defina el siguiente proceso:
procedimiento mouseenter (var msg: tmessage);
procedimiento MouseLeave (var msg: tmessage);
¡Simplemente escriba el código a continuación!
¡Este método es muy útil para escribir botones de tres estados!