퇴근5분전


필요해서 만들어두었던 객체 하나를 까먹고 있었다. 왜만들어놨지 라는 의문에 쌓였던...

JsFW.Xml.ListMng<T> 라는 기본타입..
제너릭을 이용한 리스트관리였던것...

본래 취지가 기억이 안나는 ㅡ.,ㅡ;;; 그런 객체인데.. 음... Insert, Update, Delete가 protected internal로 되있는거 보면..

새로운 관리 객체로 만들어 사용하도록 만든거였는데 직접 구현해보니... 먼가 빠진듯 한데... 쩝!!


1. 기본 xml클래스 정의

 [JsFW.Xml.XmlRoot_Tag("AA"), JsFW.Xml.XmlElement_Tag("DD")]
    public class AA : JsFW.Xml.JsFWXmlBaseObject
    {
        string _TA = string.Empty;

        [JsFW.Xml.XmlATT_Tag]
        public string TA
        {
            get { return _TA; }
            set { _TA = value; }
        }
    }

2. 리스트로 관리할 객체 재정의 
 public class AAList : JsFW.Xml.ListMng<AA>
    {
        public AAList() : base(@"D:\ttt\","test.xml",  typeof(AA).Name )
        {}

        public void Add(AA a)
        {
            base.Insert(a);
        }
      
        public void Remove(AA a)
        {
            base.Delete(a);
        }

        public override string ToString()
        {
            return base.ToString();
        }
    }



3. 리스트 사용!!
            AAList alst = new AAList();
            alst.Add(new AA() { TA = "OA" });
            alst.Save();


결과

<?xml version="1.0" encoding="utf-8" ?>
- <AA ID_IDENTITY="6">
  <CC _XID="1" TA="A1" />
  <CC _XID="2" TA="up1" />
  <DD _XID="3" TA="A1" />
  <DD _XID="4" TA="A1" />
  <DD _XID="5" TA="A1" />
  <KK />
  <DD _XID="6" TA="OA" />  입력 잘되었다!!  
  </AA>





* 참고 :  JsFW.Xml.XmlElement_Tag("DD") <-- 지정되있으므로 해당 갯수만큼만 나옴 위에 xml에서 총 4개의 Element가 로드되고 아래 소스에서 1번 index를 삭제함. 

            AAList alst = new AAList();
            alst.Remove( alst.DataSource[ 1 ]);
            alst.Save();

삭제 결과

<?xml version="1.0" encoding="utf-8" ?>
- <AA ID_IDENTITY="6">
  <CC _XID="1" TA="A1" />
  <CC _XID="2" TA="up1" />
  <DD _XID="3" TA="A1" />
<DD _XID="4" TA="A1" /> <-- 삭제된 Element
  <DD _XID="5" TA="A1" />
  <KK />
  <DD _XID="6" TA="OA" />
  </AA>







 


xml관련해서 만든 dll을 이용해서 간단한 예제를 만들어본다.

잠깐 써봤던거라 예제 만들려고 하니 삽질은 필수였다.

xml파일로 만드는 방법은 두가지가 존재한다.

1. JsFW.Xml.XmlHelperClass 를 이용해서 직접 각 엘리먼트로 변환 하는 방법.

2. 클래스를 정의해서 JsFW.Xml.XmlClassForFileMng 로 관리 하는방법.


__1번으로 해보자. 

JsFW.Xml.XmlHelperClass hlp = new JsFW.Xml.XmlHelperClass(@"D:\ttt\test.xml");
            JsFW.Xml.XmlElmt kk = new JsFW.Xml.XmlElmt("KK");
            kk.Att_Add("_XID", "100");
            kk.Att_Add("JJJ", "212121212121abc");

            hlp.Root_XmlElmt.ElmtAdd(kk);
            this.textBox1.Text = hlp.ToXml(); // Xml형태로 변환하여 반환함.
            hlp.Save(@"D:\ttt\test.xml");

        ** 기본 xml 파일이 존재하여 위처럼 구현되며 신규파일로 작성시 

            JsFW.Xml.XmlHelperClass hlp = new JsFW.Xml.XmlHelperClass();
            hlp.Root_XmlElmt = new JsFW.Xml.XmlElmt("Root");
            hlp.Root_XmlElmt.Att_Add("_XID", "0");
JsFW.Xml.XmlElmt kk = new JsFW.Xml.XmlElmt("KK");
            kk.Att_Add("_XID", "100");
            kk.Att_Add("JJJ", "212121212121abc"); //수정도 Add로 한다. 있으면 수정, 없으면 추가!!
            hlp.Root_XmlElmt.ElmtAdd(kk);
            this.textBox1.Text = hlp.ToXml();
            hlp.Save(@"D:\ttt\test1.xml");   

로 작성이 된다.
결과 : 

<?xml version="1.0" encoding="utf-8" ?>
- <Root _XID="0">
  <KK _XID="100" JJJ="212121212121abc" />
</Root>



__2번으로 작성해보자.  

1단계 :  클래스 선언
    [JsFW.Xml.XmlRoot_Tag("AA"), JsFW.Xml.XmlElement_Tag("DD")]
    public class AA : JsFW.Xml.JsFWXmlBaseObject
    {
        string _TA = string.Empty;
        [JsFW.Xml.XmlATT_Tag]
        public string TA
        {
            get { return _TA; }
            set { _TA = value; }
        }
    }

JsFW.Xml.XmlClassForFileMng mng
= new JsFW.Xml.XmlClassForFileMng(@"D:\ttt\", "test.xml", typeof(AA));
           mng.Load();   
            AA a = new AA();
            a.TA = "A1";         
            mng.Add(a);
            // 수정시  : _XID 가 2인것을 찾아서 객체변환을 함.
            //AA b = JsFW.Xml.XmlTransform.Get_ElmtToObject(mng["2", typeof(AA)], typeof(AA)) as AA ;
            //b.TA = "up1";
            //mng.Update(b);  // 수정.
            mng.Save();

결과 :
 * 참고 : CC, DD , KK는 각각 XmlElement_Tag 를 바꾸어 추가를 해서 바뀌어 있음.
<?xml version="1.0" encoding="utf-8" ?>
- <AA ID_IDENTITY="5">
  <CC _XID="1" TA="A1" />
  <CC _XID="2" TA="up1" />   <!-- 수정된 Element  -->
  <DD _XID="3" TA="A1" />
  <DD _XID="4" TA="A1" />
  <DD _XID="5" TA="A1" />
  <KK />
  </AA>

'# 9) My Program(.NET) > JsFW20' 카테고리의 다른 글

JSFw20.Win.Controls에 BaseForm이용하기..  (0) 2010.05.26
JsFW20.XML 을 이용한 예제 2  (0) 2010.05.24
JsFW20를 이용한 DB Select.  (0) 2010.05.22
JsFW20 설치하기...  (0) 2010.05.22
NetWork 2010 0511  (0) 2010.05.12


* JsFW20을 설치 후 가능함.


1. 프로젝트를 생성한다.

2. 프로젝트 참조경로에 JsFW20 설치된 폴더를 추가해준다.
  기본 : 프로그램폴더\JsFW20Dll\

3. 응용프로그램설정( app.Config )파일 추가

4. DB연결에 필요한 App.Config를 추가 후 


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="Server" value="서버명"/>
    <add key="DataBase" value="데이타베이스명"/>
    <add key="Uid" value="아이디"/>
    <add key="Pwd" value="패스워드"/>
  </appSettings>
</configuration>

으로 설정해준다.

5. JsFW.ADONET에 DataBase_Business 객체를 재정의 함.

    public class Table_1 : JsFW.ADONET.DataBase_Business
    {
        public override DataSet List(JsFW.BasicObjects.IUniDataParameter iDataPrms)
        {
            return ExcuteDataSet("Select * From Table_1", CommandType.Text, new SqlParameter[0]);
        }
    }

 * 현재 DataBaseBusiness 에  List, Insert, Update, Delete 가 public으로 가상 메서드로 잡혀있다.
이를 재정의 해서 업무비지니스에 맞춰 재정의하거나 Execute**** 메서드등을 이용해서 메서드를 구성하면 된다. 
도움말 chm 참조!!

결과 스샷!



간단한 Select 코드 전문.


    Table_1 db = new Table_1();
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            dataGridView1.DataSource = db.List(null);
            dataGridView1.DataMember = "table";
        }
    }

    public class Table_1 : JsFW.ADONET.DataBase_Business
    {
        public override DataSet List(JsFW.BasicObjects.IUniDataParameter iDataPrms)
        {
            return ExcuteDataSet("Select * From Table_1", CommandType.Text, new SqlParameter[0]);
        }
    }

 










'# 9) My Program(.NET) > JsFW20' 카테고리의 다른 글

JsFW20.XML 을 이용한 예제 2  (0) 2010.05.24
JsFW20.XML을 이용한 예제.  (0) 2010.05.24
JsFW20 설치하기...  (0) 2010.05.22
NetWork 2010 0511  (0) 2010.05.12
WinControls 2010 0402  (0) 2010.04.03

 내가 만든 개발 프레임웍은 다시 살펴보니... 조정되어야 할게 좀 많더라!!

완벽할수 없으니 뭐... 재끼고... 

 설치는 간단하다.

설치 파일을 클릭하면... 설치된다. ( 당연한거쥐?  )



설치하면 ...

위와 같이 dll들이 설치가 된다!! 준비는 끝!!





'# 9) My Program(.NET) > JsFW20' 카테고리의 다른 글

JsFW20.XML을 이용한 예제.  (0) 2010.05.24
JsFW20를 이용한 DB Select.  (0) 2010.05.22
NetWork 2010 0511  (0) 2010.05.12
WinControls 2010 0402  (0) 2010.04.03
XML 2010 0402  (2) 2010.04.03


프로젝트가 지루해져가서 잠깐 딴짓을 해본다. 

 소요 시간 : 1시간반쯤? 기록 10분...쿵..,  
 도구 : 종이 두장. ( 낙서가 생각하는데 도움을 준다. )

 막상 글을 다 적고 보니 전공자가 아니라서 그런지 부족한게 보여도 채워넣기가 쉽지 않다.
몰라서이기도 하고, 알아야 하는것이 있음에도 그걸 익힐 시간이 만만치 않기에... (핑계~ )

제목처럼 글하나를 프로그래밍 해본다.( 조금은 복잡하게... 말이다. )

물론 저 간단한 문장을 쉽다면 아주 아주 쉽게, 어렵다면 어렵게... 상황에 맞춰서 코딩을 하겠지만...

코딩전 객체설계단계를 연습삼아.. 만들어보자! 우선은 글에서 나타난 객체들을 구상한다.

 (나) 라는 주체가 있고 (종이)와 (글)을 쓰는 (펜) 이 존재하게 된다. 


 음. 네가지의 객체가 서로 관련되어 있다. 이를 간단한 구상도( 나만에 방법 )를 그려보자.


 
음 위에 종이와 펜도 구체화 해보자.

 간단하다.   중간에 대리자나 객체 또는 인터페이스... 등등.. 선택하고 싶은걸 넣으면 된다. 

코딩에 들어가야겠지? 
굳이 대리자를 써본이유는

  public void Write(string wrMsg)
        {
            _wPen.Data = wrMsg;
            //_wPaper.Get(_wPen.Draw);  // 기본사용..

            _wPaper.Get(delegate(Graphics g) {   
                g.DrawString(wrMsg, new Font("궁서체", 20f), Brushes.Red, new PointF(10, 100));
            });
        }

이걸 기록하기 위해서다.
( 반드시 제공되는 소스대로가 아닌 취향에 맞게 변경할수도 있다는 것을 제공해주기 위한 배려?...
    : 이걸 제공함으로 원치 않은 동작이 나타날수 있으니.. 설계시 설계자의 판단에 맞겨야겠지?  )
{
 * 국어인 한글을 단어 찾아보면서 써야되겠네... 
  반드시   [부사] 틀림없이 꼭.
  반듯이   [부사] 찾아보기: 반듯하다
}
아래는 소스 전문이다.

폼에 버튼 하나 추가되있고 버튼에 Click이벤트를 추가한것 뿐이다. 

위 구성도가 있으니... 주석은 패쑤!

 public partial class Form1 : Form
    {
        Writer me = null;
        Paper paper = null;
        Pen pen = null;
        public Form1()
        {
            InitializeComponent();
            pen = new Pen();
            paper = new Paper(this);
            pen.Penfont = this.Font;
            me = new Writer( pen, paper );
        }

        protected override void OnFormClosed(FormClosedEventArgs e)
        {
            base.OnFormClosed(e);
            pen = null;
            paper.Dispose();
            paper = null;
            me = null;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            me.Write("가나다라");
        }
    }

    public class Writer
    {
        Pen _wPen = null;
        Paper _wPaper = null;

        public Writer(Pen p1, Paper p2)
        {
            _wPaper = p2;
            _wPen = p1;
        }

        public void Write(string wrMsg)
        {
            _wPen.Data = wrMsg;
            _wPaper.Get(_wPen.Draw);
        }
    }

    public delegate void Delegate_Draw(Graphics paper);

    public class Paper : IDisposable
    {
        Graphics _g = null;

        public Paper( Control ctrl)
        {
            _g = Graphics.FromHwnd( ctrl.Handle );
        }

        public void Get(Delegate_Draw toolDraw)
        {
            toolDraw(_g);
        }

        #region IDisposable 멤버

        public void Dispose()
        {
            _g.Dispose();
            _g = null;
        }

        #endregion
    }

    public class Pen
    {
        string _data = string.Empty;

        public string Data
        {
            get { return _data; }
            set { _data = value; }
        }

        Font _penfont;

        public Font Penfont
        {
            get { return _penfont; }
            set { _penfont = value; }
        }

        public void Draw(Graphics  g)
        {
            g.DrawString(_data, _penfont, Brushes.Black, new PointF());
        }
    }













 

어쨌든...  굵은 글씨를...

훈스에 김시원님이 강좌에 개나소나...로 써주셨던.. 난 몰랐던... ㅠㅠ;

찾아보니..  아래처럼 되는것? 같은... 글이었음.


 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
          

            SomeType st = 0;
            int i = st;

        }
    }

    class SomeType
    {
        object _obj = 0;

        public object Value
        {
            get { return _obj; }
          private  set { _obj = value; }
        }

        public SomeType(object obj)
        {
            _obj = obj;
        }

        public static implicit operator SomeType(int typ)
        {
            try
            {
                 return new SomeType(typ);
            }
            catch(Exception ex ) {
                throw ex;
            }

        }

        public static implicit operator int(SomeType typ)
        {
            try
            {
                checked
                {
                    return (int)typ.Value;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }
    }

'# 3) .Net ( Vs 2008 ) > C#' 카테고리의 다른 글

LINQ 그룹바이... 훌...  (0) 2010.07.30
Double.Parser()...  (0) 2010.07.19
IPC .Net ( 프로세스간 통신 )  (1) 2010.05.12
VB의 Left구현하기... 확장메서드를 이용함...  (0) 2010.02.22
기간 출력하고자 할때...  (0) 2010.02.18


참조 http://msdn.microsoft.com/ko-kr/library/system.runtime.remoting.channels.ipc(VS.90).aspx 

훈스 게시판에 몇일전부터 [프로스세간 통신(IPC)] 과 관련하여 질문이 올라오고 있었는데...

찾아보니 위 참조 링크처럼 심플한게 있다.

구현해본결과 오!! 이런게 되는구나...


서버와 클라이언트... 예제를 실행한 결과 이미지이다.

클라이언트에서 객체 요청이 있을때마다 서버에서는 원격객체에 값을 + 1 해서 전달해준다.

예제는 서버, 클라이언트, 원격객체 세 프로젝트로 구성된다.

 * 원격객체를 서버, 클라이언트에 각각 참조시켜야 한다.  
  서버에서 정의 하고 클라이언트에서 정의를 또하고 해봤는데 에러가 뜬다 공개토큰이 null이 어쩌고 저쩌고... 삽질..

예제를 올려놓는다.




미루고 미루던거 찍어냈음.

룰루.. 랄라...
문서를 좀더 보완해둬야징.. 예제 없음 나중에 답 안나오는디.. ㅋㄷ..

문서만드는 방법에 대해 씌여있던 블로그 주소도 기록해둬야겠다.

전보다 훨씬 좋은듯 한다.



 이미 블로깅 해서 그닥 쓸건 없고... ........


'# 9) My Program(.NET) > JsFW20' 카테고리의 다른 글

JsFW20를 이용한 DB Select.  (0) 2010.05.22
JsFW20 설치하기...  (0) 2010.05.22
WinControls 2010 0402  (0) 2010.04.03
XML 2010 0402  (2) 2010.04.03
Plugin 2010 0402  (0) 2010.04.03



오픈 오피스로 작성해두었던 일부이다.

서버 - 클라이언트 간 패킷 전송은 이전 글에서 처럼 CommPack이 맡아서 한다.
여기에 실제 응용에서 사용될 데이타들을 실어서 보내게 되는 개념이다.

추후에 이점으로 작용하는것은 응용프로그램 모델만 신경쓰면된다 tcpip를 래핑해두었기에
구지 통신패킷까지 재구성할 필요가 없었진다.  앞으로 추가적인 실어보내는 데이타 패킷만 만들면 된다.

 테스트용으로 문자열전송만 테스트 했으나 아주 아주 잘되기에 ...

 시간이 되면... 메신져 모델링을 해보고 위 래핑 객체를 써서 만들어보든가...


 이글을 쓰는 지금.. 또는 가끔... 내가 너무 옛날 기술들에 대해 집착하는것이 아닌가? 싶어진다.
물론 요새도 c개발자들은 일을 하고 있는데

 C#이란 언어를 하면서 보아온 잘하는 사람들을 보면 대부분 이런 구현에 치중하지 않아보인다. 물론 잘할테니까...
앞을 바라보며... 늘 앞서가는 모습들만 보게된다. 그렇다면 난 ? 언제쯤.. 앞으로도 계속 잡을수 없는가?

비전공이기에?? 이제 닉을 바꿀까? 비전공으로? 훔....

 나름 프로그래밍은 학력보다 실력이 우선시 되지 않을까 하여 기대감에 시작했는데 이래저래... 안되는것도 같고...
... 넋두리나 읊자는건 아니고.. 


지금 TCP/IP를 이렇게 만들어두는게 의미가 있는것일까? ... 자꾸 만들어놔야지 했던것을 미뤘던것도... 자꾸 이럴 필요가 있을까? 라는 의문이 자꾸 내게 들어서 였다.

WCF라는 기술이 있는데... 훔... 다음 버젼은 WCF? 하하 또 만들다 마는건가?