Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Isto significa que precisamos pelo menos desenhar duas imagens: uma para o estado marcado (valor True) e outra para o estado desmarcado (valor False). O modo mais fcil de realizar isto, usar a funo DrawFrameControl da Windows API, para desenhar diretamente na tela do DBGrid. A seguir, o cdigo no manipulador de evento OnDrawColumnCell do DBGrid, que acontece quando o grid precisa pintar uma clula. procedure TForm1.DBGrid1DrawColumnCell( Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); const IsChecked : array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED); var DrawState: Integer; DrawRect: TRect; begin if (gdFocused in State) then begin if (Column.Field.FieldName = DBCheckBox1.DataField) then begin DBCheckBox1.Left := Rect.Left + DBGrid1.Left + 2; DBCheckBox1.Top := Rect.Top + DBGrid1.top + 2; DBCheckBox1.Width := Rect.Right - Rect.Left; DBCheckBox1.Height := Rect.Bottom - Rect.Top; DBCheckBox1.Visible := True; end end else begin if (Column.Field.FieldName = DBCheckBox1.DataField) then begin DrawRect:=Rect; InflateRect(DrawRect,-1,-1); DrawState := ISChecked[Column.Field.AsBoolean]; DBGrid1.Canvas.FillRect(Rect); DrawFrameControl(DBGrid1.Canvas.Handle, DrawRect, DFC_BUTTON, DrawState); end; end; end; Para finalizar este passo, precisamos garantir que o DBCheckBox1 esteja invisvel quando sairmos da clula: procedure TForm1.DBGrid1ColExit(Sender: TObject); begin if DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField then DBCheckBox1.Visible := False end; Precisamos apenas controlar mais dois eventos. Note que no modo de edio, todas as teclas pressionadas vo para a clula do DBGrid, temos que garantir que sero redirecionadas para o CheckBox. No caso de um CheckBox, estamos principalmente interessados nas teclas [Tab] e [Space]. A tecla [Tab] deveria mover o foco de entrada para a prxima clula e a tecla [Space] deveria alternar o estado do CheckBox. procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char); begin if (key = Chr(9)) then Exit; if (DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField) then begin DBCheckBox1.SetFocus; SendMessage(DBCheckBox1.Handle, WM_Char, word(Key), 0); end; end; E finalmente, o ltimo toque. Seria conveniente que o Caption do checkbox mudasse de acordo com a marcao ou desmarcao do usurio. Note que o DBCheckBox tem duas propriedades (ValueChecked e ValueUnChecked), usadas para especificar o valor do campo representado pelo check box quando for marcado/desmarcado. Minhas propriedades ValueChecked e ValueUnChecked contm 'Yes a Winner!' e 'Not this time', respectivamente. procedure TForm1.DBCheckBox1Click(Sender: TObject);