0

私は ATM シミュレーターを作成していますが、現在、あるフォームに別のフォーム (ATM) を作成するためのボタンを配置しようとしています。私はこれを行うことができましたが、新しいフォームが表示されたときに「ATMを追加」ボタンがある他のフォームをクリックできないため、1つのフォームに対してのみです。私は試してみましたForm.Show.C #Form.ShowDialogを使用しています。Applications.Run()

コードは次のとおりです。

public class Program
    {
        private Account[] ac = new Account[3];
        private ATM atm;
        public Form1 form1;

         /* This function initilises the 3 accounts 
         * and instanciates the ATM class passing a referance to the account information

         */
        public Program()
        {

            ac[0] = new Account(300, 1111, 111111);
            ac[1] = new Account(750, 2222, 222222);
            ac[2] = new Account(3000, 3333, 333333);

            Thread form1thread = new Thread(new ThreadStart(startform)); //Creates ATM Form
            //Thread atm2 = new Thread(new ThreadStart(start));

            form1thread.Start();
            //atm2.Start();
        }


        static void Main(string[] args)
        {
            new Program();
        }

        public void startform()
        {
            form1 = new Form1(this);
            form1.ShowDialog();
        }

        public void newatm()
        {
            atm = new ATM(ac);
            atm.ShowDialog();
        }

        public void makethread()
        {
            Thread newatm = new Thread(new ThreadStart(startform));
            newatm.Start();
        }
    }

そしてform1で:

public partial class Form1 : Form
{
    Program program;

    public Form1(Program program)
    {
        InitializeComponent();
        this.program = program;
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.ShowDialog();
    }
    private void button1_Click(object sender, EventArgs e)
    {

        program.newatm();
    }
}
4

1 に答える 1

3

フォームをモーダルダイアログにしたくない場合Showは、メソッドの代わりにフォームのメソッドを使用してください。ShowDialog

また、バックグラウンドスレッドではなく、UIスレッドからフォームを作成して表示する必要があります。コードに基づいて、バックグラウンドスレッドを作成する必要はまったくなく、コンストラクターから直接フォームを作成/表示するだけです。

于 2013-03-18T20:04:06.837 に答える