2

私が書いたコードに問題があります。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;

スクリーンショット:

ここに画像の説明を入力

ありがとう

4

1 に答える 1

3

良いアドバイス:

RAD スタイルのコンポーネントを使用するのがいかに簡単かは知っていますが、GUI ロジックとアプリケーション ロジックをバインドしないようにしてください。これにより、コードがよりクリーンになり、読みやすく、維持しやすくなります。また、変数には意味のある名前を使用してください。これにより、愚かな間違いを防ぐことができます。

あなたの問題について、グリッドは0ベースのインデックスを使用するため、最後のインデックスはカウントとして1つ少なくなります。あなたのケースでは、固定された行と列の両方にインデックス 0 があります。これは、次のインデックス (1) から反復処理を開始する必要があることを意味しFixedRowsますFixedCols。これには、複数の固定行/列がある場合、最も内側の固定行/列にラベルを付けるという追加のボーナスがあります。ヘッダー行用と列用の 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;
于 2014-02-11T10:34:18.840 に答える