Delphi DBGrid es un componente tan poderoso que probablemente lo esté usando todos los días si está desarrollando aplicaciones compatibles con los datos. A continuación, veremos cómo agregar algunas características más a sus aplicaciones de base de datos que sus usuarios seguramente adorarán.
Siguiendo los conceptos descritos en el Guía de principiantes para la programación de bases de datos de Delphi, los ejemplos a continuación usan componentes ADO (AdoQuery / AdoTable conectado a ADOConnection, DBGrid conectado a AdoQuery sobre DataSource) para mostrar el registros desde una tabla de base de datos en un componente DBGrid.
Todos los nombres de los componentes se dejaron como Delphi los nombró cuando se soltaron en el formulario (DBGrid1, ADOQuery1, AdoTable1, etc.).
El mouse se mueve sobre el área de título de DBGrid
Primero, veamos cómo cambiar el puntero del mouse mientras se mueve sobre el área del título DBGrid. Todo lo que tiene que hacer es agregar el código al evento OnMouseMove para el componente DBGrid.
El siguiente código simplemente usa la propiedad MouseCoord del componente DBGrid para "calcular" dónde está el puntero del mouse. Si está sobre el área de título de DGBrid, el pt.y es igual a 0, que es la primera fila de DBGrid (el área de título que muestra los títulos de columna / campo).
procedimiento TForm1.DBGrid1MouseMove
(Remitente: TObject; Shift: TShiftState; X, Y: entero);
var
pt: TGridcoord;
empezar
pt: = DBGrid1.MouseCoord (x, y);
Si pt.y = 0 luego
DBGrid1.Cursor: = crHandPoint
más
DBGrid1.Cursor: = crDefault;
final;
Ordenar por columna Haga clic y cambie la fuente del título de la columna
Si está utilizando el enfoque ADO para el desarrollo de bases de datos Delphi y desea ordenar los registros en el conjunto de datos, debe establecer la propiedad Ordenar de su AdoDataset (ADOQuery, AdoTable).
La propiedad Sort es el valor de cadena ancha que indica la parte "ORDER BY" de la consulta SQL estándar. Por supuesto, no necesita escribir la consulta SQL para poder usar la propiedad Ordenar. Simplemente configure la propiedad Ordenar en el nombre de un solo campo o en una lista de campos separados por comas, cada uno siguiendo el orden de clasificación.
Aquí hay un ejemplo:
ADOTable1.Sort: = 'Año DESC, ArticleDate ASC'
El evento OnTitleClick del componente DBGrid tiene un parámetro Column que indica la columna en la que el usuario ha hecho clic. Cada columna (objeto de tipo TColumn) tiene una propiedad Field que indica el campo (TField) representado por la columna, y el campo en su propiedad FieldName contiene el nombre del campo en el subyacente conjunto de datos
Por lo tanto, para ordenar un conjunto de datos ADO por campo / columna, se puede usar una línea simple:
con TCustomADODataSet (DBGrid1.DataSource. DataSet) hacer
Ordenar: = Columna. Campo. Nombre del campo; // + 'ASC' o 'DESC'
A continuación se muestra el código para el controlador incluso OnTitleClick que clasifica los registros por clic en la columna. El código, como siempre, extiende la idea.
Primero, queremos, de alguna manera, marcar la columna que se usa actualmente para ordenar. A continuación, si hacemos clic en el título de una columna y el conjunto de datos ya está ordenado por esa columna, queremos cambiar el orden de clasificación de ASC (ascendente) a DESC (descendente), y viceversa. Finalmente, cuando clasificamos el conjunto de datos por otra columna, queremos eliminar la marca de la columna seleccionada previamente.
En aras de la simplicidad, para marcar la columna que "clasifica" los registros, simplemente cambiaremos el estilo de fuente del título de la columna a Negrita y lo eliminaremos cuando el conjunto de datos se ordene usando otra columna.
procedimiento TForm1.DBGrid1TitleClick (Columna: TColumn);
{$ J +}const PreviousColumnIndex: entero = -1;
{$ J-}
comenzar DBGrid1.DataSource. Conjunto de datos es TCustomADODataSet entonces con TCustomADODataSet (DBGrid1.DataSource. Conjunto de datos) dobegintry
DBGrid1.Columns [PreviousColumnIndex] .title. Fuente. Estilo: =
DBGrid1.Columns [PreviousColumnIndex] .title. Fuente. Estilo - [fsBold];
exceptuar;
Column.title. Fuente. Estilo: =
Column.title. Fuente. Estilo + [fsBold];
PreviousColumnIndex: = Columna. Índice;
Si (Pos (columna. Campo. FieldName, Sort) = 1)
y (Pos ('DESC', Ordenar) = 0) luego
Ordenar: = Columna. Campo. FieldName + 'DESC'
más
Ordenar: = Columna. Campo. FieldName + 'ASC';
final;
final;
El código anterior usa constantes escritas para preservar el valor de la columna "seleccionada" previamente para el orden de clasificación.