1.
unit OneCheckDBGrid;interfaceuses
Windows, Messages, SysUtils, Classes, Controls, Grids, DB, DBGrids,Dialogs;
type
TCheckedNotifyEvent = procedure (Sender: TObject;Column:TColumn) of object;
TOneCheckDBGrid = class(TDBGrid)
private
FDisplayCheckColumnNo:Integer;
FIsSet:Boolean;
FSetChecked:TCheckedNotifyEvent;
FOriginalOptions:TDBGridOptions;
FMyFieldNo:Integer;
procedure SetDisplayCheckColumnNo(const Value: Integer);
// procedure InternalSetDisplayCleckColumnNo(const Value:Integer);
procedure DoSetChecked(Sender:TObject;Column:TColumn);
{ Private declarations }
protected
{ Protected declarations }
procedure ColEnter;override;
procedure ColExit;override;
procedure CellClick(Column: TColumn); override; procedure DrawColumnCell(const Rect: TRect; DataCol: Integer;
Column: TColumn; State: TGridDrawState); override;
public
{ Public declarations }
published
{ Published declarations }
property DisplayCheckColumnNo:Integer read FDisplayCheckColumnNo write SetDisplayCheckColumnNo;
property OnCheckedChange:TCheckedNotifyEvent read FSetChecked write FSetChecked;
end;procedure Register;implementationprocedure Register;
begin
RegisterComponents('Samples', [TOneCheckDBGrid]);
end;{ TOneCheckDBGrid }procedure TOneCheckDBGrid.CellClick(Column: TColumn);
begin
inherited;
if FIsSet and(Column.Index = FDisplayCheckColumnNo)then
DoSetChecked(Self,Column);
end;procedure TOneCheckDBGrid.ColEnter;
begin
if FIsSet and (SelectedField.FieldNo = FMyFieldNo)then
begin
FOriginalOptions := Options;
Options := Options - [dgEditing];
end;
inherited;
end;procedure TOneCheckDBGrid.ColExit;
begin
if FIsSet and (SelectedField.FieldNo = FMyFieldNo)then
Options := FOriginalOptions;
inherited;
end;procedure TOneCheckDBGrid.DoSetChecked(Sender: TObject;Column:TColumn);
begin
if Assigned(DataSource.DataSet) then
begin
FOriginalOptions := Options;
Options := Options - [dgEditing];
with DataSource.DataSet do
begin
Edit;
if CanModify then
Column.Field.AsBoolean := not Column.Field.AsBoolean;
Post;
end;
Options := FOriginalOptions;
if Assigned(FSetChecked) then
FSetChecked(Sender,Column);
end;
end;procedure TOneCheckDBGrid.DrawColumnCell(const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
CtrlState:array[Boolean] of Integer = (DFCS_BUTTONCHECK,DFCS_BUTTONCHECK or DFCS_CHECKED);
var
b:Boolean;
begin
inherited;
if FIsSet and (Column.Index = FDisplayCheckColumnNo) then
begin Canvas.FillRect(Rect);
b := Column.Field.AsBoolean;
DrawFrameControl(Canvas.Handle,Rect,DFC_BUTTON,CtrlState[b]);{Column.Field.AsBoolean]);}
end;
end;
procedure TOneCheckDBGrid.SetDisplayCheckColumnNo(const Value: Integer);
begin
if not (csDesigning in ComponentState) then
begin
FIsSet := (Value >= 0)and(Value < Columns.Count)and(Columns[Value].Field.DataType = ftBoolean);
if FIsSet then
begin
FDisplayCheckColumnNo := Value;
FMyFieldNo := Columns[Value].Field.FieldNo;
end;
end;
end;end.
我根据别人的东东改的,你看看也许就知道了
unit OneCheckDBGrid;interfaceuses
Windows, Messages, SysUtils, Classes, Controls, Grids, DB, DBGrids,Dialogs;
type
TCheckedNotifyEvent = procedure (Sender: TObject;Column:TColumn) of object;
TOneCheckDBGrid = class(TDBGrid)
private
FDisplayCheckColumnNo:Integer;
FIsSet:Boolean;
FSetChecked:TCheckedNotifyEvent;
FOriginalOptions:TDBGridOptions;
FMyFieldNo:Integer;
procedure SetDisplayCheckColumnNo(const Value: Integer);
// procedure InternalSetDisplayCleckColumnNo(const Value:Integer);
procedure DoSetChecked(Sender:TObject;Column:TColumn);
{ Private declarations }
protected
{ Protected declarations }
procedure ColEnter;override;
procedure ColExit;override;
procedure CellClick(Column: TColumn); override; procedure DrawColumnCell(const Rect: TRect; DataCol: Integer;
Column: TColumn; State: TGridDrawState); override;
public
{ Public declarations }
published
{ Published declarations }
property DisplayCheckColumnNo:Integer read FDisplayCheckColumnNo write SetDisplayCheckColumnNo;
property OnCheckedChange:TCheckedNotifyEvent read FSetChecked write FSetChecked;
end;procedure Register;implementationprocedure Register;
begin
RegisterComponents('Samples', [TOneCheckDBGrid]);
end;{ TOneCheckDBGrid }procedure TOneCheckDBGrid.CellClick(Column: TColumn);
begin
inherited;
if FIsSet and(Column.Index = FDisplayCheckColumnNo)then
DoSetChecked(Self,Column);
end;procedure TOneCheckDBGrid.ColEnter;
begin
if FIsSet and (SelectedField.FieldNo = FMyFieldNo)then
begin
FOriginalOptions := Options;
Options := Options - [dgEditing];
end;
inherited;
end;procedure TOneCheckDBGrid.ColExit;
begin
if FIsSet and (SelectedField.FieldNo = FMyFieldNo)then
Options := FOriginalOptions;
inherited;
end;procedure TOneCheckDBGrid.DoSetChecked(Sender: TObject;Column:TColumn);
begin
if Assigned(DataSource.DataSet) then
begin
FOriginalOptions := Options;
Options := Options - [dgEditing];
with DataSource.DataSet do
begin
Edit;
if CanModify then
Column.Field.AsBoolean := not Column.Field.AsBoolean;
Post;
end;
Options := FOriginalOptions;
if Assigned(FSetChecked) then
FSetChecked(Sender,Column);
end;
end;procedure TOneCheckDBGrid.DrawColumnCell(const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
CtrlState:array[Boolean] of Integer = (DFCS_BUTTONCHECK,DFCS_BUTTONCHECK or DFCS_CHECKED);
var
b:Boolean;
begin
inherited;
if FIsSet and (Column.Index = FDisplayCheckColumnNo) then
begin Canvas.FillRect(Rect);
b := Column.Field.AsBoolean;
DrawFrameControl(Canvas.Handle,Rect,DFC_BUTTON,CtrlState[b]);{Column.Field.AsBoolean]);}
end;
end;
procedure TOneCheckDBGrid.SetDisplayCheckColumnNo(const Value: Integer);
begin
if not (csDesigning in ComponentState) then
begin
FIsSet := (Value >= 0)and(Value < Columns.Count)and(Columns[Value].Field.DataType = ftBoolean);
if FIsSet then
begin
FDisplayCheckColumnNo := Value;
FMyFieldNo := Columns[Value].Field.FieldNo;
end;
end;
end;end.
我根据别人的东东改的,你看看也许就知道了
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货