Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

end;

function TMyDBGrid.CellRect(ACol, ARow: Longint): TRect;

begin

 Result := inherited CellRect(ACol, ARow);

end;

Вы можете сделать приведение типа вашего DBGrid к TMyDBGrid (это возможно, поскольку CellRect статический метод) и вызвать CellRect:

Rectangle := TMyDBGrid(SomeDBGrid).CellRect(SomeColumn, SomeRow);

procedure TfmLoadIn.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn;State: TGridDrawState);

const Disp = 2; //Правильно
выравниваем компонент

begin

 inherited;

 if (gdFocused in State) 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

Delphi 1

Установите defaultDrawing в false, и создайте собственный onDrawDataCell, в котором и задавайте нужный вам цвет ячеек. Примерно так:

procedure Tform1.DBgrid1DrawDataCell(Sender: TObject; const Rect: 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;

procedure TMainForm.CharGridDrawCell(Sender: TObject; Col, Row: Longint; Rect: TRect; State: TGridDrawState);

var TheText: string;

begin

 TheText := CharGrid.Cells[Col, Row];

 with CharGrid.Canvas do begin

{
Определяем цвет фона в зависимости от состояния ячейки: }

if gdFocused in State then Brush.Color := clYellow {Цвет ячейки с фокусом}

else if gdSelected in State then Brush.Color := clOlive {Цвет выбранной ячейки}

else {ячейка не имеет фокуса и не выбрана}

if IntFromStr(TheText) <> 0 then Brush.Color := clNavy {Цвет фона подсвеченной ячейки}

else Brush.Color := clWhite; {Цвет фона нормальной ячейки}

{ Определяем цвет текста: }

if IntFromStr(TheText) <> 0 then Font.Color := clRed {Цвет текста подсвеченной ячейки}

else Font.Color := clNavy; {Цвет текста нормальной ячейки}

TextRect(Rect, Rect.Left + 2, Rect.Top + 2, TheText);

 end; {with CharGrid.Canvas}

end;
 

Показ Memo-поля в Dbgrid

Delphi 1 

…я все же лелею надежду, что когда-нибудь увижу 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, значит вы перешли в новую строку (или только что открыли таблицу).

Поделиться с друзьями: