многострочность в StringGrid через DrawCell.работает не так, как ожидалось. Delphi 10.3

#delphi

#delphi

Вопрос:

Я использую этот код, но он работает не так, как ожидалось:

 procedure TTableForm.GamesGridDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  Format: Word;
  C: array[0..255] of Char;
  A,B: Byte;
begin
 // Columns: Col_name,Col_rel,Col_desc are multistring ;
  if (ARow>0) and ((Acol = Col_name) or (Acol = Col_rel) or (Acol = Col_desc))  then begin

   Format:=DT_WORDBREAK;
   GamesGrid.Canvas.FillRect(Rect);
   StrPCopy(C,GamesGrid.Cells[ACol,ARow]);
   GamesGrid.Canvas.Font.Color:=clblue;

   DrawText((Sender as TStringGrid).Canvas.Handle,C,StrLen(C),Rect,Format);

  end;
 

код работает хорошо

Все работало нормально, но если я выбираю строку, она рисует по умолчанию, а также рисует заново (используя мой код)

рисует по умолчанию, а также рисует поверх

Но мне нужно всегда рисовать (всегда использовать DT_WORDBREAK) только с моим кодом в обоих (выбранном или нет)

Комментарии:

1. Вы установили TStringGrid.DefaultDrawing для свойства значение False?

2. Да, я пытался его использовать, а затем мне нужно вручную переписать все методы рисования (это слишком сложно) StringGrid. Я просто не могу понять, почему он использует рисование по умолчанию. Я попытался использовать состояние (выбрано). Мне нужно только, чтобы он использовал разрыв слов в некоторых столбцах в любом состоянии

3. Когда DefaultDrawing значение True, сетка рисует ячейку по-своему, даже если вы также рисуете на ней. Чтобы избежать этого, вы должны установить DefaultDrawing значение False . Но да, это означает, что вы должны взять на себя полную ответственность за рисование всей ячейки. Обойти это невозможно. Это не так сложно сделать, просто требуется на несколько строк кода больше, чем у вас уже есть. Вам просто нужно нарисовать фон ячейки, прежде чем рисовать текст. Установите Canvas.Brush.Color , а затем вызовите Canvas.FillRect()

4. Спасибо за ответ. Я постараюсь это сделать.