2014-02-11 75 views
2

我遇到了一些我寫的代碼問題。我正在使用TStringGrid繪製座位計劃。TStringGrid標籤外欄

它應該做的是用列下的字母和行的數字來標記fixedcol和fixedrow。

我的問題是我不知道如何更改我的代碼,以便它排除單元[0,0]。它也沒有標記所有的行。

procedure TfrmDraw.FormCreate(Sender: TObject); 
var 
    i, j, k: Integer; 
begin 
    sgFloor.RowCount := adotSeats['Rows'] + 1; 
    sgFloor.ColCount := adotSeats['Seats_per_Row'] + 1; 

    for i := 0 to SgFloor.RowCount do 
    begin 
    for j := 0 to SgFloor.ColCount do 
    begin 
     if i = 0 then 
     SgFloor.Cells[i,j] := Chr(65 + j) 
     else 
     if j = 0 then 
     begin 
     for k := 1 to sgFloor.ColCount do 
      SgFloor.Cells[i,0] := IntToStr(i) ; 
     end; 
    end; 
    end; 
end; 

截圖:

enter image description here

感謝

+0

['這way'](http://pastebin.com/uxhC7qiT)。 – TLama

回答

3

一些好的建議:

我知道它是多麼容易使用RAD風格組件, 但儘量不要綁定GUI邏輯和應用程序邏輯。 這將使您的代碼更清晰,更易於閱讀和維護。 也爲你的變量使用有意義的名字,這樣做會防止愚蠢的錯誤。

現在關於你的問題, 網格使用基於0的索引,所以最後一個索引是少一個數。 在你的情況下,固定的行和列都有索引0,這意味着我們必須從下一個索引開始迭代,即1,我使用FixedRowsFixedCols屬性來提高可讀性。這有額外的好處,它會標記最內在的固定行/列,如果你有多個固定行/列。這是比較容易使2個獨立的迴路,一個用於標題行和一個用於列:

procedure SetupGrid(Grid : TStringGrid; Rows, Columns : Integer); 

var 
Row, Col: Integer; 

begin 
Grid.FixedCols := 1; 
Grid.FixedRows := 1; 
Grid.RowCount := Rows + Grid.FixedRows; 
Grid.ColCount := Columns + Grid.FixedCols; 

for Row := Grid.FixedRows to Grid.RowCount-1 do 
    Grid.Cells[0, Row] := Chr(Ord('A') + Row-1); 

for Col := Grid.FixedCols to Grid.ColCount-1 do 
    Grid.Cells[Col, 0] := IntToStr(Col); 
end; 

procedure TfrmDraw.FormCreate(Sender: TObject); 
begin 
// try to make your GUI events as lightweight as possible and seal 
// your code into separate functions/classes, this will improve readability 
// of the GUI units and it will make your code testable 
SetupGrid(sgFloor, adotSeats['Rows'], adotSeats['Seats_per_Row']); 
end;