Отрисовка ячеек в TStrungGrid

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
bestonix
новенький
Сообщения: 66
Зарегистрирован: 15.04.2010 08:26:00
Откуда: Жигулёвск

Отрисовка ячеек в TStrungGrid

Сообщение bestonix »

Доброго здоровья уважаемые.

Есть такой вот код. Он отлично работает в Delphi, C++Builder. А вот в Lazarus получается нечто...
Вобщем вот. Сначала просто присваиваю значения ячейкам.
FMain.sgCostTest.Cells[0, 0] := '№ вопроса';
FMain.sgCostTest.Cells[1, 0] := 'Количество ответов';
FMain.sgCostTest.Cells[2, 0] := '№№ ответов';
FMain.sgCostTest.Cells[3, 0] := 'Количество баллов';
FMain.sgCostTest.Cells[4, 0] := 'Тема вопроса';
Затем в стандартном событии DrawCell пишу такой код. По задумке должно отрисовываться так, заголовки в центре с переносом слов.
procedure TFMain.sgCostTestDrawCell(Sender: TObject; aCol, aRow: Integer;
aRect: TRect; aState: TGridDrawState);
var
s : string;
Flag : cardinal;
H : integer;
begin
if (ARow and ACol > 0) then
case (ARow mod 2) of
0 : begin sgCostTest.Canvas.Font.Color := clBlack;
sgCostTest.Canvas.FillRect(aRect);
sgCostTest.Canvas.Brush.Color := TColor($CCFFCC);
end;
else begin
sgCostTest.Canvas.Font.Color := clBlack;
sgCostTest.Canvas.FillRect(aRect);
sgCostTest.Canvas.Brush.Color := TColor($CCCCFF);
end;
end;

sgCostTest.Canvas.FillRect(aRect);
s := UTF8ToAnsi(sgCostTest.Cells[aCol, aRow]);
//StrPCopy(s, sgCostTest.Cells[aCol, aRow]);
Flag := DT_CENTER;
if (aRow>0) then begin
case (aCol) of
4 : begin Flag := DT_LEFT; end;
else
Flag := DT_CENTER;
end;
end else Flag := DT_CENTER;

Flag := Flag or DT_WORDBREAK;
Inc(aRect.Left, 3);// := aRect.Left + 3;
Dec(aRect.Right, 3);// := aRect.Right - 3;
H := DrawText(sgCostTest.Canvas.Handle, PChar(s), Length(s), aRect, Flag);
if (H > sgCostTest.RowHeights[aRow]) then
sgCostTest.RowHeights[aRow] := H; //увеличиваем высоту }
end;

Результат во "прицепе". Что не так ?

Добавлено спустя 1 час 3 минуты 23 секунды:
Еще вопрос в этой же теме. Касается этой же странички, но немного по другому поводу.
Нужно на StriungGrid'е при выборе последней колонки чтобы по размерам колонки в соответствующей строке показывался ComboBox.
Пишу такой код, но Lazarus...
1. Кричит что нет такой функции как ClientToParent
2. Функция ClientToScreen ясно дело отрисовывает его по своему разумению относительно экранных координат.

procedure TFMain.sgCostTestClick(Sender: TObject);
var CellRect : TRect;
pt : TPoint;
begin
if sgCostTest.Col=4 then begin
CellRect := sgCostTest.CellRect(sgCostTest.Col, sgCostTest.Row);
pt := sgCostTest.ClientToScreen( Point(CellRect.Left, CellRect.Top) );
//pt := sgCostTest.ClientToParent(Point(CellRect.Left, CellRect.Top));
CB_Theme.Left := pt.X;
CB_Theme.Top := pt.Y-12;
CB_Theme.Width := CellRect.Right - CellRect.Left;
CB_Theme.Visible := true;
CB_Theme.BringToFront;
end;
end;

Подозреваю, что нужно подключить соответствующий модуль. Но не нашел где он находится
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

Дмитрий, ИМХО такая петрушка: у тебя два раза прорисовка идет. Компонент написан так, что тебе только кажется, что ты перекрываешь стандартную отрисовку. На самом деле она все равно отрабатывает. И получается, что твой текст накладывается сверху (или снизу - не суть важно).

Я бы копал в сторону:
1. Перед перерисовкой перезалить канву как-то. Типа перед своей затереть стандартную отрисовку (по опыту общения с Лазарусом - скорее всего не поможет).
2. Заглянул с исходник компонента - создал подобный со свой отрисовкой.

С последним ты запросто справишься. ;)
bestonix
новенький
Сообщения: 66
Зарегистрирован: 15.04.2010 08:26:00
Откуда: Жигулёвск

Сообщение bestonix »

dunin писал(а):Дмитрий, ИМХО такая петрушка: у тебя два раза прорисовка идет. Компонент написан так, что тебе только кажется, что ты перекрываешь стандартную отрисовку. На самом деле она все равно отрабатывает. И получается, что твой текст накладывается сверху (или снизу - не суть важно).


Ничего не кажется. В Delphi, C++Builder работает жеж как надо. И полагаю в Лазаре тоже должно работать как ожидаю

dunin писал(а):Я бы копал в сторону:
1. Перед перерисовкой перезалить канву как-то. Типа перед своей затереть стандартную отрисовку (по опыту общения с Лазарусом - скорее всего не поможет).


Первое что пришло в голову. Но тогда прорисовка ничем хорошим не заканчивается. Пусто-пусто получается.

dunin писал(а):2. Заглянул с исходник компонента - создал подобный со свой отрисовкой.

Это конечно выход, для меня. Будем посмотреть, хотя изобретать велосипед тоже не айс. :(
Putnick
новенький
Сообщения: 62
Зарегистрирован: 18.03.2009 12:02:56

Сообщение Putnick »

Уважаемый bestonix!
Простите, что вмешиваюсь, но не может ли быть так, что Вы забыли переключить свойство StringGrid.DefaultDrawing в False.
Сам несколько раз на такое нарывался, Лазарус почему-то отрабатывает OnDrawCell даже если стоит DefaultDrawing:=True, хотя должен бы использовать только стандартную отрисовку. В результате — сначала отрисовывается "как положено", а потом — "как надо".

Надеюсь, смог помочь. С уважением, Алексей.
Аватара пользователя
Максим
энтузиаст
Сообщения: 599
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Сообщение Максим »

bestonix
новенький
Сообщения: 66
Зарегистрирован: 15.04.2010 08:26:00
Откуда: Жигулёвск

Сообщение bestonix »

Putnick писал(а):Уважаемый bestonix!
Простите, что вмешиваюсь, но не может ли быть так, что Вы забыли переключить свойство StringGrid.DefaultDrawing в False.
Сам несколько раз на такое нарывался, Лазарус почему-то отрабатывает OnDrawCell даже если стоит DefaultDrawing:=True, хотя должен бы использовать только стандартную отрисовку. В результате — сначала отрисовывается "как положено", а потом — "как надо".

Надеюсь, смог помочь. С уважением, Алексей.


Уважаемый Putnick, благодарю за вмешательство.
Действительно изменение св-ва на false решает эту задачу.
Но к сожалению на половину, цвет заголовков меняется на цвет ячеек ( в моём случае на радикально белый).

Добавлено спустя 1 минуту 34 секунды:
Максим писал(а):Тынц.


Уважаемый Максим, благодарю за ссылку. Добавил в закладки.
GrayEddy
постоялец
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Сообщение GrayEddy »

Пример кода, DefaultDrawing := True

Код: Выделить всё

procedure TfmMain.grdEventsDrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
var
  TextStyle: TTextStyle;
begin
  if gdFixed in aState then begin
    if aRow > 0 then begin
      TextStyle := Canvas.TextStyle;
      TextStyle.Alignment := taCenter;
      TextStyle.Layout := tlCenter;
      TStringGrid(Sender).Canvas.TextStyle := TextStyle;
      TStringGrid(Sender).Canvas.TextRect(aRect, aRect.Left, aRect.Top, IntToStr(aRow));
      Exit; // <-------
    end;
  end;
  TStringGrid(Sender).DefaultDrawCell(aCol, aRow, aRect, aState);
end;


Добавлено спустя 10 минут 56 секунд:
Кстати, примеры отрисовки гридов можно найти тут: $Lazarus\Examples\GridExamples\*.*
bestonix
новенький
Сообщения: 66
Зарегистрирован: 15.04.2010 08:26:00
Откуда: Жигулёвск

Сообщение bestonix »

GrayEddy писал(а):Кстати, примеры отрисовки гридов можно найти тут: $Lazarus\Examples\GridExamples\*.*


Спасибо, сейчас разберусь что и как
Ответить