퇴근5분전

 

바로가기 아이콘 만드는 프로그램.   

JSFW_Shortcut.zip

 

 

컨셉은 조금 다르다. 백업프로세스?를 가진 프로그램에 연결하는 바로가기 프로그램이다.

 

# 바로가기 생성

    : 바로가기 실행 프로그램을 띄우고 파일을 드래그 드랍 한다.

    : 바로가기가 바탕화면에 생성된다.

 

 

# 바로가기 실행

       : 파일(문서 : 엑셀, ppt, .txt.... )을 열때 생성된 바로가기를 이용해 연다.

       : 파일이 백업된다. ( 일자별로 1회 백업된다. )

       : 문서 편집기가 실행된다.

 

만화책 보기 프로그램

- 새로만든 JSFW_SlidePanel 을 이용!

아 덥다!

 

버튼도 아무것도 없다. 거추장 스러워서 모두 빼고 떨렁 판넬만 있다.

 

prev : left, up

next : right, down, enter, space

delete : esc 

 

파일은 드래그 드랍에서 모두 받는다.

이미지파일, zip파일, 디렉토리

 

zip파일은 특정 폴더에 체크후 푼다. 있으면 디렉토리의 파일들을 가져온다!

 

 

 

 

 

Slide 컨트롤이 바인딩 될것이 많을때 너무 느려짐. 판넬을 개체수 만큼 생성 후 이동시켜서 그런것 같아서

다시 만들었다.

 

 

 

위 처럼 컨텐츠 이동 판넬은 3개만 만들고 보여지는 위치 바꾸면서 새 컨텐츠를 끌어올린다.

 

Top(Left), Center, Bottom( Right) 세개의 판넬이 있다.

데이타 리스트는 개체수 만큼 많이 생성이 가능하고.

 

up > 일단 세개의 판넬을 각각 판넬 1개분 정도로 이동(위로) 다 올라갔을때

제일 위에 판넬을 가장 하단으로 이동하고 하단에 위치할때 새 컨텐츠를 하단에 등록.

 

반복...

 

down은 up과 반대로 우선 아래로 끌어내리고, 가장 아래 있는 판넬을 제일 위로 올려주고

컨텐츠 할당.

 

적어도 이동이 느려지는 현상은 없어졌다.

 

다만 만화보기 프로그램에서 메모리 오버플로우가 뜨더라..

 

JSFW_CarrierManager<T> 로 만들어서  T에 Image를 만들어줬더니 ...

 

이 판넬을 만든 이유는 프로젝트 디자이너의 주 Edit 판넬로 사용하기 위해서...

 

기존에 슬라이드라고 만들었던 컨트롤들은 모두 삭제처리하고 이걸로 대체하였다.

 

 

------------------------------------------------------------------------------------------- 다시 만듬. 8.1

 

프로젝트 판넬을 만들기 위해 UI 컨트롤을 하나 더 만들었다.

이전에 만들어둔 이미지 슬라이더 말고... Win8 메트로 UI 따라해본다고 만든 컨트롤 데모를 정리해서 컨트롤화 하였다.

 

이 판넬은 프로젝트들은 V스크롤 시켜주고

프로젝트 내에 UI, Model, 등등.. 은 H스크롤 시켜주려고 만든것이다.

 

스샷으로 찍으려니 .. 쩝.. A ~ F까지의 판넬이 있고

표시자가 갯수만큼 늘어난다.

H, V는 슬라이드 이동 방향이다. 가로 세로.

A에 있을때 F까지 누르면 하나씩 차례로 F까지 흘러간다.

 

http://aseuka.tistory.com/entry/판넬-이동-슬라이드-처리

 

이것 말고도 슬라이드라고 붙은걸 더 만들어놨었넹...

 

 

 

 

 

 

 

 

 

 

 

  원래의 이벤트 프로세스 처리와 동일하게... 모방!

 

 

public partial class DesignItem_Button : DesignItemBase, IConvertTarget
{

        void button1_Click(object sender, EventArgs e)
        {
            ClickTrigger();
        }

    

        [MethodInvoke]
        public void ClickTrigger()
        {
            this.Call(DesignItem_EventManager.EventButtonConst.Event_Click);  
        }

        . . .

}

 

 

public partial class DesignItem_TextBox : DesignItemBase, IConvertTarget, IBindControlAndField
{

        void textBox1_TextChanged(object sender, EventArgs e)
        {
            MI_TextChanged();
        }

 

        [MethodInvoke]
        public void MI_TextChanged()
        {
            this.Call(DesignItem_EventManager.EventTextBoxConst.Event_TextChanged);
        }

        . . .

}

 

위 두 디자인 컨트롤이 배치되었을때!

 

designItem_Button1.EM.AttachEvent(

       DesignItem_EventManager.EventButtonConst.Event_Click,

       designItem_TextBox1.EM.GetMethod("MI_TextChanged"));

 

이렇게 이벤트와 메서드를 묶어줄수 있다.

 

버튼이 클릭했을때! TextBox의 MI_TextChanged 를 호출하면서 연계 호출을 꾀할 수 있다.

 

디자이너에서 많은 기능을 구현하고자 하는 것이 아니므로!!

 

위 연결을 UI를 만들어서 맵핑시켜주는 일을 하고 테스트 하면 ... 디자인을 마치고 바로 시뮬레이션이 가능할 것 같다.

 

 모델도 만들어뒀으니... 

모델은 디자인 중에서 필요한 데이타를 직접 모델에 넣을수 있도록 UI를 꾸며야 겠다. 그렇게 해서

UI 설계가 끝나면 해당 모델을 가지고 DB 스키마까지도 얻어낼수 있을테니까...

 

 

 

 

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

PRJMNG] Image Viewer (만화책 보기... )  (0) 2014.08.01
PRJMNG] SlidePanel 컨트롤!  (0) 2014.07.29
PRJMNG] 컨트롤바인딩을 모델로 바꿈.  (0) 2014.07.21
PRJMNG] Object Relation  (0) 2014.07.17
Designer 리뉴얼...  (0) 2014.07.14

 

 

 디자인을 위한 컨트롤에 대한 기본 값들을 sp에서 모델로 바꾼 후 일일이 테스트 한 화면임.

모델의 각 필드에 대하여 컨트롤과 맵핑.

컨트롤에서 모델을 이용해서 값을 필드에서 가져오거나 내보내기가 가능함.

그리드나 콤보는 모델과 직접 바인딩 가능하다.

 

 

시뮬레이션을 위한 컨트롤들의 각 이벤트에 대한 메서드 맵을 구현중에 있는데...

고려할게 좀 있네.

  - 각 컨트롤 마다 기본 이벤트 목록을 만들고 처리를 위한 메서드를 만들어준다.

  - 타 컨트롤에서 다른 메서드를 호출가능하도록 만든다.

 

  버튼.클릭 ----> 그리드.조회();  이런 형태로 호출.

 

textBox.TextChanged ----> 그리드.조회(); 또는 Form.Clear();

 

이런 이벤트와 메서드 목록을 만들어서 추가하고. 디자인모드와 런타임 모드는 구분해놨으니 런타임에서는 디자인에서 지정한 이벤트에 연결된 메서드들이 각각 호출되며 실행되면 된다.

 

 거의 다 온듯 하다.. 알고리즘 공부해야되는데... 쩝... 기술사 책을 절반도 못봤넹. IT 미래가 있으려나...

 

 

 

 

 

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

PRJMNG] SlidePanel 컨트롤!  (0) 2014.07.29
PRJMNG] 디자인목업에 이벤트와 핸들러!  (0) 2014.07.22
PRJMNG] Object Relation  (0) 2014.07.17
Designer 리뉴얼...  (0) 2014.07.14
Tree Grid] JSFW_GRID_TREE  (0) 2014.07.13

 

 

음 블로그에서 찾아도 안보여서... 올린다.

이건 화면의 프로세스 및 이동관련 다이어그램 간단히 그려볼때 사용할수 있다.

일일 ppt도구로 가져다 놓고 수정하기보다

 

대부분 끌어다 놓거나 더블클릭하면 된다.

사용하는 DB도 설정 가능한데...

추후에 디자이너와 병합하기 위해 DB설정은 Model 정의로 변경해야 하므로...

소개는 패쓰..

 

각 유닛간에 그려진 선을 이용하게 되면 페이지 간에 이동흐름도 쉽게 파악할수 있다

상세보기창에서는 직접 해당 커맨드를 누르면 연결지점까지 이동한다.

 

각 라인에 맞춰 IO파라미터 까지도 설정이 가능하다.

 

 

 

 

# 디자이너

  - 디자이너를 또 엎자!

 

 - 기능 추가

. 컨트롤별 Event 연계 ( 시뮬레이션 기능 )

. 테마

. Procedure > 모델로 변경.   ( Procedure > 모델변환 > 컨트롤 바인딩 )

. 특정 프레임웍에 맞춰진 코드 변환 엔진 수정. ( 기본컨셉대로... 멀티 프레임웍 지원 )

 

 

 

 Source Grid 를 이용해서 JSFW_GRID 를 만들어 사용중이었는데,

Tree를 추가했다.

 

 

 

ID 컬럼, PID 컬럼 은 필수!

 

jsfW_GRID_TREE1.IDColumnName = "ID";
jsfW_GRID_TREE1.PIDColumnName = "PID";

 

이렇게 컬럼 정보 셋팅 중에  지정해줘야 함.

반드시 ID와 PID 로 지정할 필요는 없음.

 

 

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

PRJMNG] Object Relation  (0) 2014.07.17
Designer 리뉴얼...  (0) 2014.07.14
PRJMNG] 폼 양식 디자이너 ( 개발 실패! )  (0) 2014.03.09
PRJMNG] 바로가기, 파일열기, 백업  (0) 2014.02.04
PRJMNG] Project Manager Update  (0) 2014.01.26

 

 

 이번 프로젝트에서 ExtJs 디자이너로 화면을 만들어 놓은것을

Ext.Net에 맞춰 변환 하는 프로그램을 만들면서 살짝 이력을 남겨본다.

 

# 정보수집..

1. 자바스크립 Object 구성으로 만들어진다. composite!

2. 그렇다면 트리 구조로 데이타를 추적할수 있다.

3. 문자열 > Object 변환이 필요하다. json으로 되는지 보자.

4. 각 프로퍼티에 대응하는 object 프로퍼티 맵을 어떻게 구성해야 하는지.. 고민해봐야 한다.

5. 기간! 주어진 시간이 짧기에 [ 변환 소스 만드는 시간 = 손으로 바꿔야 하는 시간 ] 이 쌤쌤이어야 한다.

 

! 정보수집 된 내용을 기반으로 머리속에서 프로그램이 동작하는 부분들을 미리 이미지화 한다.

 

# 제작..

   쿵짝 쿵짝.. 만드는데 3시간, 테스트 3시간!!

# 결과

   OK! 소스 변환까지는 금방 완성이 되었는데... 다른 일들이 껴들어와서 누적시간이 더 걸렸음.

         테스트 할때는 실제 변환해서 화면에 뿌려보니 디자이너로 제작한 내용과 다른 부분들이 존재하여

         추적하여 디버깅하였음.

         리플렉션 + 대리자를 이용! 소스가 엄청 짧고 간단한다.

 

# Hint!

  소스 라인은 833 라인!으로 ExtJs의 필요한 부분들을 최대한 필요한 만큼 수용한 변환 툴 완성!

 

 - 사용된 디자인 패턴 : Visitor [ 역시 타입별로 대응해서 뭔가 처리 하고자 할때 ... 좋음. ]

 

# 변환기 호출 처리 로직

1.

string                                                    // 변환된 문자열

ToConvert (

            EXTNETBASE ex,                         // 변환 대상

            int depth,                                            // 현재 깊이

               Func<EXTNETBASE, int, string> Fn // 변환기

2.

Func<EXTNETBASE, int, string>                     // 타입에 맞는 변환메서드

GetConvert(

           string xType                                // 타입

)

3.

string                                                   // 타입에 맞는 변환 결과

ToContainer(

           EXTNETBASE ex,                         // 변환 대상

           int depth                                    // 깊이

)

 

기본 흐름은 위처럼 변환대상에 대해 시작하면(ToConvert) 해당 타입을 변환 할 수 있는 메서드를 꺼내서(GetConvert)

변환(ToContainer)

 

 

    public interface IVisitor
    {
        string Visit(IAcceptor act);
    }
    public interface IAcceptor
    {
        EXTNETBASE GetInstance();
        string Acceptor(IVisitor visit);
    }

 

  이번에 개발하면서 대리자+ 리플렉션 이용해서 소스를 줄이고 시간을 벌었다. 

 

// extjs 의 문자열들을 object 트리 구조로 변환 시켜줌 ( Json이용 )

EXTNETBASE m = JsonConvert.DeserializeObject<EXTNETBASE>("    extjs design source  ");

 

// 트리구조의 object를 비지터로 모두 순회 하면서 각 타입별로 변환 시킴.

ExtNetConverter vis = new ExtNetConverter();
string s = m.Acceptor(vis);

 

// Object

public class EXTNETBASE : IAcceptor
{

        public Collection<EXTNETBASE> items { get; set; }

        public string Id { get; set; }
        public string name { get; set; }
        public string xtype { get; set; }

   
        . . .

          
        public string Acceptor(IVisitor visit)
        {
            return visit.Visit(this);
        }

        public EXTNETBASE GetInstance()
        {
            return this;
        }
}

 

public class ExtNetConverter : IVisitor
{
        public string Visit(IAcceptor act)
        {
            EXTNETBASE cont = act.GetInstance();
            return ToConvert(cont, 0, GetConvert(cont.xtype));
        }

       

        // 탭의 깊이만큼 생성 반환!

        static Func<int, string> Tab = (depth) => { return new string('\t', depth); };

 

        // 구조의 깊이를 추적할수 있는 대리자.

        static Func<EXTNETBASE, string, int, int> CalcMaxDepth = (ext, collectionPropertyName, depth) => {

            // todo : 트리구조이므로 깊이를 추적함.

            PropertyInfo collectionProperty = ext.GetType().GetProperty(collectionPropertyName, BindingFlags.Public | BindingFlags.Instance);
            if (collectionProperty != null)
            {
                Collection<EXTNETBASE> coll = collectionProperty.GetValue(ext, null) as Collection<EXTNETBASE>;
                if (coll != null)
                {
                    int maxChildDepth = 0;
                    int temp = 0;
                    foreach (var item in coll)
                    {
                        temp += CalcMaxDepth(item, collectionPropertyName, depth);
                        if (temp > maxChildDepth) temp = maxChildDepth;
                    }
                    depth += maxChildDepth;
                }
            }
            return depth;
        };

 

       string ToConvert(EXTNETBASE ex, int depth, Func<EXTNETBASE, int, string> Fn) {

 

            // todo : 객체별 변환메서드를 호출하며, 탭으로 서식 유지 시켜 보기 편하게 만듬.
            string result = Tab(depth) + (Fn != null ? Fn(ex, depth) : "@*## Convert미지원 " + ex.xtype + " ##*@");
            if (ex.items != null && ex.items.Count > 0)
            {
                result += ".Items(" + Environment.NewLine + string.Join(","+Environment.NewLine, ex.items.Select(s =>

                                           ToConvert(s, depth+1, GetConvert(s.xtype))).ToArray());
                int itemDepth = CalcMaxDepth(ex, "items", depth);
                result += Environment.NewLine + Environment.NewLine + Tab( itemDepth ) + ")";
            }

            if (ex.dockedItems != null && ex.dockedItems.Count > 0)
            {
                result += ".DockedItems(" + Environment.NewLine + string.Join("," + Environment.NewLine, ex.dockedItems.Select(s =>

                                          ToConvert(s, depth+1, GetConvert(s.xtype))).ToArray());
                int dockedItemsDepth = CalcMaxDepth(ex, "dockedItems", depth);
                result += Environment.NewLine + Environment.NewLine + Tab(dockedItemsDepth) + ")";
            }

            if (ex.gridcolumns != null && ex.gridcolumns.Count > 0)
            {
                result += ".ColumnModel(" + Environment.NewLine + string.Join("," + Environment.NewLine, ex.gridcolumns.Select(s =>

                                          ToConvert(s, depth+1, GetConvert(s.xtype))).ToArray());
                int columnModelDepth = CalcMaxDepth(ex, "gridcolumns", depth );
                result += Environment.NewLine + Environment.NewLine + Tab(columnModelDepth) + ")";
            }
            return result;
        }

 

        Func<EXTNETBASE, int, string> GetConvert(string xType)
        {

            // todo : 각 타입별 변환 메서드 반환

            switch (("" + xType).ToLower())
            {
                default:
                    return new Func<EXTNETBASE, int, string>((e, i) => { return @"@*"+xType+"*@"; });
                case "container":
                    return ToContainer;

                case "textfield":
                    return ToTextfield;

                case "textareafield":
                    return ToTextareafield;

              

                ... 각 타입별 변환 메서드!

           }

       }

 

        string ToContainer(EXTNETBASE ex, int depth)
        {
            string content = "X.Container()";
            content += GetCommonConvert(ex);
            return content;
        }

 

        string GetCommonConvert(EXTNETBASE ex, string opt = "")
        {

               // todo : 객체들 공통프로퍼티 변환목록을 묶어서 진행.

         }

 

         private static string GetPropertyConvert(EXTNETBASE ex, string propertyName, string opt = "")
        {

                // todo : Js변환 대상 프로퍼티 -> Net 변환

        }
        // 이후로는

        // 20여개의 변환 메서드

        // 15개 정도의 프로퍼티 변환처리.

}

 

 

LCD 숫자 표기.

 

사진 처럼 각 숫자의 digit table을 만들어서  ...

 

전에 FND 그려본적이 있어서 그리는건 문제가 안되는데...

 

다만. 동적으로 늘고 줄고 하는 것처럼 책에 있다.

 

 S + 2열, 2S + 3행

예제는 S = 2일때 3일때를 표시하고 있는데...

내가 푼방법에는 안맞는것 같넹...

 

풀이를 살펴봐야겠다.

 

 

'# 1) 프로그래밍 > 프로그래밍챌린지' 카테고리의 다른 글

Chapter 01. Q3. 여행... ㅡ.,ㅡ?  (0) 2014.07.04
Chapter 01. Q2. 지뢰찾기  (0) 2014.07.02
Chapter 01. Q1. 3n+1  (0) 2014.07.01
시작하며...  (0) 2014.07.01