A Delphi é conveniente e rápida para desenvolver aplicativos C/S, pois possui um grande número de acesso de dados e controles de consciência de dados fáceis de usar. No entanto, tudo é difícil de aperfeiçoar. Ao criar um widget, a etapa mais importante é selecionar a classe pai correta, que pode reduzir a escrita do código. A biblioteca de componentes da Delphi já possui um componente TDATETIMEPicker, que pode entrar e alterar facilmente datas e tempo puxando o calendário ou usando o incremento e o decréscimo de spinbutton, mas não tem a capacidade de detectar dados. Portanto, podemos considerá-lo como classe pai e derivar um novo controle, além da função com reconhecimento de dados que podem se comunicar com o conjunto de dados. Os controles com consciência de dados interagem com o DataSource através de objetos Datalink, portanto, a adição de consciência de dados ao controle requer a criação de um objeto TDATALink (ou sua classe derivada) como membro do controle e criando propriedades públicas de campo de dados e DataSource para o controle; para os eventos do objeto Tdatalink Ondatachange e OnUpDatedata. Abaixo está o principal código -fonte do controle, com os comentários correspondentes: {Defina a classe TDBDATETIME derivada do tdateTimepicker. Observe que o db deve ser adicionado aos usos da interface da unidade, referência dbctrls} tipo
TdbdateTime = classe (tdateTimepicker)
Privado
Fdatalink: tfieldDatalink;
// tfielddatalink é uma classe derivada de tdatalink que lida com a interação de um único campo com uma fonte de dados
ProcedduzATACHANGE (remetente: TOBJECT);
// Quando o evento Ondatachange é acionado quando o registro das alterações no conjunto de dados (como o histórico de navegação), o DataChange será usado como identificador de manuseio de eventos para o evento
ProcedureUpDatedAtATA (remetente: TObject);
// O evento OnUpDatedata é acionado antes de atualizar o conjunto de dados, o UpdateTata será usado como o identificador de processamento do evento para o evento
functionGetDataSource: tdataSource;
ProcedimentosEtDataSource (Valor: TDataSource);
FunctionGetDatafield: string;
ProcedesetEtDatafield (Valor: String);
ProcedureCMexit (Varmessage: tcmexit); mensagem cm_exit; // pisca a mensagem CM_EXIT quando o controle perde o foco
protegido
ProcedureChange; Substitua; // Evento OnChange é acionado quando a data e a hora da mudança de controle.
ProcedureNotificação (Acomponente: TComponent;
Operação: toqueração); substituir;
// O IDE de Delphi chama esse método para notificar outros controles quando um controle é removido do formulário
público
construtorCreate (AOWNER: TCOMPONENT); substituição;
DestructorDestroy; substituir;
Lived
PropertyDataSource: TDataSourceReadgetDataSource
writeSetDataSource; // Adicione a propriedade DataSource ao controle para que possa ser conectado ao componente do DataSource
PropertyDatafield: StringReadGetDatafield
writeSetDatafield;
fim; // Adicione o atributo Datafield ao controle,
Faça apontar para um objeto TField representando um campo
Procedureregister; // Componente de registro
Implementação
ProcedureTDBDATETime.cmexit;
Começar
tentar
Fdatalink.updaterecord;
// Atualize o conjunto de dados quando o controle perde o foco, o que acionará o evento OnUpDatedata
exceto
SetFocus;
elevação;
fim;
Doexit;
fim;
constructortdbdateTime.create (awner: tComponent);
Começar
herdedcreate (awner);
// Crie objeto Datalink, Mount Ondatachange,
Identificador de processamento de eventos OnUpDatedata
Fdatalink: = tfieldDatalink.create;
Fdatalink.ondatachange: = DataChange;
Fdatalink.onUpDatedAtA: = UpdateTata;
fim;
DestructortdbdateTime.destroy;
Começar
Fdatalink.ondatachange: = nil;
Fdatalink.onUpDatedata: = nil;
Fdatalink.free;
herdeddestroy;
fim;
functtdbdateTime.getDataSource: tdataSource;
Começar
resultado: = fdatalink.dataSource;
fim;
ProcedureTDBDATETime.SetDataSource (Valor: TDataSource);
Começar
Fdatalink.dataSource: = value;
fim;
functtdbdateTime.getDatafield: string;
Começar
Resultado: = fdatalink.fieldname;
fim;
ProcedureTDBDATETime.SetDatafield (Valor: String);
Começar
Fdatalink.fieldName: = value;
fim;
ProcedureTDBDATETime.datachange (remetente: tabjas);
Começar
DateTime: = agora;
// Se o controle estiver conectado ao conjunto de dados ativo, o conjunto de dados mudará
O controle exibe o valor de campo correspondente do registro atual
iffdatalink.field Nilthen
iffdatalink.field.text Então
DateTime: = fdatalink.field.asDateTime;
fim;
ProcedureTDBDATETime.UpDatedAtA (remetente: TObject);
Começar
Fdatalink.field.asDateTime: = DateTime;
// Atualize os campos correspondentes com a data e hora no controle
fim;
ProcedureTDBDATETime.CHANGE;
Começar
// Defina o conjunto de dados para editar o estado quando o usuário altera o conteúdo no controle
Fdatalink.modificado;
ifnotfdatalink.editingThen
Fdatalink.edit;
HeritedChange;
fim;
ProcedureTDBDATETime.Notification (Acomponent:
TComponent; operação: toqueração);
Começar
herdadoNotification (acomponente, operação);
// quando o tdataSource conectado ao controle é
Defina a propriedade DataSource do controle para esvaziar quando excluído
if (operação = Opremove) e (fdatalink nil)
e (acomponente = DataSource) então
DataSource: = nil;
fim;
Procedureregister;
Começar
RegisterComponents (DataControls,
[TDBDATETIME]); // Depois que o controle é registrado, ele é instalado na página DataControls
fim;
fim.
Após a instalação, esse controle pode puxar o calendário e aumentar ou diminuir os campos de data e hora do banco de dados e pode exibir datas em dois formatos, o que é conveniente e prático. Os controles são seguros e confiáveis em Delphi3 e Delphi4.