2011-01-18 11 views
2

私はStringGridのテキストを中央に取得しようとしています。いくつかの研究の後、DefaultDraw:Falseで使用すると他の誰かがこの関数を投稿しました。OnDrawCell Center 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です。

これは、セルの中央に表示されるテキストを実行した後に必要です。声明

if ACol = 1 then begin 

は、その行は、それが唯一の列のコードを実行することを意味している場合も同様の問題のコードのこの部分での重要な課題の一つで苦しむ人々のためにUPDATE

です1例StringGridは0ベースのため、2番目の列です。 if文を安全に削除すると、デフォルトの描画を無効にすることなく実行され、動作します。

+0

私はちょうどあなたのコードを試してみた中で動作し、それが正常に動作します。 (Delphi 5 and 10 @ Win7) – SimaWB

+0

コードの問題は、プロシージャがStringGrid2用だが、コードではStringGrid1としてリストされているということでした。私はデルファイオートコンプリートを嫌っている別の理由。私はドリンDuminicaの方法はとにかく効率的だと思う。 – 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