TcxCanvas, ее отличие от TCanvas

Рейтинг: 0Ответов: 1Опубликовано: 20.03.2015

Всем привет.

Позволю написать сегодня еще один занимательный вопросик. Делаю перерисовку tcxGrid. На стандартном гриде я делал замену булевых полей таким образом:

procedure TFormClient.DrawGridCheckBox(Canvas: TCanvas; Rect: TRect; Checked: boolean);
var
  DrawFlags: Integer;
begin
  Canvas.TextRect(Rect, Rect.Left + 1, Rect.Top + 1, ' ');
  DrawFrameControl(Canvas.Handle, Rect, DFC_BUTTON, DFCS_BUTTONPUSH or DFCS_ADJUSTRECT);
  DrawFlags := DFCS_BUTTONCHECK or DFCS_ADJUSTRECT;// DFCS_BUTTONCHECK
  if Checked then
    DrawFlags := DrawFlags or DFCS_CHECKED;
  DrawFrameControl(Canvas.Handle, Rect, DFC_BUTTON, DrawFlags);
end;

С учетом того, что TcxCanvas имеет другую природу в отличие от TCanvas, я переписываю таким образом:

procedure TFormClient.DrawGridCheckBox(Canvas: TcxCanvas; Rect: TRect; Checked: boolean);
var
 DrawFlags: Integer;
 StrCanvas : TCanvas;
 MyRect: TRect;
begin

  StrCanvas.TextRect(Rect, Rect.Left + 1, Rect.Top + 1, ' ');
  Canvas.CopyRect(MyRect, StrCanvas, Rect); 
  DrawFrameControl(Canvas.Handle, MyRect, DFC_BUTTON, DFCS_BUTTONPUSH or DFCS_ADJUSTRECT);
  DrawFlags := DFCS_BUTTONCHECK or DFCS_ADJUSTRECT;// DFCS_BUTTONCHECK
  if Checked then
    DrawFlags := DrawFlags or DFCS_CHECKED;
  DrawFrameControl(Canvas.Handle, MyRect, DFC_BUTTON, DrawFlags);
end;

Однако это не работает, вываливает ошибку памяти. По ассемблеру бегать и искать проблему не хочется. Суть такая, что не могу найти в tcxcanvas что-то подобного TextRect, так как именно с помощью его я перерисовывал некрасивые булевые цифры 1 и 0 и делал вполне пристойную птичку, если значение true в гриде. Документации нету такой подробной, просмотреть модули я тоже почему-то не могу, соответственно теряюсь в догадках, что зашито в эту TextExtend(). Хотелось бы найти что-то подобное TextRect. Кто может дать дельный совет? Есть тут мастера по этим вопросам)?

P.S. Напомню всем, кто забыл, TRect имеет такую структуру:

  PRect = ^TRect;
  TRect = record
    case Integer of
      0: (Left, Top, Right, Bottom: Longint);
      1: (TopLeft, BottomRight: TPoint);
  end;

Ответы

▲ 1Принят

Вы объявили StrCanvas как TCanvas, а кто за вас объект создавать будет? В первой строке метода вы обращаетесь к StrCanvas.TextRect. Ничего, что StrCanvas в этом месте = nil?

procedure TFormClient.DrawGridCheckBox(Canvas: TcxCanvas; Rect: TRect; Checked: boolean);
var
 StrCanvas : TCanvas;
begin
  StrCanvas.TextRect(Rect, Rect.Left + 1, Rect.Top + 1, ' ');

Хотите использовать готовый канвас, возьмите канвас формы:

Canvas.TextRect(Rect, Rect.Left + 1, Rect.Top + 1, ' ');

Только учтите, что размер текста будет считаться для того шрифта, который установлен на форме.