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