퇴근5분전

사용자 삽입 이미지

<< 캡쳐 >>



바인딩 거는 소스 처리부..

            SqlConnection sql = new SqlConnection(" ... ");
            SqlCommand scmd = sql.CreateCommand();
            scmd.CommandText = "select * from Item(Nolock)";
            sql.Open();              
            DataTable dt = new DataTable();
            dt.Load(scmd.ExecuteReader( CommandBehavior.SequentialAccess ));
            sql.Close();
           

            this.bindingSource1.DataSource = dt;
            this.bindingNavigator1.BindingSource = this.bindingSource1;

            this.textBox1.DataBindings.Add("Text", this.bindingSource1, "ICODE", true);
            this.textBox2.DataBindings.Add("Text", this.bindingSource1, "KNAME", true);


음 이걸 어떻게 응용할수 있을까???

 이전 와이즈엠 다니던 시절 이사님께서 진행 중 표시를 커서로 간단히 ... 표현하셨다.
당시 난 어렵게 프로그래스 동원해서 어떻게든 가시적인 표현을 하였지만.
힘들게 할 필요없이 간단히... 매우 간단히 커서만 바꿔주면 된다.

UseWaitCursor = true;   하면 커서가 바뀐다.

참 쉽당! 

물론, 프로그래스바가 필요할땐 써야겠지만... 우선...

사용자 삽입 이미지
<< 객체 표현 >>

IUserData  라는 인터페이스에 프로퍼티를 이용하여 객체에 고정된 값에 대한 추출을 이용할때

AbstractObject 처럼 상속받아 구현후
프로퍼티 get; 에 가상함수를 배치하여 재정의 된 메서드를 콜할수 있게 만들어놓으면

이를 상속해서 GetData() 재정의 할경우 구현하는 객체기준으로 데이타를 추출할수 있게 됨.

말이 좀 이상한가...

현재 프로젝트상에서
폼 작업시 특정 컨트롤에서 데이타를 추출할때 이 컨트롤을 사용자 컨트롤로 만든다고 했을때
인터페이스 상속후 컨트롤에 값을 노출하는 프로퍼티를 만들어주고
 이에 대한 접근으로 데이타를 뽑아낸다고 했을 때, 만약 이와 같은 유형에 컨트롤이 많을 때,
이와 같은 방법으로 각 유형별 컨트롤에서 GetData()를 재정의 해서 다른 데이타를 추출해줄수 있음.

단, 프로퍼티의 데이타 타입은 규격을 정해줌. (uniList 라는 객체로 규격화 하여 사용하고 있음. )

 
사용자 삽입 이미지
<< 객체 관련 >>

컨트롤 : 팝업시키는 폼 또는 유저 컨트롤이 됨.
팝업 : 기초 코드를 가지는 팝업 폼
ICodeList :  코드리스트를 사용하는 측에서 팝업에서 선택된 코드를 받아서 데이타를 처리하는 메서드에 대한 인터페이스를 정의함.

대리자는 ICodeList.SelectedCode 를 대신함.

팝업을 생성해서 코드 목록을 구현하고 이 코드 목록이 선택이 되면
대리자를 통해 컨트롤로 선택된 코드를 전달하게 됨.

 몇가지 방법 중 간단하게 폼간 데이타 전달을 쉽게 구현할수 있고, 각 객체간에 응집력을 낮춰놓을수 있는
소스임.

 객체지향을 항상 골똘히 생각하고 그에 맞게 코딩하고자 여러가지 생각을 하면서
머리속에 혼란스러워질 때가 있어서 정리해보려 함.

그중 하나로 대리자의 역할과 쓰임새에 대한 고민이 커졌다.
오늘 퇴근하면서 "버스에 내가 탔다!" 로 시작했다.

[버스에 내가 타는것]과 [버스가 나를 태운 것]으로 생각해보았다.
( 물론 위 문구는 몇번이나 생각해보았던 것이고 알맞게 정리 하였음. )

나만에 방식으로 몇번을 그림을 그려보는데 헷갈려서 그냥 집에 와서 코드소스로 만들었다.

아래 소스는 몇번 더 고민한끝에 수정된 소스이다. 
( 처음 적절하지 못한 사용에 대한 처리방법은 아래 주석처리가 되어있음. )

적절하지 못했던 방법부터 얘기를 풀어볼까낭.

버스를 코딩한답시고 타고, 내리고를 구현했고,  사람을 코딩한다고  타고, 내리고를 똑같이 코딩했었고
뭔가 맞지 않고 서로간에 연계가 이상했다.

처음 버스에 내가 탄것과, 버스가 나를 태운것과 처음 혼란스러웠다고 하면 바보 같겠지!
거창하게 말하자면 버스, 사람에 대한 두 객체설계를 했는데 그 과정에서 코드까지 풀어갈수 있게
나만에 스케치 방법에 착오로 인해 소스가 분명해지지 않고 맴도는 상태가 되어 더욱더 혼란스러워졌다.

해결책으로 생각해낸것이 주체를 정하는 것이었다.

버스 - 대리자 - 사람    이렇게 세개의 객체가 연결관계를 맺을 때 대리자는 버스와 사람간에 어떤 역할을
대신 해주는것이므로 방향을 지정해준다. 버스에서 사람으로 가는 메세지를 대신할것인지.
사람에서 버스로 가는 메세지를 대신 할것인지.

여기서 [버스 -> 사람] 버스가 사람을 태운다
          [사람 -> 버스] 사람이 버스에 탄다.

그렇게 생각하고 구현한고 테스트한게 아래 소스이다.

a.BusGetOn(bus.GetON);
a.BusGetOff(bus.GetOff);
bus.GetOn(b);
bus.GetOff(b);        

동일하게 버스에 태우고 내리고를 하게 되는 구문이다. 해석에 의문이 생길뿐이고...
몇가지 생각을 해보았다.

a가 버스에 타는 것.
버스에 a가 태워지는것,

이건 class 구문 내부를 보게 되었을 때...  아리까리함이 ... 처음엔 더 혼란스러웠다.

public class BusObject
{
         ...
        public void GetOn( PeopleObject  people)
        {
            // 사람이 버스에 탄다.
            if (!peoples.Contains(people))
            peoples.Add(people);
        }
}

public class PeopleObject {
        ...
        public void BusGetOn(_OnOut bus)
        {
            bus(this);  // 뭔지 모르고 자기를 던져 넣는다.
        }
}

 여기서 사람은 자기가 뭔가에 태워지게 되는데 뭔지 모르고 자기사진을 맡기게 되는 것.
 버스는 확실히 사람을 태우고 있고.

메서드 명이 뭔가 잘못된것이 보인다. 버스에 탄다 인데.. 버스를 받지 않고
대리자를 받고 있으니 어긋난 느낌이랄까?

 인자값으로 버스, 기차, 오토바이등의 상위 객체를 뽑아 탈것이라는 객체로 받는다면...
그것도 또 하나의 방법이 되겠지만... 지금 생각할것은 대리자의 쓰임새와 활용면을 고려해보려고 하니
좀더 고민하게 되었다.

그러다 찾아낸점이 사람이 타고, 내리고 라는 두개의 메세지가 존재하게 되는데, 현재 사용하고 있는 대리자가 있고  현재 타고, 내리고의 메서드는 동일하게

  bus(this);

이것만 있네?

좀더 고민을 통해 Do라는 메세지 1개로 절단 내버렸다.

대리자를 이용하니 이런게 되더라

Do라는 메세지하나로 버스에 타고, 내리고를 가리킬수 있게 되었다.

와우~~ 멋지다!


아래 보면 a.Do 라 해서 a에 Do라는 메세지로 어떤 행동을 지시할때 그 대상으로 bus.GetOn 이라는 대상을 제공한다.

a.Do( bus.GetOff );  a에게 행동하라고 지시하면서 버스에서 내려라! 라고 ... 되는것 같지 않은지?

나만 그렇게 보이는 건가?

bus에 GetOn 메세지를 날리면서 B를 제공한다.  
   GetOn은 "~에 태우다" 라는 뜻이공. GetOff는 "~에서 내리다."

대리자를 가지고 할수 있는 일 하나를 풀어보았는데 길다.
나도 읽을지 의문이 될정도로... 길게 썼넹.

이만~!

<< 이하 소스 전문 >>

     private void button1_Click(object sender, EventArgs e)
        {
            BusObject bus = new BusObject();

            PeopleObject a = new PeopleObject("A");
            PeopleObject b = new PeopleObject("B");
            PeopleObject c = new PeopleObject("C");

      // a.BusGetOn(bus.GetON);  // 처음 코딩했을 때.

            a.Do(bus.GetOn);   // a는 행동한다. 버스에 탔다.
            a.Do(bus.GetOff);   // a는 행동한다. 버스에서 내렸다.

            bus.GetOn(b);        // 버스에 b를 태우다.
            bus.GetOff(b);        // 버스에서 b를 내리다.

        }

    public delegate void _OnOff( PeopleObject  people);

    public class BusObject
    {
        List<PeopleObject> peoples = new List<PeopleObject>();

        public void GetOn( PeopleObject  people)
        {
            // 사람이 버스에 탄다.
            if (!peoples.Contains(people))
            peoples.Add(people);
        }

        public void GetOff(PeopleObject people)
        {
            if( peoples.Contains( people ) )
            peoples.Remove(people);
        }
    }

    public class PeopleObject
   
{
        string name = string.Empty;

        public PeopleObject( string _name)
        {
            name = _name;
        }

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

     //public void BusGetOn(_OnOff bus)
        public void Do(_OnOut bus)
        {
            bus(this);
        }

        //public void BusGetOff(_OnOff bus)
        //{
        //    // 음 이건 자기가 뭐에서 내리는지도 모르고 내린다.
        //    bus(this);
        //}

    }

사용자 삽입 이미지

 << 헤더에 번호매김 표시한 화면 >>


 데이타 그리드 뷰 에 기본 제공되는 RowHeader를 이용하여 번호매김을 하는 코드임.

소스는 아래와 같이 간단함.

private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            if (e.RowIndex >= 0)
            {   
                string NumberingText  = (e.RowIndex+1).ToString();

                // 글자 사이즈 구하기.
                SizeF stringSize = e.Graphics.MeasureString(NumberingText, Font);

                // 글자에 맞춰 좌표계산.
                PointF StringPoint = new PointF
                (
                    Convert.ToSingle(dataGridView1.RowHeadersWidth - 3 - stringSize.Width ),
                    Convert.ToSingle(e.RowBounds.Y) + dataGridView1[0, e.RowIndex].ContentBounds.Height * 0.3f
                );

                // 문자열 그리기.
                e.Graphics.DrawString
                (
                    NumberingText,
                    Font,
                    Brushes.Black,
                    StringPoint.X,
                    StringPoint.Y
                );
            }
        }       

'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글

바인딩 네비게이터  (0) 2009.08.14
WaitCursor ...  (0) 2009.08.14
드디어 챠트를 만들다!!!  (0) 2009.06.19
챠트 모듈을 만들다!!  (0) 2009.06.17
일일 일정 관리 프로그램 II ( upGrade )  (0) 2009.06.12

사용자 삽입 이미지

 챠트가 완성되었다. 하나의 챠트에 복합구성하게되는 챠트로
헤더값을 하나로 처리하려다 꼬여서 다른 방법으로 겨우 풀어내었다.
+ 값만 생각하다 sin파 출력을 하니 엄청 당황스러운 파형이 나와서... 죄다 뜯어고쳐서
+든 -든 잘 처리가 되게끔 했음.

라인 챠트 시 점과 점 에 위치값을 구하는것도 꾀나 많이 수정이 되었음.
X, Y축 그릴때 많은 문제점이 나와서 모두 새로 작성이 되었음.

음 아직 히포챠트는 넘사벽이지만... 좋은 공부가 되었음.
투명처리는 우째 해야되는것일까낭....ㅡ.,ㅡ?????

- 나머지~
1. 타이머로 실시간 그래프를 해볼까낭....
2. 범례 표시만 해줌 되려낭...
3. 특정 포인트값 표시 랄까??  음 이것까지 하면 좀 빡실것도 같은데~~

사용자 삽입 이미지


챠트 구성 모듈을 만들었다.

위에는 3개의 그래프를 각각 타입별로 그린내용임.

막대그래프,  막대그래프 + 점, 점 + 라인

ㅎㅎㅎ

6 /18   --> 백그라운드 추가 좌표계 추가했음.

 
사용자 삽입 이미지

<< 새로 만든 모듈로 적용하여 그린 챠트임 >>

눈금 자동, Item항목 분리...

데이타 추가가 쉽게..

각 그래프별 속성 변경이 용이하게 객체 배치를 완료함.

사용자 삽입 이미지

 일일 일정 관리 프로그램으로써 어제 만든것보다 조금더 조작이 편하게 만들어볼까 해서
새로 만들었음.

* 설명 :

-  달력 :  일정이 기록된 날짜가 굵게 표시되고 클릭하면 해당 일자에 기록된 내용이 표시되고
       또 새로 등록가능함.
- 리스트 박스 : 월별로 누적된 데이타를 보여줌.  클릭시 해당 날짜에 등록된 내용을 볼수 있음.

- 등록 버튼 : 입력된 내용과 시간을 항목에 등록함.
- 저장 버튼 : 등록되있는 날짜별 일일 일정을 파일에 기록함.
- 항목 리스트 아이템 : 
           - M : 수정
           - D : 삭제
           - 완료 : 일정 완료지은것들 체크
           - 내일로 : 내일로 해당 항목을 보내기 위한 선택버튼
- 내일로 : 내일로 보내기 위한 선택 항목들을 내일 일정으로 보내줌.
- 번호는 그냥 순번일뿐이고.
- 완료버튼 위 TextBox : 완료 예상 시간 입력 가능
- 수정모드 사용은
   항목 리스트 아템의 Textbox에서 F2누르거나 항목중 M버튼 클릭시 수정모드로 바뀜.
   수정완료 : [Control + Enter] 누르면 수정완료됨.
   삭제시 바로 삭제됨



버그 :
1. 항목 타이틀 표기가 좀 이상하게 출력되는점.
2. 저장이나 내일로 보내기 등 클릭시 동작이 되는데 ...눈으로 저장된건지 알수가 없음...
3. .. 찾는중...


-->  06, 14일 업그레이드
사용자 삽입 이미지

 - 기능 추가
    1. 알리미
    2. 보고서 만들기
    3. 환경설정!
    4. 오늘/ 내일로 보내기 ( 단, 토,일은 선택사항임 )

사용법 :
 - 기본기능  
 1. 하루 할 일들을 등록하고  저장.
 2. 이전 일정중 못한것 , 오늘로 가져오기 내일로 보내기로 등록 저장.
 3. 하루를 정리 할때 완료된것들을 체크해서 저장
 4. 보고서 만들기를 통해 일일 또는 주간단위로 Text파일로 만들어서 보관 가능함.
 5. 항목에 시간등록하게 되면 이값을 이용해 해당시간이 되면 알람 효과를 통해 알려줌.

 - 환경설정
 1. xml과 text파일 보관 폴더를 지정할수 있음. ( 공통으로 사용 함 )
 2. 하루 하루 반복되는 일정이 존재시 여기에 등록해두고
 3. 일정 등록시 매일 반복되는 일정 추가 가능함.

 - 보고서 만들기
 1. 1~ 7일 간 일정을 text 파일로 만들수 있음. ( 단, 완료목록만 출력됨 )
 2. 미리보기를 통해 일주일 내용을 한꺼번에 확인 가능함.
: 출력을 원하면.. 메모장에서...    ~~,
 
 알림 효과 :
사용자 삽입 이미지

작업 표시줄에 아이콘. 등장!!
 
사용자 삽입 이미지

   작아서 안보이넹.. Js 라는 빨간 아이콘 등장!!  역시 그리는건 쉽지 않음..

위에는 몇초 후 일정 등록해서 알림 효과를 확인해본 화면임.

사용자 삽입 이미지

이 프로그램은 하루 하루 그날 그날 예정사항을 기록 해놓고
처리 할때마다 OK 체크박스를 기록하면서 그날 그날 어떤 일을 했는지 기록으로 남기고
관리 할수 있도록 만듬.

간단한 사용법 Textbox에 그냥 입력하고 등록! 누르면 됨.
리스트 등록 후 -> 저장 누르면 파일에 저장됨.

사용자 삽입 이미지



- 항목 리스트에서의 TextBox 기능
F2 키 : 수정
우측버튼 : 수정, 삭제 기능
- 달력
저장된 파일 존재시 날짜별로 굵게 표시함.
- 리스트 박스
그달에 저장된 기록을 보여줌. ( 클릭... 리스트에 출력 해볼까낭 )

앞으로 ...
    데이타를 주간별, 월간별로 출력할수 있게만들어 봄.


: XML을 이용해서 데이타 저장, 수정, 등록, 삭제를 함.


추가 : 목록에 대한 등록, 수정, 삭제시 저장버튼 배경색 변경으로 알려줌.

--> 변경된  UI
사용자 삽입 이미지

--> 0612  이프로그램에 대한 업그레이드로 새로 만들었음... 다음 버젼..
이프로그램은 폐품 처리 ~