2014. 11. 28. 17:05


코드 실행 중 새 창 띄우고, 새 창이 닫히면 다시 코드가 계속 실행되는 예제 입니다.


요약 : 모달 폼으로 띄우면 됩니다.

            textBox1.AppendText("1");
            textBox1.AppendText("2");
            textBox1.AppendText("3");
           
            Form2 form2 = new Form2();
            form2.ShowDialog(this);
         
            textBox1.AppendText("4");
            textBox1.AppendText("5");
            textBox1.AppendText("6"); 


저렇게 다이얼로그 형식으로 불러내면 새 창 닫기 전 까지 코드 수행이 중단 됩니다.

Posted by 해비
2014. 10. 24. 09:47

C# 윈폼에서 창 열고 닫는 소스코드 입니다.


단순히 .Show()만 하면 되지 않느냐구요??

(직접 겪어보시믄 이게 왜 필요한지 알게 됩니다잉~)


여기서 ntcDF는 Form객체 입니다.



창 열기

        private void showNotice()
        {

            if(!ntcDF.Created)
            {
                if(ntcDF.IsDisposed)
                {
                    ntcDF = new NoticeDF();
                }

                ntcDF.Show();
            }
            else
            {
                ntcDF.Activate();
            }
        }



창 닫기

        private void closeNotice()
        {
            if(!(ntcDF == null))
            {
                ntcDF.Close();
            }
        }  




Posted by 해비
2014. 10. 15. 17:19


컬럼(Column) 잠그기

this.fpSpread1_Sheet1.Columns.Get(0).Locked = true;
this.fpSpread1_Sheet1.Columns.Get(1).Locked = true;
this.fpSpread1_Sheet1.Columns.Get(2).Locked = true;




컬럼(Column) 정렬기능 추가

1

 this.fpSpread1.ActiveSheet.SetColumnAllowAutoSort(-1, true);

2

 this.fpSpread1.Sheets[0].Columns[1].AllowAutoSort = true;

- Column 헤더 클릭 시 해당 Column 기준으로 데이터를 정렬하여 표시 해 준다.

- [1] 또는 [2] 중 한가지를 선택 적용한다.



현재 선택한 Row 색칠하기(잠겨진 셀 포함)

//잠긴 셀에 지정된 색상 해제
fpSpread1.ActiveSheet.LockBackColor = Color.Empty;

//기존에 칠된것 모두 제거
for(int i=0; i<fpSpread1.ActiveSheet.Rows.Count; i++)
{
    fpSpread1.ActiveSheet.Rows[i].BackColor = Color.Empty;
}

//새로 색칠
fpSpread1.ActiveSheet.Rows[iCurRow].BackColor = Color.FromArgb(255, 255, 0);

- RGB색상은 마음에 드는 색상으로 설정한다.




싱글 선택만 되도록

this.fpSpread1_Sheet1.SelectionPolicy = FarPoint.Win.Spread.Model.SelectionPolicy.Single;

- 디자이너 화면에서 설정 가능하다.




셀 한번 클릭 시 이벤트

private void fpSpread1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{

}

- CellClick 이벤트는 이전 클릭된 것을 바라보는 문제가 있고, SelectionChange 이벤트는 1개뿐이 없을 때 다시 선택해도 이벤트 발생이 되지 않는 문제가 있다.(이건 당연하지만...)


- DoubleClick 이벤트는 말 그대로 두번 클릭질 해야 하는데 역시 불편하다. 두번클릭보단 한번클릭이 아무래도 더 편하니까~~


혹시 다른 또는 더 좋은 방법 있으면 한 수 가르침 부탁드립니다.




컬럼 헤더 셋팅 예제코드

fpSpread1.Sheets[0].ColumnHeader.Cells[0, 0].Text = "코드";
fpSpread1.Sheets[0].Columns[0].Width = 60;
fpSpread1.Sheets[0].ColumnHeader.Cells[0, 1].Text = "내용";
fpSpread1.Sheets[0].Columns[1].Width = 60;
fpSpread1.Sheets[0].ColumnHeader.Cells[0, 2].Text = "설명";
fpSpread1.Sheets[0].Columns[2].Width = 250;

- 컬럼 헤더 타이틀, 컬럼의 가로길이 설정 예.




멀티라인 텍스트 데이터 가져오기

private DataTable _rtnDT; // 전역변수 선언


// 스프레드에 데이터 바인딩

_rtnDT = _controller.getData();

fpSpread1.DataSource = _rtnDT;


// 스프레드 내용 참조 시

iRow = fpSpread1.ActiveSheet.ActiveRowIndex;


txtProhAbbr.Text = _rtnDT.Rows[iRow][0].ToString();
txtProhMemo.Text = _rtnDT.Rows[iRow][1].ToString();

- fpSpread의 [row,col].Text 로는 멀티라인 데이터를 텍스트 박스에 연결 시 한줄로 출력되는 문제가 있어 해당 Row번호만 알아낸 다음 DataTable에서 직접 가져온다.

혹시 다른 또는 더 좋은 방법 있으면 한 수 가르침 부탁드립니다.




셀 병합

fpSpread1.Sheets[0].AddSpanCell(0, 0, 2, 1);

- 인자 4개를 넘겨줘야하는데 앞 2개 인자는 병합 시작 셀의 row, col 값 이고, 뒤에 2개 인자는 병합할 row 수, 병합할 col 수 이다.

- 위 예제를 본다면 0,0 으로 부터 2개 Row, 1개 Col 병합 이므로 아래와 같이 될 것이다.


 

 


0,0 좌표로 부터 2개 Row 병합된 상태, Col 은 1 이었으므로 병합되지 않는다. 만약 Col 도 2 였다면, 2 x 2 셀 모두 합쳐 진다.




엑셀 내보내기

// 스프레드에 내보낼 정보 적재
fpSpread1.DataSource = rtnDS.Tables[0];

// 컬럼길이 조정
fpSpread1.Sheets[0].Columns[0].Width = 70;  // 사번
fpSpread1.Sheets[0].Columns[1].Width = 70;  // 성명
fpSpread1.Sheets[0].Columns[2].Width = 50;  // 삭제

// 파일저장 다이얼로그 확장자 필터 설정
savedlg.Filter = "Excel files (*.xls)|*.xls|All files (*.*)|*.*";
savedlg.FilterIndex = 1;

if (savedlg.ShowDialog() == DialogResult.OK)
{
    // 스프레드의 내용을 엑셀파일로 저장
    fpSpread1.SaveExcel(savedlg.FileName, FarPoint.Win.Spread.Model.IncludeHeaders.ColumnHeadersCustomOnly);

    MessageBox.Show("저장이 완료 되었습니다.", this.Text,
        MessageBoxButtons.OK, MessageBoxIcon.Information);
}

- SaveFileDialog 컨트롤 을 호출하여 저장할 위치, 파일명을 입력받고, 스프레드의 내용을 해당 위치에 내보낸다.

- 스프레드 속성 중 Visible = false 인 경우, 시트 없는 빈 엑셀 파일이 생성되므로 주의한다.






Posted by 해비
2014. 9. 18. 09:13

우선 현제 제가 사용중인 기기는 iPAD Air 셀룰러 모델 입니다.

오늘 새벽... iOS 8 정식이 공개되고... 업뎃 후 셀룰러 데이터 항목이 사라진 것을 보고 참 난감 했었습니다.


우선 저는 LG U+ LTE 유심 사용 중입니다.
다른 통신사 유심이 없어 확인은 못 해 봤지만 아마 동일한 원리 일 것이라 생각합니다.


[설정] -> [셀룰러데이터] 화면으로 갑니다.

전 이미 설정이 끝나서 보이는 것인데... 처음에 저 개인용 핫스팟 메뉴가 없었습니다.



APN 설정

요렇게... 셀룰러 데이터, 개인용 핫스팟에 둘다 해당 통신사의 APN을 찾아서 적어 줍니다.

그리고... 위 스샷(첫 번째 사진)에 보시면 셀룰러 데이터를 켜고 끄는 옵션이 있습니다.

한번 껏다가 다시 켜 주시면 셀룰러 데이터 항목이 왼쪽에 다시 나타납니다.




아래는 삽질 스샷(빡침!)

핫스팟 APN만 설정했다가 삽질을 했네요..;;

이 계정에 대해 개인용 핫스팟을 활성화하려면, Carrier에 문의하십시오.

...애플의 막장짓거리 (이게무슨 지거리야!!)




1줄 요약...
APN 설정 하고, 셀룰러 데이터 껏다 켜면 된다.  - 끝 -


아침에 급 해결 되는 바람에 정리해서 글 남깁니다.
업뎃 후 제대로 빡쳐(?)있을 많을 분들을 위해서...


Posted by 해비
2014. 7. 7. 17:30

실행파일 매개변수1 매개변수2 ... 여러개 넣어 실행하게 되면 이것을 출력해 주는 소스

#include <stdio.h>

int main(int argc, char **argv)
{
    int i;

    for (i=0; i < argc; i++)
    {
        printf("argv[%d] = %s\n", i, argv[i]);
    }

    return 0;
}



출력 예

> test0316.exe 1 2 3 "4 5 6"
argv[0] = test0316.exe
argv[1] = 1
argv[2] = 2
argv[3] = 3
argv[4] = 4 5 6




Posted by 해비
2014. 7. 7. 17:29


파일의 내용을 매개변수로 받아서 출력해 준다.

#include <stdio.h>
 
int main(int argc, char **argv)
{
    FILE *pFile = NULL;

    if(argc < 2)
    {
        printf("File Viewer v0.1 [USAGE] testcon1 [FILENAME]\n");
    }
    else
    {
        pFile = fopen(argv[1], "r");
    }

    if( pFile != NULL )
    {
        char strTemp[255];
        char *pStr;
 
        while( !feof( pFile ) )
        {
            pStr = fgets( strTemp, sizeof(strTemp), pFile );
            //printf( "%s", strTemp );
            printf( "%s", pStr );
        }
        fclose( pFile );
    }
    else
    {
        //에러 처리
        printf("Error - can not open file. \n");
    }
 
    return 0;
}


while 문 안에서 eof 가 아닌동안 계속해서 fgets 로 내용 읽어다가 출력을 반복하고 있다.

strTemp 의 크기가 255 이므로 254자(255번재는 마지막을 표시하는 문자) 단위로 읽어서 화면에 뿌려준다.



Posted by 해비
2014. 6. 11. 15:16



[1]

int main(int argc, char *argv[])


[2]

 int main(int argc, char **argv)


[1]로 하든 [2]로 하든 실제 컴파일 하여 실행해 보면 결과는 동일 했다.

인터넷 검색에서도 둘은 같은 내용이라는 것을 볼 수 있었으나, 직접 눈으로 확인하고 싶어서 아래의 과정을 거쳐 확인을 해 보았다.



확인방법은 gcc로 어셈변환 해서 어셈된 결과를 가지고 비교하는 것으로 하였다.

소스 는 아래와 같다.

argv.c

argv2.c

 #include <stdio.h>

int main(int argc, char *argv[])
{
        return 0;
}

 #include <stdio.h>

int main(int argc, char **argv)
{
        return 0;
}

표시된 부분이 차이점.



그리고 이것을 어셈변환한 결과 비교

어셈에 사용한 명령어
$ gcc -S -o argv.s argv.c



WinMerge로 비교 결과, 파일명을 제외한 모든 부분이 완전히 동일하다.

어셈코드가 동일하므로, 기계어로 컴파일되는 최종 결과물 또한 동일하다고 할 수 있다.





참고1. 두 구문의 동일성에 대한 내용은 StackOverflow 의 아래 링크에서 확인 하였습니다.
http://stackoverflow.com/questions/16666353/what-does-char-argv-means




Posted by 해비
2014. 5. 17. 09:12

C언어를 다시 복습&기본기 다지기 차원에서 공부하던차에 다음과 같은 내용이 나왔다.

음... 뭐 별거 없는 간단한 소스다.

변수 선언하고 값 대입하고~~


자, 이 소스에 오류가 있을까 없을까?

필자는 당연히 없다!! 그냥 변수 선언하고 값 대입 땡. 끝이네... 뭘 이런 간단한것에... 하면서 아랫줄 설명을 읽던 차에...


헑!!!? 오류가 있다고??


하지만, 실무경험으로 C#, Java 가 주된 터에 C의 특징을 제대로 알고 있지 못했던 것에서 비롯되었다.


변수 선언은 중괄호 열고나서 필요한 변수들을 모조리 선언한 다음에 문장을 시작해야 한다는 것이었다.


1999년도 발표된 새로운 C표준은 저러한 제약을 두고 있지 않다. 라고 추가 설명이 붙어있긴 한데...

MS Visual.NET 2003 의 C 컴파일러는 친절하게도 오류를 내뱉어 준다.

이것이 오류 메시지...


문장을 시작한 다음 줄은 8번째 줄이 오류라고 알리고 있다.


그래서...


오류를 수정한 버젼이 아래 소스코드 되시겠다.




Posted by 해비
2014. 4. 24. 09:40

다룰 내용...

1. 날짜 형식 변수 선언 및 날짜 데이터 입력

2. 두 날짜 From ~ To 사이의 일수 계산


// 1. Date형식의 변수에 날짜를 설정

DateTime FrDate = DateTime.ParseExact("20140422", "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture); // 시작

DateTime ToDate = DateTime.ParseExact("20140521", "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture); // 종료


// 2. 두 날짜 사이의 일수

TimeSpan ts1 = ToDate - FrDate;  // 2014년 5월 21일 - 2014년 4월 22일 = 29일 (+1로 보정해야 한다)


// 보정하고 정수형 변수에 담는다.

int Days = ts1.Days +1;


// 끝~~


+1 해주는 이유는...

예를 들어 1일 부터 3일 까지의 기간으로 했을 때, 실제로는 1일, 2일, 3일 이렇게 총 3일 이다.

하지만 날짜 계산에서 3 - 1 = 2가 되므로 시작일 하루를 가산하여 보정해 줘야 한다.


시작일 가산...? 다른 표현 방법이 떠오르진 않지만 여튼 뭐 그렇다.




더 좋은 방법 및 의견 코멘트 환영합니다.  ^__^


Posted by 해비
2013. 12. 5. 18:07

조금 특이한 케이스를 잡아서 소개합니다.

데이터셋과 콤보박스가 연결된 상태에서 발생하는 문제입니다.


해당 문제를 재현한 프로그램 

환경 : C#.NET 1.0 WinForm

상황 : ComboBox 컨트롤의 값을 코딩으로 변경하였는데 변경된 값이 실제로 반영되지 않는 문제.


WindowsApplication2.rar

(실행파일 & 소스 포함, C#. Net 1.0, VS .NET 2003 에서 컴파일 되었습니다.)



[[ 문제 상황 ]]

1. 콤보박스(ComboBox) 목록 등록

콤보박스(ComboBox)의 목록은 ValueMember, DisplayMember 속성을 테이블의 컬럼으로 지정 후, DataSource 속성에 테이블을 지정하는 방법으로 한다.


2. 실제 코드값(데이터)를 가져온 데이터셋이 필요


3. DataBingings 속성으로 2의 실제 코드값을 바인딩 처리


4. 코드상에서 콤보박스 값을 변경 후 데이터셋 값 확인



여기서 콤보박스의 SelectedValue 속성을 통해 값을 변경 하면, 화면에는 바뀐 값이 표시되나, 실제 데이터셋의 값은 처음 가져온 상태 그대로 변동이 없으므로 주의가 필요합니다.


1. 마우스로 콤보박스를 직접 선택하여 값을 변경하게 되면 변경된 값이 2항에 데이터셋에도 같이 변경되어집니다.

    마우스로 직접 건드리는 경우에는 데이터셋의 값이 함께 변경되어 지는 것을 확인 할 수 있습니다.

2. 마찬가지로 데이터셋을 직접 건드리면 바뀐 값이 콤보박스에도 그대로 반영됩니다.

3. 마우스로 직접 건들고 난 이후에는 데이터셋을 변경 하여도 콤보박스의 값이 바뀌어 지지 않습니다. 


즉, 데이터바인딩 된 개체의 값을 소스로 핸들링 시 컨트롤을 건들지 말고, 바인딩된 해당 데이터셋의 값을 고쳐야 한다는 것

(왜 그런지에 대한 이유는 모르겠습니다. 어쨋든 되는 방향 찾았으니 그걸로 또 하나의 삽질을 끝냅니다.)



혹, 원인 이라던가 좀 자세한 내용을 알고 계신분은 한수 가르쳐 주시면 감사하겠습니다 (__)



[2013/12/06]

정정합니다.

.Net 1.0 이 아닌 환경에서는 해당 문제가 발생하지 않는 것으로 보아 프레임워크 버그인듯 합니다.

.Net 4.5 Framework 만 설치된 컴퓨터에서 프로그램 실행시 증상이 나타나지 않는 것을 확인하였습니다.



Posted by 해비