Delphi fornece o poderoso componente DBGrid para facilitar o design de aplicativos de banco de dados. Mas se usarmos apenas o componente DBGrid, cada foco (Grid) é apenas uma simples caixa de edição de texto, o que é inconveniente para os usuários inserirem dados. Delphi também fornece alguns outros componentes de dados para facilitar a entrada do usuário, como DBComboBox, DBCheckBox e outros componentes, mas esses componentes não são tão poderosos quanto o DBGrid. O Delphi, como o Visual FoxPRo, pode permitir que a grade de foco no DBGrid seja outros componentes de dados visuais para a conveniência dos usuários? Na verdade, podemos conseguir isso inserindo outros componentes visuais no DBGrid.
O mecanismo interno do Delphi para processar DBGrid é fazer flutuar um componente na grade - o componente DBEdit. A grade onde você insere os dados é na verdade um componente DBEdit flutuante, e as outras áreas que não recebem foco são apenas imagens. Portanto, inserir outros componentes visuais no DBGrid é como flutuar um componente visual na grade. Portanto qualquer componente, desde um simples DbCheckBox até uma caixa de diálogo complexa, pode ser inserido no DBGrid. A seguir está uma etapa de como inserir o componente DBComboBox no DBGrid. Você pode inserir outros componentes da mesma maneira.
1. Crie um novo projeto em Delphi 4.0.
2. Arraste os quatro componentes DataSource e Table na placa do componente Data Access e DBGrid e DBComboBox na placa do componente Data Controls para Form1 respectivamente.
3. Defina as propriedades de cada componente da seguinte forma:
planta de configuração de atributo de objeto rcf1
Legenda do Form1 'Exemplo de inserção do componente SpinEdit no DBGrid'
DataSource1 DataSet Tabela1
Tabela1 Nome do banco de dados DBDEMOS
Nome da tabela 'professor.DBF'
Ativo Verdadeiro
Fonte de dados DBGrid1 Fonte de dados1
DBComboBox1 DataField SEXO
Fonte de dados Fonte de dados1
Visível Falso
Itens de cordas. 'Masculino' |
Observação: usei aqui Teacher.dbf, que reflete o gênero do corpo docente e da equipe, que só pode ser “masculino” ou “feminino”.
4. O evento DrawDataCell serve para desenhar células. Quando o campo correspondente à grade em foco for consistente com o campo correspondente à caixa de combinação, mova a caixa de combinação para a grade em foco e
Torne a caixa de combinação visível para atingir a função de exibir o DBComboBox na coluna especificada do DBGrid. Defina o evento OnDrawDataCell de DBGrid1 da seguinte forma:
procedimento TForm1.DBGrid1DrawDataCell(Remetente: TObject; const Rect: TRect; Campo: TField; Estado: TGridDrawState);
começar
if (gdFocused no estado) então
começar
se (Field.FieldName = DBComboBox1.DataField ) então
começar
DBComboBox1.Left := Rect.Left + DBGrid1.Left;
DBComboBox1.Top := Rect.Top + DBGrid1.top;
DBComboBox1.Width := Rect.Right - Rect.Left;
DBComboBox1.Height := Rect.Bottom - Rect.Top;
DBComboBox1.Visible := Verdadeiro;
fim;
fim;
fim;
5. O DBComboBox não é exibido quando a célula especificada em DBGrid não recebe o foco Defina o evento OnColExit de DBGrid1 da seguinte forma:
procedimento TForm1.DBGrid1ColExit(Remetente: TObject);
começar
Se DBGrid1.SelectedField.FieldName = DBComboBox1.DataField então
começar
DBComboBox1.Visible := falso;
fim;
fim;
6. Quando a coluna especificada do DBGrid obtém o foco, o evento DrawDataCell apenas desenha a célula e exibe o DBComboBox, mas o DBComboBox não obtém o foco e a entrada de dados ainda é realizada na célula. Chame a função SendMessage API do Windows no evento KeyPress de DBGrid1 para transferir a entrada de dados para o DBComboBox, obtendo assim a entrada de dados no DBComboBox. Portanto, defina também o evento KeyPress da seguinte maneira:
procedimento TForm1.DBGrid1KeyPress(Remetente: TObject; var Chave: Char);
começar
se (chave < > chr(9)) então
começar
se (DBGrid1.SelectedField.FieldName =DBComboBox1.DataField) então
começar
DBComboBox1.SetFocus;
SendMessage(DBComboBox1.Handle, WM_Char, Word(Key), 0);
fim;
fim;
fim;
O programa passou na depuração no Windows 98 chinês e Delphi 4.015. Espero que este artigo permita que você desenvolva aplicativos de banco de dados de maneira mais conveniente e rápida.