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

['이 방법은] (http://pastebin.com/uxhC7qiT). – TLama

답변

3

일부 좋은 조언 :

나는 그것이 RAD 스타일의 구성 요소, 를 사용하지만 바인딩하지 않도록 노력하는 것이 얼마나 쉬운 지 알고 GUI 로직 및 어플리케이션 로직. 이렇게하면 코드를보다 명확하고 쉽게 읽고 유지 관리 할 수 ​​있습니다. 또한 변수에 의미있는 이름을 사용하면 어리석은 실수를 방지 할 수 있습니다.

문제에 대해 그리드는 0 기반 인덱스를 사용하므로 마지막 인덱스는 개수보다 적습니다. 고정 행과 열 모두에 인덱스 0이 있습니다. 즉, 다음 색인 인 1에서 반복을 시작해야 함을 의미합니다.이 색인은 읽을 수 있도록 FixedRowsFixedCols 속성을 사용했습니다. 고정 행/열이 둘 이상인 경우 가장 안쪽 고정 행/열 레이블을 지정하는 추가 보너스가 있습니다. 헤더 행과 열의 두 개의 루프를 만드는 것이 더 쉽습니다.

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;