Delphi es conveniente y rápido para desarrollar aplicaciones C/S porque tiene una gran cantidad de acceso de datos fácil de usar y controles de datos. Sin embargo, todo es difícil de perfeccionar. Al crear un widget, el paso más importante es seleccionar la clase principal correcta, que puede reducir la redacción del código. La biblioteca de componentes de Delphi ya tiene un componente TDateTiMepicker, que puede ingresar y cambiar fácilmente las fechas y el tiempo al extraer el calendario o usar el incremento y la disminución de los buttones, pero no tiene la capacidad de detectar datos. Por lo tanto, podemos tomarlo como la clase principal y derivar un nuevo control, más la función de los datos que pueden comunicarse con el conjunto de datos. Los controles de datos de datos interactúan con DataSource a través de objetos de enlace de datos, por lo que agregar conciencia de datos al control requiere crear un objeto TDatalink (o su clase derivada) como miembro del control y crear propiedades públicas de campo y datos de datos para el control; a los eventos de ondatachange y onupdatedata del objeto tdatalink. A continuación se muestra el código fuente principal del control, con los comentarios correspondientes: {Defina la clase TDBDateTime derivada de TDATETIMEPICKER. Tenga en cuenta que DB debe agregarse a los usos de la interfaz de la unidad, Tipo de referencia DBCTRLS}
TdbdateTime = class (tDateTiMepicker)
Privado
Fdatalink: tfielddatalink;
// tfielddatalink es una clase derivada de tdatalink que maneja la interacción de un solo campo con una fuente de datos
procedidoatachange (remitente: tobject);
// Cuando se activa el evento OnDatachange cuando cambia el registro del conjunto de datos (como el historial de navegación), Datachange se utilizará como el mango de manejo del evento para el evento
procedimientoupdatedata (remitente: tobject);
// El evento ONUPDATATATA se activa antes de actualizar el conjunto de datos, UpdateData se utilizará como el mango de procesamiento del evento para el evento
functetDataSource: tDataSource;
ProcedurSetDataSource (valor: TDataSource);
FunctetDataField: string;
ProceduresetDataField (valor: cadena);
procedimientoCMExit (Varmessage: tcMexit); mensaje cm_exit; // flashes CM_EXIT Mensaje Cuando el control pierde el enfoque
protegido
procedimientoChange; anular; // El evento Onchange se activa cuando la fecha y la hora en el cambio de control.
Procedurenotificación (cáculos: TComponent;
Operación: topación); anular;
// El IDE de Delphi llama a este método para notificar a otros controles cuando se elimina un control del formulario
público
constructorCreate (Alowner: TComponent); anular;
Destructordestroy; anular;
acogido
PropertyDataSource: TdataSourceraadgetDataSource
WriteSetDataSource; // Agregar propiedad de DataSource al control para que pueda conectarse al componente DataSource
PropertyDatafield: StringReadgetDataField
WriteSetDatafield;
end; // Agregar el atributo de DataField al control,
Hacer que apunte a un objeto tfield que representa un campo
procedimientoReGister; // registrar componente
Implementación
ProceduretDBDateTime.cMexit;
Comenzar
intentar
Fdatalink.updaterecord;
// Actualizar el conjunto de datos cuando el control pierda el enfoque, lo que activará el evento OnUpdatedata
excepto
Setfocus;
aumentar;
fin;
Doexit;
fin;
constructortdbdateTime.create (Awner: TComponent);
Comenzar
HerededCreate (Awner);
// Crear objeto de enlace de datos, montar ondatachange,
Mango de procesamiento de eventos onupdatedata
Fdatalink: = tfielddatalink.create;
Fdatalink.ondatachange: = datachange;
Fdatalink.onupdatedata: = Updateatedata;
fin;
Destructortdbdatetime.destroy;
Comenzar
Fdatalink.ondatachange: = nil;
Fdatalink.onupdatedata: = nil;
Fdatalink.free;
Destrodo heredado;
fin;
FunctTDBDateTime.getDataSource: TDataSource;
Comenzar
resultado: = fdatalink.dataSource;
fin;
ProceduretdbdateTime.setDataSource (valor: tdataSource);
Comenzar
Fdatalink.dataSource: = valor;
fin;
functionTdbDateTime.getDataField: String;
Comenzar
Resultado: = fdatalink.fieldname;
fin;
ProceduretDBDateTime.SetDataField (valor: string);
Comenzar
Fdatalink.fieldname: = valor;
fin;
proceduretdbdateTime.datachange (remitente: tobject);
Comenzar
DateTime: = ahora;
// Si el control está conectado al conjunto de datos activo, el conjunto de datos cambiará
El control muestra el valor de campo correspondiente del registro actual
iffdatalink.field Nilthen
iffdatalink.field.text entonces
DateTime: = fdatalink.field.asdateTime;
fin;
ProcedimientoTDBDateTime.Updatedata (remitente: tobject);
Comenzar
Fdatalink.field.asDateTime: = DateTime;
// Actualizar los campos correspondientes con la fecha y la hora en el control
fin;
proceduretdbdateTime.change;
Comenzar
// Establecer el conjunto de datos para editar el estado cuando el usuario cambia el contenido en el control
Fdatalink.modified;
ifnotfdatalink.editingthen
Fdatalink.Edit;
cambio heredado;
fin;
ProceduretDbDateTime.Notificación (CONCOponente:
Tcomponent; operación: topación);
Comenzar
Notificación hereditaria (cáculos, operación);
// Cuando el TDataSource conectado al control está
Establezca la propiedad de la fuente de datos del control en vacío cuando se elimine
if (operación = opremove) y (fdatalink nil)
y (conponente = DataSource) entonces
DataSource: = nil;
fin;
procedimientoRegistro;
Comenzar
RegisterComponents (DataControls,
[TdbdateTime]); // Después de registrar el control, está instalado en la página DataControls
fin;
fin.
Después de la instalación, este control puede reducir el calendario y aumentar o disminuir los campos de fecha y hora de la base de datos, y puede mostrar fechas en dos formatos, lo cual es conveniente y práctico. Los controles son seguros y confiables en Delphi3 y Delphi4.