我使用这个事件(DrawOnColumnCell)在DBGrid中放置一个datetimepicker,在一个名为“fechaprobablealta”的字段中放置一个更精确的datetimepicker。这个网格有一个客户端数据源,该数据源有一个providerDataSet,它从一个SQLDataSet中获取数据。我可以很好地绘制一个datetimepicker,直到我尝试更新客户端数据集。这里有一个错误,来自“地址上的访问冲突”,我无法解决。我在这里放置代码:
procedure TfmForm.gdGridDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
if ckCasosAlta.Checked then
begin
dtFechaProbableAlta.Visible:=False;
if cDataSet.FieldByName('fechaalta').Value <> null then
begin
gdGrid.Canvas.Brush.Color:=clLime;
gdGrid.DefaultDrawColumnCell
(Rect, DataCol, Column, State);
end;
end
else
begin
if (gdSelected in State) then
begin
if (Column.Field.FieldName = 'fechaprobablealta') then
begin
with dtFechaProbableAlta do
begin
Left:= Rect.Left + gdGrid.Left+1;
Top:= Rect.Top + gdGrid.Top+1;
Width:= Rect.Right - Rect.Left+ 2;
Height:= Rect.Bottom - Rect.Top +2;
Date:= Column.Field.AsDateTime;
Visible:=True;
end;
end;
end;
end;
end;
勾选复选框时:
按下复选框时的方法如下:
procedure TfmForm.ckCasosAltaClick(Sender: TObject);
begin
if ckCasosAlta.Checked then
begin
chkCasosProbableAlta.Checked:=False;
cDataSet.Close; //ClientDataSet
qDataSet.CommandText:= //SQLDataSet
//SQL QUERY
;
end
else
begin
cDataSet.Close; //ClientDataSet
qDataSet.CommandText:= //SQLDataSet
//SQL QUERY
;
end;
cDataSet.Open;
cDataSet.Refresh;
end;
这在开始和按下复选框“ckCasosAlta”(客户端数据集关闭,更改查询,再次打开并刷新)时都很好,其中隐藏了datetimepicker并将名为“fechaalta”的单元格涂为绿色。当回来按下复选框(选中:= false)时,问题出现了。客户端数据集执行相同的过程,并保持与开始时一样(相同的SQL查询)。这里有一个问题。我有一个“地址访问冲突.."。
因此,我需要了解事件DrawColumnCell如何从dbgrid工作,以便能够调试此问题或了解本例中的问题
1条答案
按热度按时间wb1gzix01#
错误可能出现在以下位置:
在数据集关闭的情况下,列将为nil,并且它可能产生访问冲突。