2014-02-11 2 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

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

ответ

3

Некоторые полезные советы:

Я знаю, как легко использовать компоненты RAD стиль, , но стараются не связываться Логика GUI и логика приложения. Это сделает ваш код более чистым и удобным для чтения и обслуживания. Также используйте значащие имена для ваших переменных, это предотвратит глупые ошибки.

Теперь о вашей проблеме, Сетка использует индексы на основе 0, поэтому последний индекс меньше, чем счет. Фиксированная строка и столбец имеют индекс 0 в вашем случае, что означает, что нам нужно начинать итерацию со следующего индекса, который равен 1, я использовал свойства FixedRows и FixedCols, чтобы сделать его более читаемым. У этого есть дополнительный бонус, который будет обозначать самые внутренние фиксированные строки/Cols, если у вас есть несколько фиксированных строк/столбцов. Легче сделать две отдельные петли, одну для строки заголовка и одну для столбцов:

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; 
Смежные вопросы