2017-01-24 12 views
0

私が作成しようとしているプログラムは、Delphi TStringGridコンポーネントを使用しています。基本的に、私はそれはので、私は4つのボタンを使用して、グリッドを通じて価値Pを移動することができ作るしようとしています:ダウン、そしてアップ。TStringGridのセルを使用した値の移動

Pの値を上下左右に移動できます。しかし何らかの理由で、私はそれを正しく動かそうとすると、ただ1つの要素の代わりに0という行全体を埋めます。なぜ私は理解できません。

procedure TForm2.Button4Click(Sender: TObject);//pressing the "right" button 
var 
    i, j: Integer; 
begin 
    for i := 0 to Form2.StringGrid1.ColCount do 
    for j := 0 to Form2.StringGrid1.RowCount do 
     if StringGrid1.Cells[i, j] = 'P' then 
     begin 
     StringGrid1.Cells[i, j] := '0'; 
     StringGrid1.Cells[i+1, j] := 'P'; 
     { I have done the same for up, left and down (down would be j+1, left would be i-1, etc} 
     break; 
     end; 
end; 

これは、プログラムがどのように見えるかです:

image

Pが(7,7)

に位置していますこれは私がを押したときに何が起こるかです:

image

Pは(3,6)にあり、右を押すと行全体が0に変更されました。

+0

ループは、それぞれ 'ColCount - 1'と 'RowCount - 1'になるはずです。 –

+0

さて、あなたはグリッドを反復しているので、 '0,0'の' P'を '1,0'に移動すると、' i'が '1'になったら再び移動します。 –

+0

'i = ColCount - 1'のときは、次の列に 'P'をつけないでください。 –

答えて

4

Tom Brunbergがコメントで示唆したように、Pの現在の位置を把握してループを完全に削除すると、管理がはるかに効率的で簡単になります。例:

private 
    PColumn: Integer; 
    PRow: Integer; 

procedure TForm2.FormCreate(Sender: TObject); 
begin 
    // populate the grid as needed... 
    // place 'P' somewhere on the grid and keep track of it... 
    PColumn := ...; 
    PRow := ...; 
end; 

// pressing the "up" button 
procedure TForm2.Button1Click(Sender: TObject); 
begin 
    if PRow > 0 then 
    begin 
    Dec(PRow); 
    StringGrid1.Cells[PColumn, PRow+1] := '0'; 
    StringGrid1.Cells[PColumn, PRow ] := 'P'; 
    end; 
end; 

// pressing the "left" button 
procedure TForm2.Button2Click(Sender: TObject); 
begin 
    if PColumn > 0 then 
    begin 
    Dec(PColumn); 
    StringGrid1.Cells[PColumn+1, PRow] := '0'; 
    StringGrid1.Cells[PColumn, PRow] := 'P'; 
    end; 
end; 

// pressing the "down" button 
procedure TForm2.Button3Click(Sender: TObject); 
begin 
    if PRow < (StringGrid1.RowCount-1) then 
    begin 
    Inc(PRow); 
    StringGrid1.Cells[PColumn, PRow-1] := '0'; 
    StringGrid1.Cells[PColumn, PRow ] := 'P'; 
    end; 
end; 

// pressing the "right" button 
procedure TForm2.Button4Click(Sender: TObject); 
begin 
    if PColumn < (StringGrid1.ColCount-1) then 
    begin 
    Inc(PColumn); 
    StringGrid1.Cells[PColumn-1, PRow] := '0'; 
    StringGrid1.Cells[PColumn, PRow] := 'P'; 
    end; 
end; 
+0

これは魅力的に機能しました。お手伝いありがとう :) –

関連する問題