5. WaferLine 공장 – 5.2 WaferLineForm 띄우기 [Wafer 코팅 시뮬레이션]

안녕하세요. 언제나휴일입니다.

1. 해야 할 일

이번 강의에서는 WaferLine을 추가하는 부분과 WaferLineForm을 띄우는 작업을 할 거예요.

주의할 점은 특정 WaferLine을 관리하는 WaferLineForm은 중복해서 뜨지 말아야 합니다.

그리고 WaferLineForm에 의해 WaferLine이 코팅 중인 상태에서 창을 닫는다고 하더라도 코팅 중인 상태는 유지해야 한다는 것입니다.

2. WaferLine 추가하기

먼저 btn_add의 Click 이벤트 핸들러를 추가하세요.

MainForm에 가장 최근에 생성한 라인 번호를 기억하는 멤버 필드를 추가합니다.

그리고 라인 번호를 Key, WaferLineForm을 값으로 하는 사전 개체를 생성합니다.

    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        int next_lineno = 1;
        Dictionary<int, WaferLineForm> wdic = new Dictionary<int, WaferLineForm>();
        private void btn_add_Click(object sender, EventArgs e)
        {
        ... 중략...

btn_add_Click 이벤트 핸들러를 작성합시다.

제일 먼저 라인 번호를 지역 변수에 대입하고 next_lineno를 1 증가합니다.

그리고 라인 번호로 WaferLine 개체를 생성합니다.

            int no = next_lineno;
            next_lineno++;
            WaferLine wl = new WaferLine(no);

생성한 WaferLine의 기본 정보는 lv_line에 보여주기 위해 ListViewItem을 추가합니다.

라인 번호와 코팅 전 Wafer 개수와 코팅 후 Wafer 개수를 컬럼 정보에 전달합니다. 현재 Wafer 개수는 둘 다 0입니다.

그리고 매핑하는 WaferLine을 Tag 속성에 설정한 후에 lv_line의 Items 컬렉션에 추가합니다.

            WaferLine wl = new WaferLine(no);
            string[] sitems = new string[] { no.ToString(), "0", "0" };
            ListViewItem lvi = new ListViewItem(sitems);
            lvi.Tag = wl;
            lv_line.Items.Add(lvi);

cb_line에도 WaferLine을 추가합니다.

lb_next_no의 Text 속성도 다시 설정합니다.

            cb_line.Items.Add(wl);
            lb_next_no.Text = next_lineno.ToString();

WaferLineForm 개체를 생성하여 사전 개체에 추가합니다.

생성한 WaferLineForm 개체의 Show메서드는 호출하지 않습니다. 이와 같이 하면 화면에 보이지는 않습니다.

            WaferLineForm wlf = new WaferLineForm(wl);
            wdic.Add(no, wlf);

현재까지 작성한 btn_add_Click 이벤트 핸들러 코드입니다.

        private void btn_add_Click(object sender, EventArgs e)
        {
            int no = next_lineno;
            next_lineno++;
            WaferLine wl = new WaferLine(no);
            string[] sitems = new string[] { no.ToString(), "0", "0" };
            ListViewItem lvi = new ListViewItem(sitems);
            lvi.Tag = wl;
            lv_line.Items.Add(lvi);
            cb_line.Items.Add(wl);
            wdic.Add(no, wlf);
        }

3. WaferLineForm 띄우기

btn_manage의 Click 이벤트 핸들러를 추가하세요.

        private void btn_manage_Click(object sender, EventArgs e)
        {

먼저 cb_line의 선택 항목이 없으면 핸들러를 종료합니다.

            if(cb_line.SelectedIndex == -1)
            {
                return;
            }

조건문에 해당하지 않는다면 계속 코드를 수행하겠죠.

선택 항목에 해당하는 WaferLine 개체를 참조합니다.

wdic(라인 번호를 Key,WaferLineForm을 Value로 하는 사전 개체)에서 대응하는 WaferLineForm이 시각화 상태인지 확인합니다.

만약 현재 시각화 상태가 아니라면 Show 메서드를 호출합니다.

            WaferLine wl = cb_line.SelectedItem as WaferLine;
            if(wdic[wl.No].Visible == false)
            {
                wdic[wl.No].Show();
            }

btn_manage_Click 이벤트 핸들러 코드는 다음과 같습니다.

        private void btn_manage_Click(object sender, EventArgs e)
        {
            if(cb_line.SelectedIndex == -1)
            {
                return;
            }
            WaferLine wl = cb_line.SelectedItem as WaferLine;
            if(wdic[wl.No].Visible == false)
            {
                wdic[wl.No].Show();
            }
        }

WaferLineForm에 생성자에 WaferLine을 입력 인자로 받게 수정하고 멤버 속성으로 WaferLine과 라인 번호를 캡슐화합니다.

using System;
using System.Windows.Forms;
using WaferLineLib;

namespace WaferLine_공장_시뮬레이션
{
    public partial class WaferLineForm : Form
    {
        public WaferLine WLine { get; }
        public int No { get { return WLine.No; } }
        public WaferLineForm(WaferLine wl)
        {
            InitializeComponent();
            WLine = wl;
        }
    }
}

이제 WaferLineForm의 Load와 FormClosing 이벤트 핸들러를 추가하세요.

        private void WaferLineForm_Load(object sender, EventArgs e)
        {

        }
        private void WaferLineForm_FormClosing(object sender, FormClosingEventArgs e)
        {
        } 

Load 이벤트 핸들러에서는 lb_no의 Text 속성을 라인 번호로 설정합니다.

그리고 wlc의 Line 속성을 WaferLine으로 설정합니다.

        private void WaferLineForm_Load(object sender, EventArgs e)
        {
            lb_no.Text = No.ToString();
            wlc.Line = WLine;
        }

FormClosing 이벤트 핸들러에서는 닫지 않고 안 보이게 합니다.

Hide 메서드를 호출하여 안 보이게 하며 e.Cancle을 true로 지정하여 창이 닫히지 않게 합니다.

        private void WaferLineForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.Hide();
            e.Cancel = true;
        }

현재까지 작성한 WaferLineForm의 소스 코드입니다.

using System;
using System.Windows.Forms;
using WaferLineLib;

namespace WaferLine_공장_시뮬레이션
{
    public partial class WaferLineForm : Form
    {
        public WaferLine WLine { get; }
        public int No { get { return WLine.No; } }
        public WaferLineForm(WaferLine wl)
        {
            InitializeComponent();
            WLine = wl;
        }
        private void WaferLineForm_Load(object sender, EventArgs e)
        {
            lb_no.Text = No.ToString();
            wlc.Line = WLine;
        }

        private void WaferLineForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.Hide();
            e.Cancel = true;
        }
    }
}