Ver Mensaje Individual
  #3  
Antiguo 25-04-2008
Avatar de Dedalo
Dedalo Dedalo is offline
Miembro
 
Registrado: abr 2008
Ubicación: Albacete (España)
Posts: 32
Reputación: 0
Dedalo Va por buen camino
Esto lo vi en Internet, no recuerdo donde, y funciona razonablemente bien.

Código Delphi [-]
 
 

unit MiUnidad;
 
interface
 
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ExtCtrls, DBCtrls, StdCtrls, Mask, Db, DBTables, ComCtrls, ToolWin,
 Grids, DBGrids, Menus, Buttons,Registry, ImgList, USelDatos, Limite;
 
Const
 CtrlState : array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED);
 
..... //Aqui va la definicion del form
 
implementation
 
//Asigna los siguientes eventos a todos los DBGrid que tengas en tu form con campos Boolean.
 
// El siguiente evento cambia el estado del boolean Cuando clicamos en el
procedure TForm.DBGCellClick(Column: TColumn);
begin
 if (Column.Field.DataType = ftBoolean) then
 begin
  Column.Field.DataSet.Edit;
  Column.Field.AsBoolean := not Column.Field.AsBoolean;
  Column.Field.Dataset.Post;
 end;
end;
 
// El siguiente evento cambia el estado si pulsamos espacio estando seleccionado un campo boolean
procedure TForm.DBGKeyPress(Sender: TObject; var Key: Char);
begin
 with TDBgrid(Sender) do
 begin
  if (Key = ' ') and (SelectedField.DataType = ftBoolean) then
  begin
   SelectedField.Dataset.Edit;
   SelectedField.AsBoolean := not SelectedField.AsBoolean;
   SelectedField.Dataset.Post;
  end;
 end;
end;
 
// El siguinete evento dibuja la casilla con o sin marca segun el estado del campo
procedure TForm.DBGDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
 with TDBgrid(Sender) do
 begin
  if Column.Field.DataType = ftBoolean then
  begin
   Canvas.FillRect(Rect);
   DrawFrameControl(Canvas.Handle, Rect, DFC_BUTTON, CtrlState[Column.Field.AsBoolean]);
  end;
 end;
end;
 
// Aqui evitamos que la celda se ponga en modo edit aruinando la estetica
procedure TForm.DBGColEnter(Sender: TObject);
begin
 if TDBgrid(Sender).SelectedField.DataType = ftBoolean then
  TDBgrid(Sender).Options := TDBgrid(Sender).Options - [dgEditing];
end;
 
// Aqui reponemos el estado inicial al abandonar la celda.
procedure TForm.DBGColExit(Sender: TObject);
begin
 if TDBgrid(Sender).SelectedField.DataType = ftBoolean then TDBgrid(Sender).Options := Opciones;
end;


end.

Última edición por Dedalo fecha: 25-04-2008 a las 23:08:28.
Responder Con Cita