2011-01-18 5 views
2

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

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 просто появляется glitchey.

Линии функции, которые заполняют 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 ACol = 1 then begin 

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

+0

Я только попробовал ваш код и он работает отлично. (Delphi 5 и 10 @ Win7) – SimaWB

+0

Проблема с кодом заключалась в том, что процедура для StringGrid2, однако, в коде, указанном как StringGrid1. Еще одна причина, по которой я ненавижу delphi auto-complete. Однако я ДУМАЮ, что метод Дорина Думицы более эффективен. – jskrwyk

ответ

6

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

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; 
+0

Это сработало отлично. благодаря – jskrwyk

Смежные вопросы