Delphi 7中的DrawColumnCell事件是如何工作的?

koaltpgm  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(204)

我使用这个事件(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工作,以便能够调试此问题或了解本例中的问题

wb1gzix0

wb1gzix01#

错误可能出现在以下位置:

Date:= Column.Field.AsDateTime;

在数据集关闭的情况下,列将为nil,并且它可能产生访问冲突。

相关问题