Я вижу (из цепочки комментариев), что вы хотите вызвать либо общий, либо (в некоторых случаях) также вызвать код для рисования флажка.
общий обработчик OnDrawColumnCell обрабатывает цвет фона для ячейки. Как я могу расширить это, чтобы создать обработчик, который также будет рисовать флажки, когда они необходимы? Между прочим, общий код должен вызываться перед кодом флажка, а не после.
Это на самом деле довольно просто. Определите оба метода с правильной подписью (общий и флажок) (код не проверен!). Однако подключайте общее событие только к событиям TDBGrid.OnDrawColumnCell
— при необходимости флажок будет привязан:
// Generic (from my other post) - notice method name has changed
procedure TDataModule1.GenericDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
RowColors: array[Boolean] of TColor = (clSilver, clDkGray);
var
OddRow: Boolean;
Grid: TDBGrid;
begin
if (Sender is TDBGrid) then
begin
Grid := TDBGrid(Sender);
OddRow := Odd(Grid.DataSource.DataSet.RecNo);
Grid.Canvas.Brush.Color := RowColors[OddRow];
Grid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
// If you want the check box code to only run for a single grid,
// you can add that check here using something like
//
// if (Column.Index = 3) and (Sender = DBGrid1) then
//
if (Column.Index = 3) then //
CheckBoxDrawColumCell(Sender, Rect, DataCol, Column, State)
end;
end;
// Checkbox (from yours) - again, notice method name change.
procedure TEditDocket.CheckBoxDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
DrawRect: TRect;
Grid: TDBGrid;
begin
// Don't use DBGrid1, because it makes the code specific to a single grid.
// If you need it for that, make sure this code only gets called for that
// grid instead in the generic handler; you can then use it for another
// grid later (or a different one) without breaking any code
if column.Index = 3 then
begin
Grid := TDBGrid(Sender);
DrawRect:= Rect;
Drawrect.Left := Rect.Left + 24;
InflateRect (DrawRect, -1, -1);
Grid.Canvas.FillRect (Rect);
DrawFrameControl (Grid.Canvas.Handle, DrawRect, DFC_BUTTON,
ISChecked[Column.Field.AsInteger]); // Don't know what ISChecked is
end;
// The below should no longer be needed, because DefaultDrawColumnCell has
// been called by the generic handler already.
//
// else
// Grid.DefaultDrawColumnCell (Rect, DataCol, Column, State);
end;
Увидев этот комментарий, который вы написали Сертаку:
в одной сетке это может быть столбец 3, тогда как это может быть столбец 4, который нужно нарисовать как флажок.
Я предложил один из способов решить эту проблему в своем коде выше (см. комментарий в GenericDrawColumnCell
). Альтернативой (при условии, что у вас есть только один столбец в каждой сетке, которому нужен флажок) является указание столбца, содержащего флажок, в свойстве TDBGrid.Tag
:
if (Column.Index = Grid.Tag) then
person
Ken White
schedule
28.02.2014
TDrawColumnCellEvent
. - person Ken White   schedule 28.02.2014if
, могу ли я впоследствии вызвать более общий обработчик OnDrawColumnCell?? Или вы спрашиваете, независимо от того, выполняется ли операторif
или нет, могу ли я также вызвать более общий обработчик OnDrawColumCell ?? - person Ken White   schedule 28.02.2014