Добавление к TDBGrid события OnClick
TGroothuisGrid = class() {!}
published
propertyOnClick;
end;
Это все! OnClick уже объявлен в TControl как защищенное свойство. Все, что вы должны сделать, это опубликовать это свойство в компоненте-наследнике, зарегистрировать его (смотри гл. 8 Руководства по созданию компонентов, Component Writer's Guide) и использовать взамен TDBGrid.
В TCustomGrid определен метод CellRect, который, к сожалению, защищен. Это означает, что даный метод доступен только для TCustomGrid и его наследников. Но все-таки существует немного мудреное решение вызова данного метода:
typeTMyDBGrid = class(TDBGrid)
public
functionCellRect(ACol, ARow: Longint): TRect;
end;
functionTMyDBGrid.CellRect(ACol, ARow: Longint): TRect;
begin
Result := inheritedCellRect(ACol, ARow);
end;
Вы можете сделать приведение типа вашего DBGrid к TMyDBGrid (это возможно, поскольку CellRect статический метод) и вызвать CellRect:
Rectangle := TMyDBGrid(SomeDBGrid).CellRect(SomeColumn, SomeRow);
procedureTfmLoadIn.DBGrid1DrawColumnCell(Sender: TObject; constRect: TRect; DataCol: Integer; Column: TColumn;State: TGridDrawState);
constDisp = 2; //Правильно выравниваем компонент
begin
inherited;
if(gdFocused inState) then begin
if(Column.FieldName = 'TYPEDescription') then begin
dlTYPEDescription.Left := Rect.Left + DBGrid1.Left + Disp;
dlTYPEDescription.Top := Rect.Top + DBGrid1.top + Disp;
dlTYPEDescription.Width := Rect.Right – Rect.Left;
dlTYPEDescription.Height := Rect.Bottom – Rect.Top;
dlTYPEDescription.Visible := True;
end;
end;
end;
Dbgrid с цветными ячейками VI
Установите defaultDrawing в false, и создайте собственный onDrawDataCell, в котором и задавайте нужный вам цвет ячеек. Примерно так:
procedureTform1.DBgrid1DrawDataCell(Sender: TObject; constRect: TRect; Field: TField; State: TGridDrawState);
begin
{ выберите цвет для текста (font.color) и фона (brush.color) }
if(field = table1Status) then begin
{ белый на красном }
DBgrid1.canvas.font.color := clWhite;
DBgrid1.canvas.brush.color := clRed;
end else begin
{ черное на белом }
DBgrid1.canvas.brush.color := clWhite;
DBgrid1.canvas.font.color := clBlack;
end;
{ рисуем ячейку }
DBgrid1.canvas.textrect(rect, rect.left+2, rect.top+2, field.asString);
end;
procedureTMainForm.CharGridDrawCell(Sender: TObject; Col, Row: Longint; Rect: TRect; State: TGridDrawState);
varTheText: string;
begin
TheText := CharGrid.Cells[Col, Row];
withCharGrid.Canvas do begin
{ Определяем цвет фона в зависимости от состояния ячейки: }
ifgdFocused inState thenBrush.Color := clYellow {Цвет ячейки с фокусом}
else ifgdSelected inState thenBrush.Color := clOlive {Цвет выбранной ячейки}
else{ячейка не имеет фокуса и не выбрана}
ifIntFromStr(TheText) <> 0 thenBrush.Color := clNavy {Цвет фона подсвеченной ячейки}
elseBrush.Color := clWhite; {Цвет фона нормальной ячейки}
{ Определяем цвет текста: }
ifIntFromStr(TheText) <> 0 thenFont.Color := clRed {Цвет текста подсвеченной ячейки}
elseFont.Color := clNavy; {Цвет текста нормальной ячейки}
TextRect(Rect, Rect.Left + 2, Rect.Top + 2, TheText);
end; {with CharGrid.Canvas}
end;
…я все же лелею надежду, что когда-нибудь увижу TMemoField.DataSize, имеющим значение, отличное от нуля. Может быть значение DataSize является размером части Memo, которая сохранилась в .db-файле? Вместо этого я теперь пользуюсь объектом TBlobStream, который вполне хорошо справляется с этой работой. Все это у меня происходит примерно так:
Var
pBuffer: PChar;
Blob: TBlobStream;
begin
{FDataField – это TMemoField}
Blob := TBlobStream.Create(FDataField, bmRead);
try
if Blob.Size > 0 then try
GetMem(pBuffer, Blob.Size);
Blob.Read(pBuffer^, Blob.Size);
{ что-то тут делаем }
FreeMem(pBuffer, Blob.Size);
except
ShowMessage('Нехватка памяти' );
end;
finally
Blob.Free
end;
Как определить изменение фокуса строки в TDBGrid?
Используйте событие OnDataChange объекта Datasource, соединенного с DBGrid. Если параметр State в обработчике событие равен dsBrowse, значит вы перешли в новую строку (или только что открыли таблицу).
Читать дальше