Quando as pessoas usam o Delphi para desenvolver aplicativos de banco de dados, geralmente usam controles de tabela para fazer relatórios. O uso flexível do evento OnDrawCell do controle da tabela pode concluir a exibição de alguns efeitos especiais, que podem atender melhor às necessidades do usuário. Este artigo apresenta três dicas para usar flexivelmente eventos OnDrawCell.
Atualize dinamicamente a cor das linhas de tabela
Às vezes, é necessário atualizar a cor das linhas de tabela dinamicamente no relatório. Por exemplo, na lista de fornecedores, os fornecedores que são suprimentos preferidos são exibidos em verde, enquanto outros fornecedores são exibidos em vermelho. No momento, você pode usar o código a seguir para implementá -lo no evento OnDrawcell:
Se Tabela1.FieldbyName ('Custno'). Asinteger> 1500 então
Dbgrid1.canvas.font.color: = clred;
DbGrid1.DefaultDrawColumnCell (Rect, Datacol,
Coluna, estado)
O código acima pode ser expandido de acordo com as necessidades do aplicativo. Por exemplo, quando você precisar exibi -lo em negrito, basta alterar a linha correspondente para:
DbGrid1.canvas.font.style: = [fsbold];
Insira outros controles visuais na tabela
Na programação do banco de dados, as restrições de chaves estrangeiras são um método eficaz para garantir que os dados no banco de dados sejam armazenados de acordo com os requisitos do usuário. Por exemplo, em um ambiente de processamento de pedidos, há uma restrição de chave estrangeira entre a tabela de pedidos e a tabela de clientes, ou seja, cada registro na tabela de pedidos deve ter um item correspondente na tabela do cliente. Dessa forma, ao preencher o formulário de pedido, se a lista de clientes for fornecida para o usuário escolher no foco da entrada, a correção dos dados será efetivamente garantida.
Tanto o controle DBGrid quanto o controle StringGrid são derivados do tcustomgrid, onde o controle DBGrid pode inserir dados. O mecanismo interno da Delphi para o processamento DBGrid é flutuar um controle dbedit na grade. A grade que pode obter dados de foco e entrada é realmente um controle DBEDit flutuante. para que os dados sejam inseridos na tabela. Portanto, a maneira de inserir outros controles visuais em uma tabela é flutuar o controle visual na grade. Portanto, em princípio, qualquer controle pode ser inserido em uma tabela. Este artigo leva o exemplo de inserir uma caixa suspensa em uma tabela para introduzir as etapas específicas para inserir outros controles na grade.
1. Defina propriedades
Leia a propriedade Itens da lista de clientes na caixa suspensa.
2. Configuração do evento OnDrawcell
O evento OnDrawcell é disparado ao desenhar a célula da tabela. Quando o campo correspondente à célula que obtém o foco é consistente com o campo correspondente à caixa suspensa, mova a caixa suspensa para a grade que obtém foco e torne a caixa suspensa visível, alcançando assim a função de exibir A caixa suspensa na coluna especificada da tabela. O evento OnDrawcell para definir a tabela é o seguinte:
se (focado no estado) então
Começar
// Se os campos correspondentes forem consistentes, execute
if (grid.Cells [acol, 0] = 'Company') então
Começar
// mova a caixa suspensa para a posição especificada
ComboBox1.Left: = ret.left + grade.left;
ComboBox1.top: = ret.top + grade.top;
ComboBox1.Width: = Rect.right-relect.left;
ComboBox1.Height: = Rect.Bottom-Crect.top;
// Torne a caixa suspensa visível e ganhe foco
ComboBox1.Visible: = true;
ComboBox1.setFocus;
fim;
fim;
3. Configurando o evento OnClick
Se o campo correspondente à célula que obtém o foco não corresponde ao campo correspondente à caixa suspensa, a caixa suspensa não será visível. Para fazer isso, defina o evento OnClick da tabela da seguinte forma:
If (grid.cells [grid.col, 0] <> 'Company') então
Começar
ComboBox1.Visible: = false;
fim;
4. Configurando o Evento OnChange
No evento OnDrawCell, apenas o trabalho de desenhar células e exibir caixas suspensas é concluído e os dados não podem ser inseridos na tabela. Para fazer isso, defina o evento OnChange da caixa suspensa da seguinte forma:
Grid.Cells [grid.col, grid.row]: = ComboBox1.
Itens [ComboBox1.itemIndex];
Isso completa o trabalho de inserir a caixa suspensa na tabela.
Mostrar campos gráficos na tabela
No desenvolvimento do programa, às vezes alguns caracteres não convencionais são necessários para serem exibidos em relatórios. Por exemplo, o campo de itens de inspeção no relatório de inspeção de peça contém caracteres não convencionais, como a rugosidade da usinagem e a tolerância da usinagem. A idéia geral de resolver esse problema é armazenar esses caracteres não convencionais como campos gráficos, como o campo de imagem em um banco de dados do SQL Server. No entanto, se é o controle StringGrid ou o controle DBGRID, ele pode exibir apenas strings diretamente, o que cria o problema de como exibir campos gráficos no controle da tabela.
À primeira vista, esse problema pode ser resolvido inserindo o controle de dbimage na tabela usando o método acima. No entanto, isso requer a inserção de um controle com o mesmo número do registro. , mas também obviamente pisando no campo gráfico. Uma solução melhor é criar dinamicamente um controle de dbimage ao conectar ao banco de dados, usá -lo para ler o campo da imagem do banco de dados e salvá -lo no disco rígido do cliente como um arquivo temporário. Leia o arquivo temporário no evento OnDrawCell da tabela e conclui o trabalho de desenho. Aqui estão as etapas específicas para exibir os campos gráficos na tabela.
1. Salvar o campo da imagem
Leia todos os campos de imagem ao executar uma consulta e salve no disco rígido do cliente.
Começar
... // omitir a declaração de consulta
Nome do arquivo: = 'D: Emp';
Mydbimage: = tdbimage.create (self); // crie dbimage
Mydbimage.parent: = self;
Mydbimage.dataSource: = DataSource1;
Mydbimage .datafield: = 'description'; // especificar como o campo "Descrição"
Índice: = 1;
Embora não seja clientdata.eof comece // leia o banco de dados
s: = inttostr (índice);
FILENAME1: = nome do arquivo+s;
Nome do arquivo1: = nome do arquivo1+'. Bmp';
// Salve arquivos temporários
Mydbimage .ticture .bitmap .savetofile (nome do arquivo1);
Grid.cells [1, índice]: = '';
// preencha o formulário
Grid.cells [2, índice]: = clientdata.fieldbyname ('dados medidos'). Asstring;
ClientData.Next;
Índice: = índice+1;
fim;
Mydbimage.Destroy ();
fim;
2. Copie os gráficos
Defina o evento OnDrawCell, leia o arquivo temporário e copie os gráficos para a coluna especificada da tabela:
if ((acol = 1) e (arow> 0) e (grid.colcount> 2)) então comece
// A tabela requer pelo menos duas colunas
Nome do arquivo: = 'd: emp';
S: = inttostr (arow);
Nome do arquivo: = nome do arquivo+s;
Nome do arquivo: = nome do arquivo+'. Bmp';
MyImage: = Timage.create (self); // Crie controle de imagem
MyImage.parent: = self;
// Leia arquivos temporários
MyImage.picture.bitmap.loadfromfile (nome do arquivo);
// Copie os gráficos
Grid.Canvas.Draw (Rect.Left, Rect.top, Myimage.
Imagem.graphic);
MyImage.Destroy ();
fim;