Cuando las personas usan Delphi para desarrollar aplicaciones de bases de datos, a menudo usan controles de tabla para hacer informes. El uso flexible del evento OnDrawcell del control de la tabla puede completar la visualización de algunos efectos especiales, lo que puede satisfacer mejor las necesidades de los usuarios. Este artículo presenta tres consejos para usar de manera flexible utilizando eventos OnDrawcell.
Actualizar dinámicamente el color de las filas de la tabla
A veces es necesario actualizar el color de las filas de la tabla dinámicamente en el informe. Por ejemplo, en la lista de proveedores, los proveedores preferidos se muestran en verde, mientras que otros proveedores se muestran en rojo. En este momento, puede usar el siguiente código para implementarlo en el evento OnDrawCell:
if table1.fieldbyName ('custno'). Asinteger> 1500 entonces
Dbgrid1.canvas.font.color: = clred;
DBGRID1.DEFAULTDRAWCOLUMNCELL (RECT, DATACOL,
Columna, estado)
El código anterior se puede ampliar de acuerdo con las necesidades de la aplicación. Por ejemplo, cuando necesita mostrarlo en negrita, simplemente cambie la línea correspondiente a:
Dbgrid1.canvas.font.style: = [fsbold];
Insertar otros controles visuales en la tabla
En la programación de la base de datos, las restricciones de clave externa son un método efectivo para garantizar que los datos en la base de datos se almacenen de acuerdo con los requisitos del usuario. Por ejemplo, en un entorno de procesamiento de pedidos, existe una restricción de clave externa entre la tabla de pedidos y la tabla del cliente, es decir, cada registro en la tabla de pedidos debe tener un elemento correspondiente en la tabla del cliente. De esta manera, al completar el formulario de pedido, si se proporciona la lista de clientes para que el usuario elija en el enfoque de entrada, la corrección de los datos se garantizará efectivamente.
Tanto el control DBGRID como el control StringGrid se derivan de TCustomGrid, donde el control DBGRID puede ingresar datos. El mecanismo interno de Delphi para el procesamiento de DBGRID es flotar un control DBedit en la cuadrícula. La cuadrícula que puede obtener datos de enfoque y entrada es en realidad un control DBedit flotante. para que esos datos se ingresen en la tabla. Por lo tanto, la forma de insertar otros controles visuales en una tabla es flotar el control visual en la cuadrícula. Entonces, en principio, se puede insertar cualquier control en una tabla. Este artículo toma el ejemplo de insertar un cuadro desplegable en una tabla para introducir los pasos específicos para insertar otros controles en la cuadrícula.
1. Establecer propiedades
Lea la propiedad de elementos de la lista de clientes en el cuadro desplegable.
2. Configuración del evento OnDrawCell
El evento OnDrawcell se dispara al dibujar la celda de la mesa. Cuando el campo correspondiente a la celda que obtiene el enfoque es consistente con el campo correspondiente al cuadro desplegable, mueva el cuadro desplegable a la cuadrícula que obtiene el enfoque y haga que el cuadro desplegable sea visible, lo que alcanza la función de mostrar El cuadro desplegable en la columna especificada de la tabla. El evento OnDrawCell para configurar la tabla es el siguiente:
if (gdfocused in state) entonces
Comenzar
// Si los campos correspondientes son consistentes, ejecute
if (grid.cells [acol, 0] = 'empresa') entonces
Comenzar
// mover el cuadro desplegable a la posición especificada
Combobox1.left: = rect.left + grid.left;
ComboBOx1.top: = rect.top + grid.top;
ComboBox1.width: = rect.right-rect.left;
Combobox1.Height: = rect.bottom-rect.top;
// Haga que el cuadro desplegable sea visible y gane el enfoque
Combobox1.visible: = true;
Combobox1.setfocus;
fin;
fin;
3. Configuración del evento OnClick
Si el campo correspondiente a la celda que obtiene el enfoque no coincide con el campo correspondiente al cuadro desplegable, el cuadro desplegable no es visible. Para hacer esto, establezca el evento OnClick de la tabla de la siguiente manera:
If (grid.cells [grid.col, 0] <> 'empresa') entonces
Comenzar
ComboBox1.Visible: = false;
fin;
4. Configuración del evento Onchange
En el evento OnDrawCell, solo se completa el trabajo de dibujar celdas y mostrar cuadros desplegables, y los datos no se pueden ingresar en la tabla. Para hacer esto, establezca el evento Onchange del cuadro desplegable de la siguiente manera:
Grid.Cells [Grid.Col, Grid.Row]: = ComboBox1.
Elementos [comboBox1.itemindex];
Esto completa el trabajo de insertar el cuadro desplegable en la tabla.
Mostrar campos gráficos en la mesa
En el desarrollo del programa, a veces se necesitan algunos caracteres no convencionales en los informes. Por ejemplo, el campo del ítem de inspección en el informe de inspección de la pieza contiene caracteres no convencionales, como la rugosidad del mecanizado y la tolerancia al mecanizado. La idea general para resolver este problema es almacenar estos caracteres no convencionales como campos gráficos, como el campo de imagen en una base de datos de SQL Server. Sin embargo, ya sea el control StringGrid o el control DBGrid, solo puede mostrar directamente las cadenas, lo que crea el problema de cómo mostrar los campos gráficos en el control de la tabla.
A primera vista, este problema se puede resolver insertando el control DBImage en la tabla utilizando el método anterior. Sin embargo, esto requiere insertar un control con el mismo número que el registro. , pero obviamente parpadeando en el campo de gráficos. Una mejor solución es crear dinámicamente un control DBIMage cuando se conecta a la base de datos, usarlo para leer el campo de imagen de la base de datos y guardarlo en el disco duro del cliente como un archivo temporal. Lea el archivo temporal en el evento OnDrawCell de la tabla y completa el trabajo de dibujo. Estos son los pasos específicos para mostrar los campos gráficos en la tabla.
1. Guardar campo de imagen
Lea todos los campos de imagen al ejecutar una consulta y guarde en el disco duro del cliente.
Comenzar
... // omitir la declaración de consulta
FileName: = 'D: EMP';
Mydbimage: = tdbimage.create (self); // Crear dbimage
Mydbimage.parent: = self;
Mydbimage.dataSource: = dataSource1;
MyDBImage .datafield: = 'descripción'; // Especificar como el campo "Descripción"
Índice: = 1;
mientras que no clientData.eof haz comienza // lee la base de datos
s: = intToStr (índice);
Nombre de archivo1: = nombre de archivo+s;
FileName1: = FileName1+'. BMP';
// Guardar archivos temporales
MyDBImage .picture .BitMap .Savetofile (FileName1);
Grid.cells [1, índice]: = '';
// Complete el formulario
Grid.Cells [2, índice]: = clientData.fieldByName ('datos medidos'). Astring;
ClientData.Next;
Índice: = índice+1;
fin;
Mydbimage.destroy ();
fin;
2. Copiar los gráficos
Establezca el evento OnDrawCell, lea el archivo temporal y copie los gráficos en la columna especificada de la tabla:
if ((acol = 1) y (arow> 0) y (grid.colcount> 2)) luego comienza
// La tabla requiere al menos dos columnas
Nombre de archivo: = 'd: emp';
S: = intToStr (arow);
Nombre de archivo: = nombre de archivo+s;
FileName: = FileName+'. Bmp';
MyImage: = TIMAGE.Create (self); // Crear control de imagen
MyImage.Parent: = self;
// Leer archivos temporales
Myimage.picture.bitmap.loadFromFile (nombre de archivo);
// Copiar los gráficos
Grid.canvas.draw (rect.left, rect.top, myimage.
Image.graphic);
MyImage.destroy ();
fin;