Тени под StringGrid

У меня есть форма. На formshow я инициализирую значения поля в ячейках stringgrid, но он показывает тень под текстами ячеек. Я использовал персидские символы для значений полей.
Я сделал то же самое с английскими значениями, но все работает нормально.
Буду признателен за любые предложения.

пример вывода:

введите здесь описание изображения


person Holy Thirteen    schedule 21.07.2013    source источник
comment
Похоже, вы реализовали DrawCell и не заполнили Rect перед использованием TextOut.   -  person bummi    schedule 21.07.2013
comment
s := (Отправитель как TStringGrid).Cells[ACol, ARow]; если Length(s) › 0, тогда начните рисовать прямо := Rect; DrawText((Отправитель как TStringGrid).Canvas.handle, Pchar(s), Length(s), drawrect, DT_CALCRECT или DT_WORDBREAK или DT_LEFT); if (drawrect.bottom - drawrect.Top) › (Отправитель как TStringGrid).RowHeights[ARow] then (Отправитель как TStringGrid).RowHeights[ARow] := (drawrect.bottom - drawrect.Top) else begin drawrect.Right := Прямой.Правый; (Отправитель как TStringGrid).Canvas.FillRect(drawrect); DrawText((Отправитель как TStringGrid).Canvas.handle, Pchar(s), Length(s), drawrect, DT_WORDBREAK или DT_LEFT); конец;   -  person Holy Thirteen    schedule 21.07.2013
comment
Я не вижу необходимости в различной обработке в зависимости от длины s, однако, если вы добавите (Sender as TStringGrid) .Canvas.FillRect(Rect); в качестве первой процедуры, у вас должна была быть проблема, поскольку с включенным DefaultDrawing' следующий уже будет нарисован в сетке.   -  person bummi    schedule 21.07.2013
comment
Я использовал первое решение, и оно работало правильно. Спасибо за ваше решение.   -  person Holy Thirteen    schedule 21.07.2013


Ответы (1)


При включенном DefaultDrawing текст уже будет отображаться, если вы введете OnDrawCell.

Поскольку вы вычисляете необходимую высоту строки в рисовании, используя DT_CALCRECT из DrawText, вам нужно будет вычислить Rect, который должен быть заполнен/очищен с помощью FillRect.
Вы можете использовать UnionRect, чтобы получить окончательный Rect, который должен быть заполнен (FillRect в пример).

procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.Cells[1,1] := 'Hallo'#13'World';
  StringGrid1.Cells[2,2] := 'اهای' +13# + 'جهان';
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  S:String;
  drawrect,Fillrect : TRect;
begin
  s := (Sender as TStringGrid).Cells[ACol, ARow];
  drawrect := Rect;
  DrawText((Sender as TStringGrid).Canvas.handle, Pchar(s), Length(s),
      drawrect, DT_CALCRECT or DT_WORDBREAK or DT_LEFT);
  if (drawrect.bottom - drawrect.Top) > (Sender as TStringGrid)
      .RowHeights[ARow] then (Sender as TStringGrid)
      .RowHeights[ARow] := (drawrect.bottom - drawrect.Top);
  UnionRect(FillRect,Rect,DrawRect);
  (Sender as TStringGrid).Canvas.FillRect(FillRect);
  DrawText((Sender as TStringGrid).Canvas.handle, Pchar(s), Length(s),
        drawrect, DT_WORDBREAK or DT_LEFT);
end;
person bummi    schedule 21.07.2013