Cuando se utiliza Delphi para el diseño de bases de datos, es inevitable involucrar la entrada de campos de fecha. Sin embargo, en comparación con la versión china Access 97 de Microsoft, los métodos de visualización y entrada de campos de fecha proporcionados por Delphi no son adecuados para los hábitos de los chinos. Por lo tanto, se han propuesto muchas soluciones para el procesamiento de campos de fecha, pero los resultados del procesamiento no son uniformes en la visualización y la entrada. Por ejemplo, el formato "aaaa año mm mes dd día" se puede implementar al mostrar, pero aún es necesario. que se ingresará al ingresar Utilice "aaaa-mm-dd" de acuerdo con las costumbres extranjeras. La entrada en el formulario siempre es problemática cuando se utiliza TdateTimePicker para la entrada de selección; algunos métodos también necesitan modificar algunas propiedades de configuración del sistema, por lo que las propiedades del sistema también deben ajustarse al usar controles de terceros. está empaquetado y liberado. Además, los formatos de fecha comúnmente utilizados, como "1999" y "noviembre de 1999", no se procesan en consecuencia. Aquí, según mi propia práctica, utilizo la combinación de los eventos OnGetText y OnSetText de TField para lograr la unificación de la visualización y la entrada de campos de fecha, y puedo manejar nuestras fechas comunes como "1999" y "noviembre de 1999". y la entrada de formularios se implementan utilizando los eventos proporcionados por Delphi, y no es necesario modificar ninguna configuración del sistema. Después de la expansión correspondiente, también se puede utilizar para mostrar e ingresar la hora, como "hh punto mm minuto", etc. Al mismo tiempo, dado que los eventos de TField se controlan directamente, ya sea usando TDBGrid o TDBEdit, se pueden procesar de manera unificada sin tener que considerarlos por separado. También se puede aplicar un enfoque similar a la entrada de fechas en aplicaciones que no son de bases de datos.
1 idea básica
Utilice la propiedad EditMask de TField para que sirva como máscara de visualización y de entrada. La visualización del campo de fecha se procesa en el evento OnGetText de TField y el juicio de validez del valor de entrada se procesa en el evento OnSetText. Para reutilizar el código, coloque los procedimientos y funciones llamados por los controladores de eventos OnGetText y OnSetText en una unidad separada.
2 Código de implementación específico
{Unidad de visualización y evaluación}
unidad DBDateEditMaskTrans;
interfaz
usos
Windows, SysUtils, Controles, Formularios, Db;
{Proceso de visualización del campo de fecha, llamado en el evento OnGetText}
Procedimiento DateFieldGetText(Remitente: TField; var Texto: String);
{Función de juicio de entrada del campo de fecha, llamada en el evento OnSetText}
función DateFieldSetText(Remitente: TField; texto constante: Cadena):Booleano;
implementación
procedimiento DateFieldGetText(Remitente: TField; var Texto: Cadena);
var
dFecha:TFecha;
wAño,wMes,wDía:Palabra;
aryTestYMD:Array [1..2] of Char;{Matriz temporal para máscara de entrada de prueba}
iYMD:Entero;
comenzar
dFecha:=Remitente.AsDateTime;
DecodeDate(dFecha,wAño,wMes,wDía);
{Pruebe el formato contenido en la máscara de entrada.}
aryTestYMD:='año';
si StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil entonces
iYMD:=1;
aryTestYMD:='mes';
si StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil entonces
iYMD:=2;
aryTestYMD:='Día';
si StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil entonces
iYMD:=3;
caso iYMD de
1:{La máscara de entrada tiene el formato "aaaa año".}
Texto:=IntToStr(wAño)+'año';
2: {La máscara de entrada tiene el formato "aaaa año mm mes".}
Texto:=IntToStr(wAño)+'año'+IntToStr(wMes)+'mes';
3: {La máscara de entrada tiene el formato "aaaa año mm mes dd día".}
Texto:=IntToStr(wAño)+'año'+IntToStr(wMes)+'mes' +IntToStr(wDía)+'día';
else {El valor predeterminado es: formato "aaaa año mm mes dd día".}
Texto:=IntToStr(wAño)+'año'+IntToStr(wMes)+'mes' +IntToStr(wDía)+'día';
fin;
fin;
función DateFieldSetText(Remitente: TField; texto constante: Cadena):Booleano;
var
dFecha:TFecha;
sAño,sMes,sDía:Cadena;
aryTestYMD:Array [1..2] de Char;
iYMD:Entero;
comenzar
{Obtener la fecha ingresada por el usuario}
sAño:=Copiar(Texto,1,4);
sMes:=Copiar(Texto,7,2);
SDay:=Copiar(Texto,11,2);
{Pruebe el formato contenido en la máscara de entrada.}
aryTestYMD:='año';
si StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil entonces
iYMD:=1;
aryTestYMD:='mes';
si StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil entonces
iYMD:=2;
aryTestYMD:='Día';
si StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil entonces
iYMD:=3;
{Usar Probar...Excepto para convertir la fecha de entrada}
intentar
comenzar
caso iYMD de
1: {La máscara de entrada tiene el formato "aaaa año".}
comenzar
dDate:=StrToDate(sYear+'-01-01') ;{El formato de fecha predeterminado de Windows chino es: aaaa-mm-dd Lo mismo a continuación}
Sender.AsDateTime:=dFecha;
fin;
2: {La máscara de entrada tiene el formato "aaaa año mm mes".}
comenzar
dFecha:=StrToDate(sAño+'-'+sMes+'-01');
Sender.AsDateTime:=dFecha;
fin;
3: {La máscara de entrada tiene el formato "aaaa año mm mes dd día".}
comenzar
dFecha:=StrToDate(sAño+'-'+sMes+'-'+sDía);
Sender.AsDateTime:=dFecha;
fin;
else {El valor predeterminado es: formato "aaaa año mm mes dd día".}
comenzar
dFecha:=StrToDate(sAño+'-'+sMes+'-'+sDía);
Sender.AsDateTime:=dFecha;
fin;
fin;
DateFieldSetText:=Verdadero;
fin;
excepto
{Error de conversión de fecha}
comenzar
application.MessageBox(PChar(Text+'¡No es una fecha válida!'), 'Error',mb_Ok+mb_IconError);
DateFieldSetText:=Falso;
fin;
fin;
fin;
fin.
{unidad de ventana principal}
unidad principal;
interfaz
usos
…{omitir otro contenido}
procedimiento Table1BirthdayGetText(Remitente: TField; var Texto: Cadena;DisplayText: Boolean);
procedimiento Table1BirthdaySetText(Remitente: TField; texto constante: Cadena);
privado
{Declaraciones privadas}
público
{Declaraciones públicas}
……{levemente}
implementación
{Incluir unidades personalizadas}
utiliza DBDateEditMaskTrans;
{$R *.DFM}
...{Otros procesos omitidos}
procedimiento TForm1.FormActivate(Remitente: TObject);
{Establezca la máscara de entrada de un campo de fecha, que se puede colocar en la definición del campo TField. }
comenzar
Table1.FieldByName('Cumpleaños').EditMask:= '99-99-99;1;_';
fin;
procedimiento TForm1.Table1BirthdayGetText(Remitente: TField; var Texto: Cadena;DisplayText: Boolean);
comenzar
DateFieldGetText(Remitente,Texto);
fin;
procedimiento TForm1.Table1BirthdaySetText(Remitente: TField; texto constante: Cadena);
comenzar
si DateFieldSetText(Remitente,Texto)=False entonces
Cancelar; {Error de conversión, la fecha es ilegal}
fin;
fin.