Observe todo el proceso de desarrollo de componentes VCL a través de ejemplos (1)

Este artículo es un resumen de lo que aprendí hace algún tiempo y una revisión de mi propio proceso de aprendizaje. Este artículo utiliza un ejemplo simple para demostrar tanto como sea posible todos los aspectos del desarrollo de componentes VCL. Dirigido a los componentes que están a punto de aprender para principiantes en el desarrollo. Si ya está familiarizado con el desarrollo de componentes o cree que el contenido de este artículo es demasiado básico y simple, entonces este artículo no le resultará útil. Se supone que ya está familiarizado con la programación general de Delphi y la jerarquía estructural de VCL, así como con algunas palabras clave importantes como propiedad publicada, etc. (Tenga en cuenta que el contenido de este artículo se basa en Delphi y versiones posteriores)

En este artículo crearemos un componente relacionado con el tiempo. Este componente tiene las siguientes funciones básicas para mostrar la hora actual del sistema configurando sus diferentes estados (incluida la configuración del despertador) Cuenta regresiva del cronómetro Este es un ejemplo simple. Sin embargo, usaremos tantas funciones de Delphi como sea posible en el desarrollo de componentes en este ejemplo. Puede leer de forma selectiva las funciones involucradas en este artículo que se enumeran a continuación

·Componentes y paquetes de componentes

.

·Categorías de atributos de componentes

·Editor de atributos de componentes

·Editor de componentes

Componentes y paquetes de componentes y algunos tipos de archivos debes saber

La relación entre componentes y paquetes de componentes es la misma que la relación entre archivos de unidad y de proyecto en proyectos normales. Todos los componentes que instala se publican en forma de paquetes de componentes. componentes en un paquete de componentes En el desarrollo de componentes, el paquete de componentes es el archivo de proyecto del proyecto. Para comenzar a desarrollar nuestro componente (lo llamamos TClock) y lo incluimos en nuestro propio paquete de componentes (ClockPackage), seleccionamos Fileànewàother. Paquete en la página Nuevo en la ventana emergente para crear un nuevo paquete de componentes y obtener una ventana de paquete de componentes. Vea el archivo original (dpk) de este paquete de componentes y obtenga el siguiente código

paquete ClockPackage;

{$R * res}

{$ALIGN }

{$ASSERTIONS ON}

… …

{$DESCRIPTION Nuestro paquete de reloj }

{$IMPLICITBUILD OFF}

requiere

rtl

;

end

Este archivo es en realidad el archivo de proyecto en el desarrollo de componentes. La palabra clave require indica la lista de paquetes de componentes necesarios para el paquete de componentes a medida que se agregan componentes al paquete de componentes (similar a una unidad). archivo) También verá que la palabra clave contiene indica los componentes contenidos en el paquete de componentes. Puede agregar nuevos componentes y eliminar componentes existentes a través de los botones Agregar y Eliminar en la ventana del paquete de componentes. Además, el código en este código es mayor. la gran cantidad de modificadores del compilador incluidos se pueden configurar en Opciones en el formulario del paquete de componentes. Lo que debe complementarse aquí son las propiedades importantes del paquete de componentes (todas en Opciones): Solo tiempo de diseño Solo tiempo de ejecución Tiempo de diseño y tiempo de ejecución (el significado de). esta palabra Todos los amigos con conocimientos básicos de inglés deberían saber esto.) Para la mayoría de los paquetes de componentes, solo necesitamos elegir el último. Sin embargo, algunos paquetes de componentes están diseñados para funcionar únicamente en tiempo de ejecución (para que el programa que desarrolle con este conjunto de. Los componentes no se pueden separar del componente y ejecutarse por separado. El paquete no se puede instalar). Algunos paquetes de componentes están diseñados para diseñarse solo en el momento del diseño (esto se explicará con más detalle más adelante)

Después de comprender los componentes. y paquetes de componentes, tenemos algunas respuestas que pueden aparecer en el desarrollo de componentes. Haga algunas explicaciones para los archivos que no ha visto. El archivo dpk es el código original del paquete del componente. paquete Si el dpk no está publicado, puede instalar el paquete del componente en Delphi a través de bpl (ProjectàOptionsàPackagesàadd.

) pas aquí es el código original del componente en el paquete del componente. Dcu es el resultado compilado para pas. Cuando elige incluir el componente en el paquete del componente (contiene la palabra clave), puede optar por publicar el código original o no ( dcu) dcp El conector utilizará este archivo si usa el componente como componente de tiempo de ejecución

2. Comience a desarrollar componentes

Después de comprender el conocimiento anterior, ¡podemos comenzar a desarrollar componentes! Haga clic en Agregar en el formulario del componente, seleccione la página Nuevo componente y seleccione en el primer cuadro combinado de qué clase heredará nuestro componente (generalmente los nuevos componentes se desarrollan heredando los componentes existentes, ya que la función principal de este componente es mostrar el texto). información de la cuenta atrás del cronómetro, elegimos heredar de TCustomLabel (ya que no necesitamos todas las funciones de Tlabel, elegimos la clase TcustomLabel que puede ocultar el atributo de Tlabel y publicar selectivamente sus atributos) A continuación, para nuestro Dar el nuevo componente un nombre Tclock y luego especificamos en qué página queremos instalar el componente. Aquí escribimos una página ClockAndTime. Esto aparecerá en el proceso RegisterComponents (se explicará en detalle más adelante). es mejor colocarlo en el mismo directorio que el paquete dpk del componente. Confirme que este es el paquete del componente. En el formulario contiene, ya hay un archivo para el componente que acabamos de crear. Haga doble clic en él para comenzar a escribir código.

En el código, debemos prestar atención a la interfaz Parte de un nuevo proceso, procedimiento Registro (tenga en cuenta que Delphi estipula que la R en Registro debe estar en mayúscula, que es una palabra reservada). se requiere un proceso para cada componente. Completa el registro del componente, incluido el componente en sí y el editor de propiedades, etc. Registro de las características del componente)

procedimiento Registrar

comenzar <. /p>

RegisterComponents( ClockAndTime [TClock]);

//Este proceso ¿El componente de registro notó la página ClockAndTime definida anteriormente?

//Habrá algunos procesos nuevos aquí más adelante, incluido el registro de categorías de atributos de componentes, etc.

end

El código del componente supone que está familiarizado con el desarrollo de Delphi (no es diferente del desarrollo general). Lo publicaremos directamente y agregaremos los comentarios apropiados

unidad Reloj

interfaz

usos;

p>

SysUtils Classes Controls StdCtrls ExtCtrls;

tipo

TState=(StClock StRunClock StBackClock);//Defina la clase de enumeración para representar el estado del reloj de control cronómetro cuenta regresiva

TClock = class(TCustomLabel)

private

fState:TState

fTimer:TTimer; ;//Por qué usar este componente No hace falta decir acerca de los miembros privados de nuestro componente

RCD:array[ ] of integer;//Los diversos dígitos en el cronómetro

fBeginTime: string;//Cuando se trata de tiempo, la razón por la cual el reloj de inicio no usa el tipo TTime es para demostrar el editor de propiedades más tarde

fWakeTime:string;//La hora de la alarma es por la misma razón que arriba

fAllowWake:boolean;/ /Si activar la función de despertador

fOnWakeUp:TNotifyEvent;// Para que el componente sea más perfecto, permitimos a los usuarios del componente

Capaz de responder a eventos cuando llega el despertador

fOnTimeUp:TNotifyEvent;//Igual que el anterior para responder a eventos cuando se completa la cuenta regresiva Publicaremos estos dos eventos

función. GetActive:boolean;/ /Controlar si el temporizador funciona para controlar si el reloj en este estado funciona

procedimiento SetActive(Value:boolean);

procedimiento SetState(Value:TState);

procedimiento SetBeginTime(Value:string);

procedimiento SetWakeTime(Value:string);

protegido

procedimiento WalkClock(remitente: TObject);//como reloj Tiempo en ejecución de eventos

procedimiento RunClock(sender:TObject); //Cronómetro

procedimiento BackClock(sender:TObject);//Cuenta regresiva

public

constructor Create(AOwner:TComponent);override;//Completar algún trabajo de inicialización

procedimiento ReSetRunClock; //Tanto el cronómetro como la cuenta regresiva requieren un método de reinicio para los usuarios del componente. llamar

procedimiento ReSetBackClock

publicado

propiedad State:TState leer fState escribir SetState default StClock;//el valor predeterminado es el estado del reloj

propiedad Active :boolean read GetActive write SetActive;//Controla si el reloj en este estado está funcionando

propiedad BeginTime:string lee fBeginTime escribe SetBeginTime

propiedad WakeTime:string lee fWakeTime; escribir SetWakeTime

p>

propiedad AllowWake:boolean leer fAllowWake escribir fAllowWake;

propiedad OnWakeUp:TNotifyEvent leer fOnWakeUp escribir fOnWakeUp; TNotifyEvent leer fOnTimeUp escribir fOnTimeUp;

//Finalmente publicamos algunas propiedades que están ocultas por TCustomLabel y necesitamos

propiedad Align

propiedad Alignment

p>

propiedad Color;

propiedad Fuente

propiedad ParentColor;

propiedad ParentFont

propiedad ParentShowHint; p>

propiedad PopupMenu;

propiedad ShowHint

propiedad Visi;

ble;

propiedad Transparente

propiedad OnClick;

fin

registro de procedimiento

/p>

procedimiento Registrar

comenzar

RegisterComponents( ClockAndTime [TClock]); }

constructor TClock Create(AOwner: TComponent);

comenzar

heredado Create(AOwner)

//Establecer valor predeterminado;

fTimer:=TTimer Create(self);

//Hacer que pertenezca a nuestro componente para que no tengamos que escribir un destructor y podamos liberar automáticamente el temporizador cuando esto el componente se libera

p>

Active:=false

AllowWake:=false

State:=StClock

BeginTime:= : : ;

WakeTime:= : :

fin

función TClock GetActive:

comenzar;

resultado:= fTimer habilitado;

finalizar

procedimiento TClock SetActive(Valor: booleano

comenzar

);

fTimer habilitado:=Valor;

fin;

procedimiento TClock SetState(Valor: TState); :integer;

comenzar

caso Valor de

StClock:

comenzar

Activo:=false;

Intervalo del temporizador: = ;

fTimer OnTimer:=WalkClock

Activo:=true

fin;

StRunClock:// debido al tipo de tiempo Es difícil manejar operaciones de microsegundos. Solo podemos imitar este código de operación manualmente, lo cual es un poco engorroso

comenzar

Activo. :=false;

para i:= hacer RCD [i]:=

Título:=IntToStr(RCD[ ])+IntToStr(RCD[ ])+ : + IntToStr(RCD[ ])+IntToStr(RCD[ ])+ : +IntToStr( RCD[ ]);

Título:=Título+IntToStr(RCD[ ])+ : +IntToStr(RCD[ ]) +IntToStr(RCD[ ]);

fTimer Interval: = ;

//Después de las pruebas, este cronómetro funciona muy bien, pero esto es solo una demostración técnica

// De hecho, RunCl se ejecuta con tanta frecuencia (/ segundos)

ock mantendrá el uso de la CPU alcanzando %

//Esta no es una buena idea, de hecho, desea mostrar el nivel de microsegundos en el cronómetro y ocupar la CPU de manera razonable

/. /Esto requiere una programación más flexible y compleja

fTimer OnTimer:=RunClock

end

StBackClock:

comenzar

Activo:=falso;

Título:=BeginTime;

fTimer Interval:=

fTimer OnTimer:=BackClock;

p>

fin;

fin;

fState:=Valor;

fin

procedimiento TClock SetBeginTime; (Valor: cadena);

comenzar

probar

StrToTime(Value

fBeginTime:=Value;

si Estado=StBackClock entonces

comenzar

Activo:=falso

Título:=Valor

fin; /p>

excepto

en Excepción

comenzar

fBeginTime:= : :

si State=StBackClock entonces; Título: = : : ;

fin;

fin;

fin

procedimiento TClock SetWakeTime(Valor: cadena); /p>

comenzar

intentar

StrToTime(Value

fWakeTime:=Value

excepto

en Excepción

comenzar

fWakeTime:= : :

finalizar

finalizar;

finalizar

procedimiento TClock WalkClock(remitente: TObject

comenzar

Título:=TimeToStr(Time); > si AllowWake y (StrToTime(Caption)=StrToTime(WakeTime)) entonces

comienza

Beep;//Buzzer

si está asignado (fOnWakeUp) entonces

p>

fOnWakeUp(self);

fin;

fin

procedimiento TClock RunClock(remitente: TObject); >

comenzar

RCD[ ]:=RCD[ ]+

si RCD[ ]= entonces comenzar RCD[ ]:=RCD[ ]+ ; = ; finalizar ;

si RCD[ ]= entonces comenzar RCD[ ]:=RCD[ ]+ ;

RCD[ ]:= ; fin; si RCD[ ]= entonces comienza RCD[ ]= entonces RCD[ ]; :=RCD[ ]+ ;RCD[ ]:= ; finalizar

si RCD[ ]= entonces comenzar RCD[ ]:=RCD[ ]+ ;RCD[ ]:= fin; >

si RCD[ ]= entonces comienza RCD[ ]:=RCD[ ]+ ;RCD[ ]:=

si RCD[ ]= entonces comienza RCD[ ]:=RCD[; ]+ ;RCD[ ]:= ; fin;

si RCD[ ]= entonces RCD[ ]:= ; //Nuestro cronómetro puede contar hasta horas; IntToStr(RCD[ ])+IntToStr(RCD[ ])+ : +IntToStr(RCD[ ])+IntToStr(RCD[ ])+ : +IntToStr(RCD[ ]); +IntToStr(RCD[ ])+ : +IntToStr(RCD[ ])+IntToStr(RCD[ ]);

fin

procedimiento TClock BackClock(remitente: TObject) ;/ /Puede contar atrás en un día o algo así

comenzar

si StrToTime(Caption)<>StrToTime( : : ) entonces

Caption:=TimeToStr ( StrToTime(Caption) )

else

comenzar

Activo:=false

Pitido

si; Asignado(fOnTimeUp) luego

fOnTimeUp(self);

fin

fin

procedimiento TClock ReSetBackClock

var

i:integer;

comenzar

si State=StRunClock entonces

comenzar

Activo:=falso;

para i:= hacer RCD[i]:=

Título:= : : :

fin; p>

finalizar

procedimiento TClock ReSetRunClock

comenzar

si State=StBackClock entonces

comenzar

Active:=false;Caption:=BeginTime;

end;

end

end Para probar nuestro componente, puede instalarlo ahora. paquete y cree una aplicación para probarlo, simplemente haga clic en instalar en el formulario del paquete del componente (tenga en cuenta que una vez que instale el paquete del componente, cuando desee modificar el componente, solo necesita hacer clic en pila en el formulario del componente después de modificar el código original Eso es todo (simplemente actualice el componente)) En este momento, al final de la página de componentes de Delphi, hay una página que definimos, ¡que contiene nuestro componente! lishixinzhi

/Artículo/programa/Delphi/201311/24840

t>