사는생각들 2008. 11. 14. 23:53

시골의사는 예전에 주식강좌때문에 알게된 인물이다.

이 강좌를 들으면서 새로운 느낌이란것이 나에게 다가온다. 난 20대에 무엇을 준비했단 말인가.

아 정말 아쉽다. 나의 20대는 이미 흘러가 버리고 이제 성취해야 되는 30대에 난 무엇을 하는가?

 

그렇다 잠이 안오는군… 어떻게 잠이 오겠는가…

 

2강의 끝부분이 짤려서 매우 아쉽다.

posted by 삶의여유로움
:
C#/일반적인코딩 2008. 11. 14. 21:58

     

    이 글을 적은지도 꽤 지났는데 어느날..

    http://mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=25&ID=322

    이글을 봤다.

    흐흐.. 저기 적혀 있는게 더 나은 루틴이다.

     

    모양이 똑같다 그런데 흐흐 잠시 흠칫 놀랐더랬다.

    뭐 그리 똑같지는 않다만..

     

    실제 업무에서 쓸때는 DB쪽 강좌에 적은 Reflection을 이용한것을 사용해 보길 권한다.

    개인적으로 루틴돌리기에는 그것도 나쁘지 않은듯 보여진다.

    우째도 내가 저 링크보다 좀 더 아는척 해보고 싶다. ㅋㅋㅋ

    사실 아는건 쥐뿔도 없다는 다들 알꺼고..

     

    개인적으로 저 사이트 참 괜찮다. 공부할게 많으니 들러서 모든 글을 싸그리 다 읽어버리길 권한다.

     

    내가 적은 여기 블러그는 저 사이트에 비하면.. 조족지혈이다.

     

    휠씬 더 나은방법을 사용하고 있으니 잘.. 참고하길 바란다.

     

    ------------------------------------------------

     

    참 부족한 프로그래머로서 남의코드에 이러쿵 저러쿵 할말은 없으나

    그래도 항상 하는짓이 꼭 남의코드 수정이나 해야되는 입장에서

    되도록 그분들의 코드가 잘~ 작성되었으면 하는 바램이 있다.

    http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEULNO=8&no=97314&ref=97314&page=1

    이글을 읽다가 문득 마음이 아파왔다.

    일전에 약 70여개의 컨트롤들의 탭이나 입력값을 제어하는 코드를 수정해 줘야했는데

    그 코드가 마치 하나하나 대입하거나 IF문을 사용했던것이

    수정을 위해서도 어찌그리나 피곤하던지 말이다.

    믿어지지않겠지만 35번째를 수정하면 그 이하 코드를 다 수정해야 되도록 코딩을 해 두셨다.

    게다가 폼만.. 30개쯤 되었으니.. 어림잡아.. 300여개정도.. 코딩으로 1000줄은 수정해 줘야했던듯 했다.

    참 마음아프게도 이 코드를 수정을 해줘야 겠는데 다 지우고 그냥 몇줄 적으면 되는것을

    지워야 하나 아님 새로 만들어야 하나를 두고 고민했었다.

    지우자니 굴러온돌(?) 박힌돌의 코드를 맘대로 수정했다고 욕먹을듯 눈치는 보이고

    그렇다고 양해를 구해보니 절대 수정하지 말라는 황당한 요청은 들어오고

    그렇다고 이걸 수정하자니 너무 많은 수정이 있었다.

    일단 기초적 방법은 두가지가 있다.

    하나는 Collection에서 foreach를 이용하는것이고

    두번째로는

    그 응용으로 컬랙션의 값을 다시금 컬랙션으로 만드는것이다.

    전자의 방법은 collection내부에 다시금 collection이 포함된경우 그 내부의 컬랙션안에 들어간것을 처리할수가 없다.

    이말 조차 이해를 못하는 사람들이 있을까봐 다시금 풀어서 이야기하자면

    폼은 하나의 컬랙션개체이고 그룹박스, 패널, 탭컨트롤 등등도 컬랙션 개체이다.

    즉 잘 풀어서 이야기 하면 폼에 라벨을 두고 그룹박스 않에 라벨을 두면

    두개의 개체에 있는 라벨을 foreach로 모두 처리하기에는 피곤하다는 이야기다.

    그래서 즉.. 두번째 방법을 사용하게 된다.

    미래에 내가 또 어느곳에 가서 코드를 수정해 주고 있을지 모르나

    그분들의 코드가 조금은 수정하기 쉽게 만들어지길 바라는 조그만 소망으로 이글을 적어본다.

    clip_image001

    그림은 일반적으로 쉽게 볼수 있는 형태이다.

    여기서 좌측에 있는 label1,2,3에대가 1,2,3을 대입해 보도록 하자.

    그러기 위해서 저 라벨을 포함한 컬랙션에서 끄집에 내면 될것이다.

    foreach (Control x in this.Controls )

    처럼 적게되면.. 폼에 포함된 모든 컨트롤을 가져오게 된다.

    예를 들어서

    clip_image002

    이런 코드를 작성했다고 하자.

    그럼..

    clip_image003

    이런 화면이 나타날것이다.

    여기서 그룹박스에 숫자 "2"가 나오는것을 유심히 보고

    또한 그룹박스 이내에 있는것들은 아무런 변화가 없는것을

    확실히 인지하기 바란다.

    자.. 일단은 뭔가 될것 같기는 하다. 그럼 여기서 우리가 원하는 라벨에만 숫자를 생성시켜야 한다는것이 두번째 과제일것이다.

    그것은 어떻게 해야할까? 그것도 그리 어렵지 않다. 그 컨트롤이 단지 라벨인가만 확인해주면 되는것이다.

    clip_image004

    clip_image005

    여기까지 해줬음에도 불구하고 또 질문이 들어온다.

    난 위에서 부터 1,2,3을 처리하고 싶은데 어떻게 해야하냐고

    i--처럼 역순으로 해야하나고 말이다.

    이글의 앞에 컬랙션이라고 이야기 했듯이

    이 컬랙션들은 ADD형태로 내부에 사용되는 녀석들을 대입해줘야 한다.

    그 대입의 순서에 따라서 위와 같은 형태가 나타나게 되는것이다.

    clip_image006

    디자이너에 가서.. 컬랙션 대입하는곳을 찾아보자.

    clip_image007

    자 보이듯이 라벨1이 가장 늦게 들어가니 순서가 늦게 되는것이다.

    이 순서를 원하는데로 변경해 두자.

    사용하는 ADD 이런매서드로 말이다.

    clip_image008

    자 이제.. Foreach의 설명을 마칠까 한다.

    Foreach로 그룹박스안에것도 돌리기 위해서 다시금 foreach안에 또 foreach구분을 넣어서 그룹박스일때 돌려야 할것이다.

    뭐.. 그렇게 한들 어떻다고 생각한다면.. 어쩔수 없다.

    나야.. 그렇게 작성된 소스 수정한다고 또 고생길이 열리는수 밖에..

    윈폼프로그램에 빠질수 없는것이 있다면 위와같은 폼에서 입력후

    모든 입력값을 지워야 하는것이다.

    초기화란 어디가나 꼭 있어야 하는것이니 모두들 동감하리라 믿는다.

    위의 예제에서 보듯이 그룹박스내에 포함된 택스트 박스는 foreach만으로는 초기화가 되지 않을것이다.

    그럼 어떻게 해야 하는가? 바로 그 두번째 방법을 사용해야될것같다.

    뭐 대단한 방법이라고 기것해봐야 재귀호출일뿐인데 말이다.

    코드는 두어줄이라서 설명할것이 없다만

    그래도 모르겠다면 질답란에 적어두면 누군가 상세히 설명을 해줄것이다.

    함수는 이것이고

    private void getControls(Control.ControlCollection Ocontrol, ref ArrayList Space)

    {

    for (int i = 0; i < Ocontrol.Count; i++)

    {

    Space.Add(Ocontrol[i]);

    if (Ocontrol[i].Controls.Count > 0) getControls(Ocontrol[i].Controls, ref Space);

    }

    }

    호출은 이렇게 하자.

    ArrayList AL = new ArrayList();

    getControls(this.Controls , ref AL);

    for (int i = 0; i < AL.Count; i++)

    {

    if (AL[i] is TextBox)

    ((Control)AL[i]).Text = "초기화";

    }

    자 이렇게 하면 결과는..?

    clip_image009

    그룹박스 안에 있는것까지 깔끔하게 처리가 된다.

    이럼에도 시비(?)를 거는 친구들이 가끔 있을듯 해서

    조금 더 복잡하게 만들어서 테스트를 해보자.

    clip_image010

    아주 가볍게 처리가 되지 않는가?

    폼에.. 탭에.. 패널에 그룹박스에 다시 그룹박스에 탭에 등등

    을 해도 잘 처리가 된다.

    참고로.. 귀찮아서 적지는 않았지만..

    this.Controls["textBox1"].Text = "ddd";

    이런식으로 사용하거나 또는 find를 가지고 바로 컬랙션안의 포함된 컬랙션내부 개체를 억세스 하거나

    하는 방법이 있다.

    this.Controls[0].Text = "ddd";

    문제는 이건 적을만한 수준이 아니란 거다..

    이렇게 쉽게(?) 적었는데도 모르겠다면. C#책에서. Collection 에 대해서 공부해 보길 권한다.

    ps) 노파심에 끄적이자면.. 실무에서는 이것보다는 좀 더 세련된 형태로 함수를 만들어서 사용한다.

    잘.. 다듬어서 사용하길 권한다.

    ps2) 예외 사항에 대처하는법에 대해서 몇가지 더 끄적여 보자. (댓글 덕분에 더 적어본다.)

    예외사항은.. 여러가지가 있겠는데 결론적으로 말해서 특정한 녀석만 위의 루틴이 돌아갈때 처리가 되지 않아야 된다는 이야기다.

    만약 그런것이 아주 많다면..  IF를 이용해야 겠지만.

    하나 둘의 경우 Find를 사용해 주는게 좋다.

    강좌를 적고 이미 이 프로젝트를 날린 입장이라.. 예제를 더 못 보여주는것은 아쉬우나.

    --> this.Controls.Find("textBox1", true);

    이런형태를 통해서 대부분 예외를 처리하는걸로 알고 있다.

    여기서 핵심은 뒤에 true 를 주는것이고 내부적으로(c#)에서 재귀호출함수를 이용해서 컬랙션개체 안에 있는것들까지

    찾아서 그 인스턴스값을 돌려준다. 단지 문제는 귀찮게도 control[] 배열로 돌려준다는것이긴 하지만..

    그래서 개인적인 입장에서는 앞에서 만든 ArrayList 에서 특정값을 제거한다. remove 를 통해서 돌아야 하는것중

    예외사항을 제거하고 돌린다.

    위의 재귀호출함수는 이해를 위해서 3줄로 작성되어 있지만.. 실제적으로 사용하고 있는것은.. 함수가 아닌 클래스로

    대략.. 30댓줄의 몇몇개의 기능이 추가되어 있다. 귀찮게 arraylist를 선언하지도 않고.. 이런 예외를 편하게 제거하도록 말이다. 개인적 취향에 맞도록 잘 만들면 되지 않을까 한다.

    ps3) 댓글의 관심에 감사함을 전한다.

'C# > 일반적인코딩' 카테고리의 다른 글

ListView에서 Drag &amp; Drop  (0) 2008.12.29
C#의 Setting Class  (0) 2008.11.22
시리얼 장비 통신에 대한 짧은 이야기  (0) 2008.11.21
posted by 삶의여유로움
:
C# DB 코딩 강좌 2008. 11. 14. 21:45

     

    휴~~~~~~~~

    여기까지가 데브에 적은 마지막 강좌이다.

    21편부터는 블러그에 먼저적게 될듯 후후..~~ 힘들다 자료 옮기기..

     

    //----------------

    자 이번에는 아주 단순한 그리고 정말 단순한것을 해보자.

    우리는 코딩을 하면서 어디서나 빠지지 않는 초기화와 입력값을 다 입력한 뒤에 엔터를 치면 다음 컨트롤로 가는 코딩을 처리하게 된다.

    이것은 일반적으로 너무 단순한것이라 문제이다.

    왜냐면 이게 단순하므로 대부분의 사람들은 이것을 코딩으로 처리하지 않고 일일이 마우스로 눌러서 이벤트 코드가 자동으로 만들어진 상태에서 적기 때문이고 겨우나마 조금 개념이 있는 프로그램머의 경우 델리게이트로 하나의 매서드로 모을수 있다는것을 알고 여러 컨트롤을 선택한 다음 키 다운 이벤트에다가 넣어주곤 한다.

    하여간 이렇게 단순한것을 코딩하는데 시간을 소비하게 되는데 아주 코딩이란것을 처음 접하는 사람이 문제이다. 정말 순진무구하고 또한 열성적으로 100개의 컨트롤이 있으면 100번 적어준다는게 문제이다. 아마도 그분도 for 문을 배웠겠지만 당장 업무가 그러할진데 어떻게 하겠는가.

    내가 이글을 적으면서도 위의 사실이 거짓말같은 생각이 들정도로 열성적으로 코드를 만들었더랬다.

    한번은 내가 가서 이렇게 하면 된다고 슬그머니 알려준적도 있는데 자신이 아는길 이외에는 하고 싶지도 않은듯 오로지 무지막지하게 코드를 증가시키는 분이 있었다. 그분의 여러코딩까지 합쳐서 폼클래스에서만 전체코드만 이만줄이 넘었더랬다.

    나중에 내가 수정하는것도 보통애먹은게 아니였는데 이미 그렇게 적은 코드를 아래와 같이 바꾸는게 쉽지 않기 때문이다.(이유는 실무에서 당해보면 안다.)

    이미 아래의 방법은 널리고 널린 수준의 형태이나 아직도 사용하지 않는이가 많은듯 해서 예제를 만들어 보았다.

    단순예를 들어보자.

    clip_image001

    이것은 방금만든 클래스인데.. 엔터를 치면.. 위의 생성한 이벤트가 실행될것이다.

    폼의 시작시에

    clip_image002

    이렇게만 적어주면 이제 어떤 택스트박스를 가져다 놓고 엔터를 쳐도 무관하다 당연히 기존의 이벤트와도 무관할것이다.

    clip_image003

    대규모 테스트를 위한 상황을 만들어 보자.

    우리는 일반적으로 각 컨트롤마다 있는 Tab Index를 이용하게 되는데 탭을 치면 자동적으로 다음값으로 이동한다.

    이것은 Control클래스에 기본속성으로 상속이 되어 있다

    간단하지 않은가?

    엔터키를 칠때 다음으로 이동하는 코딩은 그야말로 VB6.0부터 애용되는 방식이 있다.

    clip_image004

    이렇게 적어주면 된다.

    조금 c#적으로 한다면..

    clip_image005

    이런 방식도 있겠다.

    엔터를 치면 띵하고 소리가 나는데 이 소리에 상당히 거슬려 하는경우가 많다. 그러므로 이것을 없게 해주면 된다. 어떻게 할까?

    간단하다. 키를 전달하지 않으면 되는것이다. 예전 vb쪽에서는 Keycode = 0를 대입하거나 해서 엔터키가 아닌것으로 처리하기도 했다.

    객체지향의 유리한점은 객체에 모든게 있지만… 단점은? 사용자가 그 속성을 안써보면 잘 모른다는것이다.

    e.SuppressKeyPress = true;

    이렇게 한줄만 적어줘도 알아서 처리가 된다. 말그대로 키값을 억압하는것이다. VB6의 코딩에 익숙하다면..사실상 C#도 상당히 유사한게 많다.

    clip_image006

    이런 기초적인것들이 대부분 알고 있음에도 잘 공개하질 않는다. 아님 잘 찾아보질 않거나

    덕분에 이런질문류도 여전히 질답란을 종횡무진하고 있다.

    이렇게 단순하게 택스트 박스만 소스를 적어 놓았다고 아무생각없는 사람들이 저기 있는듯 싶다.

    당신의 갈길은 아직 멀다. 정말 이것은 간단하면서도 좋은 코드들이지만 택스트박스가 멀티라인이라면 어떻게 할것인가? 또는 콤보박스에도 포커스를 맞추어야 하고

    여러가지 추가할것들이 분명 많다. 위의 코드에 빈곳이 보이지 않는가?

    그리고 공개해 보라.~~ 나도 배우고 싶다.

    두번째로 초기화가 되겠다.

    clip_image007

    초기화 별게 있는가? 위에서 잠시말했듯이 초기화와 엔터키이동들은 반드시 열외되는것을 지정하는 방법이 있어야 한다. 그것은 당신을 믿겠다.

    초기화도 당신이 충분히 할 수 있을것이다. 그저 위의 클래스에 적당히 하나 추가해주자.

    이제 소스를 적지 않아도 될 수준까지 충분히 foreach 의 구문에 익숙해 졌다고 생각한다.

    택스트 박스 초기화 / 콤보박스 초기화 / DataView 초기화 등등말이다.

    AllClear같은건 위의걸 한번에 호출해주면 될것아닌가.

    당신의 댓글로 소스를 한번 달아주는것은 어떨까?

    원본 위치 <http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=18&MAEULNO=8&no=1606&page=1>

'C# DB 코딩 강좌' 카테고리의 다른 글

C#을 이용한 DB코딩 21  (0) 2008.11.19
C#을 이용한 DB코딩 19  (0) 2008.11.14
C#을 이용한 DB코딩 18  (0) 2008.11.14
C#을 이용한 DB코딩 17  (0) 2008.11.14
C#을 이용한 DB코딩 16(실습파일포함)  (0) 2008.11.14
C#을 이용한 DB코딩 15  (0) 2008.11.14
C#을 이용한 DB코딩 14  (0) 2008.11.14
C#을 이용한 DB코딩 13  (0) 2008.11.14
C#을 이용한 DB코딩 12  (0) 2008.11.14
C#을 이용한 DB코딩 11  (0) 2008.11.14
posted by 삶의여유로움
: