Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Странное поведение OnDrawCell


Автор: maximjhon 16.8.2011, 16:42
Здравствуйте.
Мне нужно, чтобы в StrigGrid выделились другим цветом ячейки, в которых значение больше 0. Не получается. Ниже код.

Код

procedure TForm4.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
 with Sender as TStringGrid, Canvas do
          begin
  If( ACol>0) and (Arow>0) then
    begin
  If StrToInt(StringGrid1.Cells[ACol,ARow])>0 then
  Brush.Color:=clRed;;

   end;
end;
  end;
 

Автор: northener 16.8.2011, 19:27
А где FillRect?

Вот кстати для примера http://www.delphikingdom.com/asp/viewitem.asp?catalogid=168

Автор: Snowy 16.8.2011, 19:30
Просто поменять цвет кисти - мало. Нужно еще самому рисовать ячейку.
Есть же готовые примеры в том же DRKB.

Автор: maximjhon 17.8.2011, 16:36
Изменил код. В результате, ячейки таблицы раскрашиваются и виден текст в них, но текст почему то мигает. Привожу
фрагмент кода:
Код

procedure TForm4.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
 If( ACol>0) and (Arow>0) then 
  begin
 with Sender as TStringGrid, Canvas do
          begin
   If StrToInt(StringGrid1.Cells[ACol,ARow])>0 then
Begin
  Brush.Color:=clRed;;
Font.Color:=clBlack;
FillRect(Rect);
StringGrid1.Cells[ACol,ARow]:=StringGrid1.Cells[ACol,ARow];
   end
else
FillRect(Rect);
StringGrid1.Cells[ACol,ARow]:=StringGrid1.Cells[ACol,ARow];
end;
end;
  end;


Автор: northener 17.8.2011, 16:49
Цитата(maximjhon @  17.8.2011,  16:36 Найти цитируемый пост)
но текст почему то мигает

Странно, что не зацикливается.
Нужно не только закрашивать ячейку руками, но и выводить текст тоже руками. TCanvas.TextOut.

Автор: Keeper89 17.8.2011, 19:06
А судя по всему и зацикливается, раз мигает

Автор: northener 18.8.2011, 00:42
Цитата(Keeper89 @  17.8.2011,  19:06 Найти цитируемый пост)
А судя по всему и зацикливается, раз мигает 

Вообще-то такой код должен приводить, по меньшей мере, к "замораживанию" (Freeze  по аглицки), когда мышь и клавиатура вроде и реагируют на действия пользователя, но с опозданием (порой очень большим).
Тогда почему автор этого не заметил?

P.S.

Цитата(maximjhon @  17.8.2011,  16:36 Найти цитируемый пост)
Изменил код.

Объясняю два предыдущие поста. 
Ну нельзя в обработчике OnDrawCell задавать значение ячейке этого грида!
Ведь это задание вызывает заново обработчик OnDrawCell.

Автор: bagos 18.8.2011, 11:36
Код

var
  S: string;
begin
  S := StringGrid1.Cells[ACol, ARow];
...
    with StringGrid1 do
     if (ACol = 2) and (ARow >= 1) then
        begin
          Canvas.Brush.Color := clblack;
          Canvas.Font.Color := clRed;
          Canvas.Font.Size := 8;
          Canvas.Font.Style := [fsBold];
          Canvas.FillRect(Rect);
          Canvas.TextOut(rect.left + 3, rect.top + 3, S);
        end;

Автор: maximjhon 20.8.2011, 07:15
Все получилось Спасибо большое!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)