2

私のc#winformプロジェクトに問題があります。

私のプロジェクトでは、ボタンが同じ領域にある場合、ボタンの位置を古い位置に切り替える機能があります。

private void myText_MouseUp(object sender、MouseEventArgs e){

Point q = new Point(0, 0);
        Point q2 = new Point(0, 0);
        bool flag = false;
        int r = 0;
        foreach (Control p in this.Controls)
        {
            for (int i = 0; i < counter; i++)
            {
                if (flag)
                {
                    if (p.Location.X == locationx[i] && p.Location.Y == locationy[i])
                    {
                        oldx = e.X;
                        oldy = e.Y;
                        flag = true;
                        r = i;
                    }
                }
            }
        }
        foreach (Control p in this.Controls)
        {
            for (int j = 0; j < counter; j++)
            {
                if ((locationx[j] == p.Location.X) && (locationy[j] == p.Location.Y))
                {
                    Point arrr = new Point(oldx, oldy);
                    buttons[j].Location = arrr;
                    buttons[r].Location = new Point(locationx[j], locationy[j]);
                }
            }
        }
}
   The problem with this code is that if they are in the same area, the buttons do not switch their locations.  Instead they goes to the last button location.

誰かが私を助けることができればそれは私をたくさん助けます:)

4

1 に答える 1

2

ifステートメントは常に true と評価されます。これは、最後のjループがこれを行うことを意味します。

// last time round the i loop, i == counter-1
// and q == new Point(locationx[counter-1], locationy[counter-1])
for (int j = 0; j < counter; j++)
{
    Point q2 = new Point(locationx[j], locationy[j]);
    buttons[i].Location = q2;
    buttons[j].Location = q;
}

これの最終的な結果は、すべてのボタンLocationが に設定されてqいることです。

new Point(locationx[counter-1], locationy[counter-1])

ifステートメントが常に評価されるのはなぜですかtrue。まず、ステートメントのいくつかのor句を見てみましょう。if

|| ((q.Y >= q2.Y) && (q.X <= q2.X))
|| ((q.Y >= q2.Y) && (q.X == q2.X))

これは、

|| ((q.Y >= q2.Y) && (q.X <= q2.X))

テストを含む行==は、条件の最終結果にまったく影響を与えません。実際、 を含むすべての行==は同様に扱うことができます。これは次のとおりです。

|| ((q.Y >= q2.Y) && (q.X <= q2.X))
|| ((q.Y >= q2.Y) && (q.X >= q2.X))
|| ((q.Y <= q2.Y) && (q.X >= q2.X))
|| ((q.Y <= q2.Y) && (q.X <= q2.X))

凝縮できます

|| ((q.Y >= q2.Y) && (q.X <= q2.X))
|| ((q.Y >= q2.Y) && (q.X >= q2.X))

の中へ

|| ((q.Y >= q2.Y)

同様に

|| ((q.Y <= q2.Y) && (q.X >= q2.X))
|| ((q.Y <= q2.Y) && (q.X <= q2.X))

と同じです

|| ((q.Y <= q2.Y)

混ぜる

|| ((q.Y >= q2.Y)
|| ((q.Y <= q2.Y)

if条件が常に に評価されることがわかりますtrue

于 2012-05-19T09:46:12.840 に答える