728x90

C# 동영상 강좌를 듣기 위해 Visual Studio Community 2019 버전을 설치했다.

그런데 컴파일(CTRL + F5)을 해보면 "9664 프로세스가 0 코드로 인해 종료되었습니다."가 매번 나온다.


종료 상태가 0이면 프로그램이 정상 종료했다는 뜻이란다.


이 메시지를 없애는 방법을 찾아봤더니

문구를 없애는 방법으로 [도구] → [옵션] → [디버깅] → [일반] → [체크] 디버깅이 중지되면 자동으로 콘솔 닫기

를 해주면 된다고 나온다.





블로그 이미지

Link2Me

,
728x90

집에서 23인치 모니터를 2개 사용하는 환경에서 접속할 때에는 문제점을 모르고 있었는데 노트북과 모니터를 연결하는 환경에서 접속하니까 화면이 원하는 형태로 나오지 않았다.


int screenWidth = System.Windows.Forms.SystemInformation.VirtualScreen.Width;
int screenHeight = System.Windows.Forms.SystemInformation.VirtualScreen.Height;


이렇게 변경하니까 큰 화면과 작은 화면을 모두 제대로 인식하고 정상동작한다.


if (screenWidth <= 1680)
{
    dataGridView1.Columns["sub1"].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
    dataGridView1.Columns["sub2"].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
    dataGridView1.Columns["sub3"].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
}
else
{
    dataGridView1.Columns["sub1"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    dataGridView1.Columns["sub2"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    dataGridView1.Columns["sub3"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
}





블로그 이미지

Link2Me

,
728x90

C# Layout 에서 기존 자료를 복사하여 사용하다보니 아주 사소한 곳에서 에러가 발생한다.


Tabpage 를 추가하고 SplitContainer 로 화면을 분할한 후에

기존 Tabpage 에 있는 comboBox 를 복사하여 붙여넣기를 했다.

파일 이름을 먼저 변경하지 않고 작업하다보니 꼬이는 부분이 발생한다.

꼬이면 해당 부분을 잠시 주석처리를 했다가 다시 원복하면 정상으로 변경되더라.


datagridView 배경색을 변경하여 색상이 튀지 않도록 해준다.




DB에서 가져온 칼럼 이름이 없으면 에러가 발생한다.


칼럼 이름을 정확하게 적어줘야 에러가 없어진다.

특히 select 문에 case 를 이용하여 값이 표기되도록 할 때 별칭 칼럼을 잘못 적어서 에러가 발생했는데, 오랫만에 하니까 또 같은 부분에서 에러가 났다.



블로그 이미지

Link2Me

,
728x90

foreach 문

- 순차접근을 기반으로 한다.

- 임의 접근이 불가능한 컬렉션을 사용할 때 적합하다.


for 문

- 특정 조건이 성립할 때까지 반복한다.

- 인덱스를 하나씩 증가시킨다. → 인덱스가 성능을 저하시킨다.



이중 for 문을 사용하면 속도가 상당히 느리다.

빠른 속도를 기대하는 경우에 while 문을 사용하면 빠르다.

블로그 이미지

Link2Me

,
728x90

난 아직 디버깅 사용법이 약하다. 그냥 무식하게 디버깅을 한다.

이번 기회에 디버깅을 제대로 좀 배워볼까 하고 적어둔다.


F9 : BreakPoint (멈춤지정) : 조사해보고 싶은 곳에 지정한다.

F5 : Debug 모드 실행 : 코드 전체에 대해 실행하고 문제가 있는 곳을 반환한다.

F5 : 다음 BreakPoint 까지 작동


F10 : Step Over (다음줄로)

F11 : Step Into (함수 안으로 들어감)

Alt + 7 : Call Stack 윈도우

Alt + 3 : Watch 윈도우

Shift + F11 : 현재 루틴에서 빠져나온다.

Shift + F5 : 강제로 디버깅 모드 종료


블로그 이미지

Link2Me

,
728x90

Auto Update 를 만들어보면서 겪은 버그현상이다.

현재 버전과 서버버전이 서로 같으면

"최신버전을 사용하고 있습니다" 라는 메시지창을 띄우고 나서 this.Close() 를 실행했더니

다시 실행하려고 하면 "삭제된 개체에 액세스할 수 없습니다" 라는 문구를 뿌리면서 에러가 발생한다.


폼을 정상적으로 띄우고나서 this.Close() 로 닫기를 한 경우에는 절대로 이런 메시지가 나오지 않았다.

가만 생각해보니까

정상적으로 폼을 띄우지 않은 상태에서 폼닫기를 실행해버리까 메모리에서 아예 삭제되어 버리는거 같다.


해결은 아래 두가지 방법 중의 하나로 해결을 했다.

1. 폼을 띄우면서 정보를 보여주고 다운로드 버튼은 생성하지 않는다.

2. 폼을 띄우고 나서 바로 this.Close() 로 닫기를 하고 "최신버전을 사용하고 있습니다" 라는 메시지창을 띄운다.


잠시 착각해서 발생한 코딩 실수였다.

버그는 기본기가 약해서 발생한다. 삽질을 엄청하고서야 알게되는 허탈감, 시간낭비

더 효과적인 방법으로 구현할 수 있게 될 날을 기대하며....

블로그 이미지

Link2Me

,
728x90

웹서버에 새로운 설치파일을 올려두고, setup.txt 파일 내용을 탐색하여 PC에 설치된 버전과 다르면 프로그램을 다운로드 받게 하는 기능을 추가해봤다.


메인화면이  실행되면서 버전을 서로 체크하여 다르면 자동으로 팝업화면을 띄우도록 처리를 했는데 화면이 가려져서 숨는다.



TopMost 를 true 로 설정하면 항상 최상단에 뜬다.

알림창 효과로 알려주려면 이 기능이 도움된다.

블로그 이미지

Link2Me

,
728x90

문자열에서 숫자만 추출해야 할 경우가 있다.

정규식을 이용하여 문자열에서 숫자만 추출하면 편리하다.

하지만 원하지 않는 결과가 나올 수도 있다는 걸 알았다.

정규표현식 설명 잘된 곳 : http://www.nextree.co.kr/p4327/


using System.Text.RegularExpressions;


// 숫자만 추출
_body = Regex.Replace(_body, @"[^0-9]", "");

// 영문자만 추출
_body = Regex.Replace(_body, @"[^a-zA-Z]", "");

// 한글만 추출
_body = Regex.Replace(_body, @"[^가-힣]", "");


문자열 전체가 숫자인지 검사하여 숫자이면 true 를 반환하는 bool 함수

/// <summary>
/// 문자열이 숫자인지 검사하여 숫자이면 true 를 반환
/// </summary>
public bool isNumeric(string str)
{
    double Num;
    bool isNum = double.TryParse(str, out Num);
    if (isNum)
    {
        return true;
    }
    else
    {
        return false;
    }
}


예외 처리는 무겁기 때문에 꼭 필요하지 않다면 가급적 발생하지 않도록 코딩해야 한다.

문자열에서 숫자만 추출하는 경우에 에러가 발생하지 않을 것이라고 생각한 것 때문에 버그 잡이 하느라고 몇시간을 허비했다.


System.Math.Truncate(double형 숫자); 를 추가하고 나서야 원인 해결이 되었다.


예제를 하나 만들어서 작성해둔다.

private void btnRegex_Click(object sender, EventArgs e)
{
    string msg1 = "2000.34567 을 Math.Truncate 함수를 사용하면 ";
    string msg2 = "2000.34567 을 정규식으로 숫자만 추출하면 ";
    string msg3 = "숫자로 된 문자열에서 double.Parse 함수를 이용하면 ";

    double a = 2000.34567;
    double quotient = System.Math.Truncate(a); // 정수형만 구하기

    string _body = "2000.34567";
    double b = double.Parse(_body);
    _body = Regex.Replace(_body, @"[^0-9]", "");

    MessageBox.Show(msg1 + quotient.ToString() + Environment.NewLine + msg2 + _body + Environment.NewLine + msg3 + b.ToString());
}


결과는

정규식을 잘못 사용하면 소수점을 무시하고 전혀 엉뚱한 결과를 초래할 수 있다는 것 !!!

숫자로 결과를 만드는 경우에는 철저한 검증을 하지 않으면 오류가 나기 쉽다는 걸 몸소 체험했다.


private void checkForUpdate()
{
    // 문자열에서 숫자만 추출해서 버전을 비교하여 서버 버전이 높으면 업데이트 파일 다운로드
    if (int.Parse(Regex.Replace(getLVersion(), @"\D", "")) < int.Parse(Regex.Replace(getSVersion(), @"\D", "")))
    {
        btnDownload.Visible = true;
        SetupGuide.Visible = true;
    }
    else
    {
        SetupGuide.Visible = true;
        SetupGuide.Text = "현재 최신버전을 사용하고 있습니다";
    }
}

블로그 이미지

Link2Me

,
728x90

C# 에서 새로운 창을 만들어서 새로운 창으로 값을 전달하는 걸 만들고 있었다.

그런데 실행을 하면 "개체 참조가 개체의 인스턴스로 설정되지 않았습니다" 라는 메시지를 뿌려준다.


검색을 해보니까

값이 null 일 경우에 이런 메시지가 나온다고 한다.


그래서 null 값으로 넘어가는 것이 있나 확인을 해봐도 결과는 동일하다.


결국 알고보니 DB에서 조회하는 필드에 없는 필드값을 화면에 적어둔 것이 문제였다.


기존 자료를 복사하여 붙여넣기 하고서 필요한 칼럼만 가져오기 위해서 DB Select 칼럼은 지웠는데 화면에 표시하는 칼럼 이름을 미처 삭제를 못하면서 발생한 현상이었다.


이것 원인 찾으라고 한참을 헤매었다.


소스코드를 그대로 복사하여 붙여넣기를 할 경우

private void searchBox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        btnSearch_Click(sender, e);
    }
}


기능이 동작하지 않는다면???


searchBox_KeyDown 에서 마우스 우클릭을 하고, 모든 참조찾기(Shift + F12) 키를 눌러본다.


this.searchBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.searchBox_KeyDown);
가 검색되지 않는다면 이벤트 핸들러 등록이 안되어 있다는 것이다.

이 경우에는 이벤트 핸들러를 생성해주어야 한다.


ContextMenu 에서 메뉴 항목을 정리한다고 sub 메뉴로 이동시킬 때에도 연결되었던 이벤트핸들러가 연결이 사라지더라.




블로그 이미지

Link2Me

,