OnDrawCell Center Text StringGrid - Delphi - PullRequest
       7

OnDrawCell Center Text StringGrid - Delphi

2 голосов
/ 18 января 2011

Я пытаюсь получить текст в моей StringGrid по центру. После некоторого исследования я придумал эту функцию, опубликованную кем-то здесь, что при использовании в DefaultDraw: False должно работать.

procedure TForm1.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
var
  S: string;
  SavedAlign: word;
begin
  if ACol = 1 then begin  // ACol is zero based
   S := StringGrid1.Cells[ACol, ARow]; // cell contents
    SavedAlign := SetTextAlign(StringGrid1.Canvas.Handle, TA_CENTER);
    StringGrid1.Canvas.TextRect(Rect,
      Rect.Left + (Rect.Right - Rect.Left) div 2, Rect.Top + 2, S);
    SetTextAlign(StringGrid1.Canvas.Handle, SavedAlign);
  end;
end;

Однако, если я установлю DefaultDraw: False, StringGrid просто будет выглядеть глитчей.

Строки в функции, которые заполняют StringGrid текстом:

Sg.RowCount := Length(arrpos);
for I := 0 to (Length(arrpos) - 1) do
 begin
   sg.Cells[0,i] := arrpos[i];
   sg.Cells[1,i] := arrby[i];
 end;

arrpos и arrby являются массивами строк. sg это StringGrid.

Мне нужно после того, как после выполнения текста появиться в центре ячейки.

UPDATE

Для тех, кто страдает от подобных проблем, одна из ключевых проблем с этим фрагментом кода - это выражение if

if ACol = 1 then begin

Эта строка означает, что она будет запускать код только для столбца 1, например второй столбец, поскольку StringGrid равен 0. Вы можете безопасно удалить оператор if, и он будет выполняться и работать БЕЗ необходимости отключать рисование по умолчанию.

1 Ответ

6 голосов
/ 18 января 2011

это работает в моем тесте

procedure TForm1.sgDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
  State: TGridDrawState);
var
  LStrCell: string;
  LRect: TRect;
begin
  LStrCell := sg.Cells[ACol, ARow]; // grab cell text
  sg.Canvas.FillRect(Rect); // clear the cell
  LRect := Rect; 
  LRect.Top := LRect.Top + 3; // adjust top to center vertical
  // draw text
  DrawText(sg.Canvas.Handle, PChar(LStrCell), Length(LStrCell), LRect, DT_CENTER);
end;
...