퇴근5분전

 

 음... DB관련 툴을 만들어보다가 판넬에 스크롤이 있을때  작은 미리보기 창이 뜨면 괜찮겠다 싶어서...

보통의 다른 프로그램들은 있으니까...

 

한번 만들어보자 싶어 구현해봤다. 퇴근해서 2시간정도씩 해서 5시간정도 해본것 같은데...

 

쉽게생각했는데... 이상하게 끝이 안맞아서... 예외처리로 끝을 맞췄다.

 

 

 현재 스크롤을 따라서 우측에 작은 박스가 이동하게 되어있다.

우측 판넬 배경은 나중에 왼쪽 판넬 배경을 캡쳐해서 배치하면 좀 더 그럴듯 하게 만들수 있겠다.

 

음... 이런 잔 기술들을 따로 모아서 영상을 만들어볼까나... 문득.. 떠올랐다.

 

[ 소스는 첨부로 숨김 ]

 

 

 

 이번 플젝에서 그리드에 다음과 같이 표시해야 할 일이 있었다.

 

시작점은 노란색 바탕인데 A타입은 제일 아래, B타입은 그 한칸 위에서 시작한다.

 

시계방향으로 숫자를 배치하면 된다.

 

  테스트 2는  시작위치에서 부터 한칸씩 위로 올라가면서 값을 채우고

 끝까지 올라가면서 옆으로 옮겨서 내려오면서 값을 채우며 끝난다.

 

  private void test2()
        {
            DataTable table = new DataTable();
            table.Columns.Add("Block00");
            table.Columns.Add("Block01");

            int totalCount = 4;
            for (int loop = 0; loop < totalCount; loop++)
            {
                table.Rows.Add();
            }

            string type = "b";

            int currentCol = 0;
            int currentRow = (type == "a" ? totalCount : totalCount - 1 ) - 1;
            int startValue = 1;
            int step = -2;

            do
            {
                table.Rows[currentRow][currentCol] = startValue++;
                currentRow += step;               
                if (currentRow < 0)
                {
                    step *= -1; // 방향전환
                    currentRow = Math.Abs( currentRow - 1 ) % 2;
                    currentCol++;
                }
             
            } while (currentRow < totalCount && currentCol < 2); // 시계방향일때 종료지점
            dataGridView1.DataSource = table;
        }

 

 

 // 테스트는 위에서 부터 아래로 내려오면서 간단한 계산을 통해

 값을 채워 내려온다.  대신 타입과 홀수/짝수에 따라 시작위치가 다르다.

 노란색 시작점에서 시작이 아니고 제일 위에서부터 내려오면서 값을 채운다.

 

        private void testc()
        {
            DataTable table = new DataTable();
            table.Columns.Add("Block00");
            table.Columns.Add("Block01");

            int totalCount = 13;
            for (int loop = 0; loop < totalCount; loop++)
            {
                table.Rows.Add();
            }

            int startcol = 0;
            int startValue = totalCount / 2 + totalCount % 2;
            string type = "b";

            int simbol = 0;

            if (type == "a")
            {
                if (totalCount % 2 == 0) // 짝
                {
                    startcol = 1;
                    simbol = 1;
                    startValue ++; // a일때 짝수는 +1
                }
                else
                {
                    startcol = 0;
                    simbol = -1;
                }
            }
            else if (type == "b")
            {
                if (totalCount % 2 == 1) // 홀
                {
                    startcol = 1;
                    simbol = 1;
               
                }
                else
                {
                    startcol = 0;
                    simbol = -1;
                 
                }
            }

            for (int loop = 0; loop < totalCount; loop++)
            {               
                startValue = (simbol * loop) + startValue;
                simbol *= -1;
                table.Rows[loop]["Block0" + startcol] = startValue;
                startcol = ( startcol + 1 ) % 2;            
            }
            dataGridView1.DataSource = table;
        }

 

       이 방법은 간단한 수의 규칙을 찾아내고 만든 것이다ㅏ.

   

A타입만 써놨지만. B타입 4위치가 우측 칸부터 시작하고 우측에 표시되는 덧셈 뺄셈값의 부호가 반대가 된다. ( -1, +2, -3, +4, -5, 6 )

 

위의 두 처리방법 모두 간단한것인긴 한데..... 그냥 적어두자.

 

 

 음... 오늘 플젝하면서 그리드 Summary 구현하다가 하도 지저분해져서 좀 쉽게 안되나 하고

 

고민 고민 하다가 좋은걸 만들어냈다.

 

아래는 샘플로 구현했던 코드이다.

 

요새 상용 그리드는 밴드까지 있어서 컬럼 하나 찾아 설정하려면 코드가 많이 길어진다.

 

그래서 탄생한 로직이 아래처럼 만든 소스이다.

 

원래 하려던 소스는

    SettingColumns( 그리드, 밴드, ("컬럼키", ( col )=>{ 

           컬럼 설정....

    }),  

    ("컬럼키2", ( col )=>{ 

           컬럼2 설정....

    }));

 

이런식으로... 처리할수 없을까 였는데...

 

쉽게 될것 같은게 한시간은 머리빠개지게 고민하고 코딩하고 했던것 같다.

 

Action이나 Func 대리자를 이용하여 처리하면 될 것 같았는데... 직접은 안되고.

Tuple<string, Action<Column>> 으로 여러개 하려니 직접 생성도 해야되고... 번거롭더라

 

그래서...  두 메서드를 연결하는 메서드 형태를 고안해냈다.

 

 

위에 소스의 흐름은 간략하게 설명하면 다음과 같다.      

    1. GetCol 을 호출하면서 컬럼키를 넘겨주고

    2. GetCol에서 반환된 Action<DataGridView>의 대리자가 SettingsColumns에 setTransfers에 쌓인다. 

    3. 다음 SettingsColumns에서 foreach하면서 쌓인 대리자를 하나씩 호출하면서 그리드를 넘겨주면서 호출을 한다.

    4. 그러면 Action<DataGridView> 대리자 안에 구현된 setColumn의 대리자를 호출하면서 그리드에서 컬럼을 꺼내 외부로 전달하게 된다.

    5. 전달받은 column 객체는 GetCol( "AAA", Col =>   이부분으로 Col 객체로 넘어오게 된다.

   이렇게 순차적으로 넘어오면 컬럼을 각각 입맛에 맞춰 수정해주면 된다.

 

그래서 이걸 이대로 쓰나?? 아니다. 좀더 줄여본다.

 

 

동일한 동작을 하도록 대리자를 만들었다.

 

이렇게 하면 좋은점이라고 생각되는 것은 그리드의 컬럼을 설정할때 위와 같이 하면

 

컬럼1 설정...

 

컬럼2 설정...

 

컬럼3 설정...

...

 

이런식으로 세로로 쭉!! 나열했을때

컬럼에 다른 옵션등을 주면 소스가 중간이 두꺼워지고 빈줄로 구분하거나 region으로 구역을 나누게 되는데

 

위처럼 하면

그리드.SetColumns(

GetCol("컬럼키", col =>{

        // 설정

}),

GetCol("컬럼키2", col => {

        // 설정

}),

...

);

 

이런식으로 함수차제로 쪼갤 수 있다.

물론 다른 형태로 조각 조각 내서 관리할수 도 있다.

그래도 그리드설정시 기본 컬럼도 같이 한셋으로 묶는게 가능해졌다.

 

 요새 상용그리드 같은 경우 band개념이 있어서 소스가 지저분해져서... 어떻게하면 구역을 쪼개서 묶을수 있나... 라고 고민했는데...

여기에 딱이네. 

 

 

정말 오래 걸린것 같다. 마우스로 그리던 것을... 이번에 산 태블릿으로 프로그램올리니..

이상하게 그려지고 뚝뚝끊기고... 안찍히고... 등등... 이상이 많았는데...

 

이제 편하게 그릴수 있게 되었다. 데모 샘플도 만들었고, 인터넷에 없는 지우개 기능도 만들었고...

웃... 프로그램에서 그려진 것만 찍으니 위처럼 나왔다.  ( 역시 닷넷 좋아... 라이브러리 하나로 저렇게 구현이 가능하다니.. )

 

 

지우개도 구현이 되었다. ( 쉽지 않네 ..;; )

 

앞으로 할일은... 퇴근해서 Prezi와 Npt 그리고 Test이력 프로그램, 곧, 그림 그리는 기능들어간 것들은 모두 수정해야겠다.

 

이 맛에 코딩하는 것...

 

 

리소스... 관련해서 아래처럼 직접 관리가 가능하더랑...

( 이번에 사용할 프레임웍을 분석해보다가... 파일은 없는데 사용하는 코드만 있길래 구글링 열심히 해서 찾았다 )

ResourceWriter 로 리소스 Key, Value로 입력하면 아래 이미지 처럼 파일로 생성이 된다.

설명에는 개인정보등을 담아두지 말라고 써있다.

 

 

생성된 리소스 파일

>> 약간의 인코딩이 되어 있어 열면.. 깨진 텍스트 파일로 보인다.

 

> 소스파일은 숨겨둠.

 

 

 이번 프로젝트를 시작하면서 공통쪽을 준비하면서 다국어 관련 정보를 찾아봤다.

예전에 다국어 관련 테스트 했을때의 방법은 폼개발을 해놓고

 폼에서 Localization 프로퍼티 true 맞추고 Language를 변경하면 컨트롤에 리소스 파일이 하나 생긴다. 이를 이용해서 적용하는 방법이 있다.

 

이번에 찾은 방법은 좀 다르다. WPF처럼 리소스를 별도로 관리할수 있는 방법이다.

Dll_Resource 프로젝트를 만들고 여기에 각 언어별 리소스 파일을 만든다.

 

그리고 Demo_Resource는 Dll_Resource를 참조한다.

 

그리고 Dll_Resource는 Demo_Resource를 FriendAssembly 로 지정한다.

 

오잉??? 여기서 FriendAssembly 라는걸 처음 접했다.

 

Resouce의 접근자가 Internal로 지정되어 있는데 이를 public으로 변경 후 접근해도 되겠지만...

 

어셈블리끼리 친구먹게 해준다.

 

internal 접근자는 어셈블리 내에서 '공개' 제한자인데 어셈블리 밖에서 접근하려면 프로퍼티는 상속빼고는 접근이 안된다.

 

이걸 Dll_Resource 의 Assembly.cs에


// Assembly Frend
[assembly: InternalsVisibleTo("Demo_Resource")]

 

지정해주면!!! 접근이 가능하고

 

Demo_Resource의 소스코드 작성시

 

  apply(  Dll_Resource.Properties.Resources.ResourceManager  );

 

이렇게 접근이 가능하다.

 

>> 혼동하지 말기..

  리소스 접근한다고

      ResourceManager 객체로 로딩해서 접근하려고 하니

       자꾸 서명하라고 에러 뜨고 그런다. 서명을해도  공개키를 FriendAssembly 지정할때 적어주어야 한다는데...

          https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/assemblies-gac/how-to-create-signed-friend-assemblies

 

         음.... 근데 PublicKey 를??? 어떻게 얻지?.... 서명하고 키열어보면 ...

 

 

 

 

 

 

 

 

 코드트레인 보고 3D 랜더링 편 보며 따라 해봤는데

윈폼에 그리는 부분은 별도로 생성해서 작업

전에 별도로 공부할때보다 쉽게 만들어진 느낌??

아직 절두체 투영해서 뒤쪽 시야에 보이는 점들 숨기고 색칠하는 부분은 안해봤지만...

 

GIFMaker를 간만에 써보니 사용법을 까먹었네 ...

다시 폼화면에 화면 캡쳐기능있는 것을 써놓으려고 열었는데 이번엔 다른 문제가... 해결해놓고 기록해놨는데...

관련 라이브러리 사용했던 프로그램들이 같은 문제가 날것 같다. 해결은 간단하게 되는데...

윈10이 업데이트가 되서 그런건가...?

 

 

 

                          사이트에서 해본 것.

             이건 짧은 소스로 행렬곱 구현했던것으로 ...  결과 확인을 위해....

            이건 사이트처럼 값을 계산해서 채우는 형태로 구현한것... 

 다시 코드 트레인으로 돌아가보자... ( 3D 랜더링 ...  )

 

 코드 트레인 보다가 행렬곱 계산하는 부분에서 어떤 사이트하나를 띄우길래 봤더니...

  http://matrixmultiplication.xyz/

 

세상에나... 행렬을 애니메이션으로 보이게 만들어놨네?

근데 배열을 회전시켜서 곱셈하는 부분처럼 만들어놨길래...

 

전에 피봇 생각하고 배열 만들어서 회전이라는 착각을 하며 돌렸는데????? 어랏? 다르네?

그래서 간단하게 구현을 해보았다. ( 물론 2시간 걸린건 안비밀... 이지만 )

 

회전구문은 이중 for문으로 간단하게 구현이 되는데...

왼쪽 오른쪽 방향처리만 달리하면 된다. 30라인 정도 되는데 { } 각각 한줄씩이니까 가독성 헤치지 않는 선에서 줄이면 20라인정도 되네.

내일은 행렬곱 그림처럼 되게 구현해봐야징...

예전에 행렬곱셈은 배운대로 좌표하나씩 끌어다가 넣었었는뎅...

 

 

 이번 플젝에서 간단한 유틸프로그램을 하나 만들어서 사용중인데...

특정형식의 .xml 내용을 내가 보기 좋은 html table 표형태로 변환하여 클립보드에 복사해준다.

이때 td 안에 <br />로 newline을 처리했을때, 엑셀에 붙여넣으면 여러행으로 나타나지 않고

td안에 있는 내용이 1개의 cell 안에 들어가 표시가 되도록 하는 방법에 대해 써놓겠다.

검색하면 많이 나오지만... 스타일 요소하나를 추가해주어야 한다.

br { mso-data-placement:same-cell; }