퇴근5분전

 

셀 병합

   : 다른 병합 방법이 있지만... 새로 만들어본 병합 코드이다. 

   : 각 셀에 index를 가지고 인접한 셀에 값이 같은지 확인하고 같으면 같은 영역으로 몰아주기를 진행한다. 

   : 소스에서 보듯이 각 행마다 오른쪽(컬럼이동)으로 먼저 확인하고 같은 셀들을 몰아주기

   : 다음 각 컬럼마다 아래쪽(행이동)으로 확인하면서 같은 셀들을 몰아준다. 

   * 진행 순서에 따라 열이 먼저 병합될지 행이 먼저 병합될지를 결정한다. 

   * 소량의 데이타를 가지고 해볼 수 있는 간단한 소스이다. 

   각 셀의 갯수만큼 CR을 생성하여 인접한 셀로 몰아주기 처리를 하기 때문에 데이타가 너무 많으면... 장담 못한다. 

   데이타 갯수는 따로 해보진 않아서... 모르겠고...

   * 개발하면서 떠올린 생각 : 뿌요뿌요.... 

        private void Merge()
        {
            C1FlexGrid grd = c1FlexGrid1;
            List<CR> merges = new List<CR>();
            for (int rIdx = grd.Rows.Fixed; rIdx < grd.Rows.Count; rIdx++)
            {
                for (int cIdx = grd.Cols.Fixed; cIdx < grd.Cols.Count; cIdx++)
                {
                    int r = rIdx - grd.Rows.Fixed;
                    int c = cIdx - grd.Cols.Fixed;
                    merges.Add(new CR() {
                        idx = (r * (grd.Cols.Count- grd.Cols.Fixed)) + c
                      , r1 = rIdx, r2 = rIdx, c1 = cIdx, c2 = cIdx
                      , Text = $"{grd[rIdx, cIdx]}" 
                    });
                }
            }

            for (int rIdx = grd.Rows.Fixed; rIdx < grd.Rows.Count; rIdx++)
            {
                int r = rIdx - grd.Rows.Fixed;
                int cHold = -1;
                for (int cIdx = grd.Cols.Fixed; cIdx < grd.Cols.Count; cIdx++)
                {
                    // 옆으로...
                    int c = cIdx - grd.Cols.Fixed;
                    if (cHold == -1) cHold = c; 
                    int idx = (r * (grd.Cols.Count - grd.Cols.Fixed)) + cHold;
                    CR cr = merges[idx];
                    int nidx = (r * (grd.Cols.Count - grd.Cols.Fixed)) + c+1;
                    if (nidx < merges.Count)
                    {
                        CR ncr = merges[nidx];
                         
                        if (cr.Text == ncr.Text && ncr.Merged == false)
                        {
                            cr.c2 = ncr.c2;
                            ncr.Merged = true;
                        }

                        if (cr.Text != ncr.Text) cHold = -1;
                    }
                } 
            }

            for (int cIdx = grd.Cols.Fixed; cIdx < grd.Cols.Count; cIdx++)
            {
                // 아래로
                int c = cIdx - grd.Cols.Fixed;
                int rHold = -1;
                for (int rIdx = grd.Rows.Fixed; rIdx < grd.Rows.Count; rIdx++)
                {
                    int r = rIdx - grd.Rows.Fixed;
                    if( rHold == -1) rHold = r;

                    int idx = (rHold * (grd.Cols.Count - grd.Cols.Fixed)) + c;
                    CR cr = merges[idx];
                    int nidx = ((r+1) * (grd.Cols.Count - grd.Cols.Fixed)) + c;
                    if (nidx < merges.Count)
                    {
                        CR ncr = merges[nidx];
                        if (cr.Text == ncr.Text && ncr.Merged == false)
                        {
                            cr.r2 = ncr.r2;
                            ncr.Merged = true;
                        }

                        if (cr.Text != ncr.Text)
                        {
                            rHold = -1;
                        }
                    }
                }
            }

            List<CR> Mrgs = merges.Where(cell => cell.Merged == false).ToList();

            grd.AllowMerging = AllowMergingEnum.Custom;
            foreach (var mr in Mrgs)
            {
                grd.MergedRanges.Add(mr.r1, mr.c1, mr.r2, mr.c2);               
            }
        }

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

달력/시각 컨트롤...  (0) 2025.03.16
Popup?  (0) 2025.03.16
[일자 & 시간] 컨트롤...  (0) 2024.08.04
뭐 좀 만들어볼까하다가....  (0) 2024.08.03
Flow Condition] 조건 오브젝트 뷰 만들기?  (0) 2018.04.29

일일 점검표 같은 걸 만들어줘야 하는데... 월간으로 보여줄지. 주간으로 보여줘야 할지... 

범위를 고려해야 하기 때문에 둘다 구하는 쿼리를 샘플로 만들었다. 

 

주간: 해당 일자가 포함된 주간의 일요일 ~ 토요일까지의 일자를 구한다.

월간: 해당 일자가 포함된 월의 1일 ~ 말일까지를 구한다.

 

* 예전에 만든 쿼리가 있긴 하네... 

* 임시테이블에 넣는거... 

 

* 오류 수정 :: 실제 적용해보니 원하던 결과가 아니었다. 

  04-13일요일을 설정하고 주간 정보를 보면 월요일 부터 나와야 할게 14일부터 보여져서 수정.( 04-23 )

DECLARE @TODAY DATETIME =  '2025-04-13 00:00:00'
--SET @TODAY = DATEADD( MINUTE, -(8*60+30), @TODAY )

-- 일요일부터 시작하면 : DATEADD( DAY, - CASE DATEPART(WEEKDAY, @TODAY) WHEN 1 THEN 7 ELSE  DATEPART(WEEKDAY, @TODAY) - 1 END + NUMBER,  @TODAY)
-- 월요일부터 시작하면 : DATEADD( DAY, - CASE DATEPART(WEEKDAY, @TODAY) WHEN 1 THEN 7 ELSE  DATEPART(WEEKDAY, @TODAY) - 1 END + NUMBER + 1,  @TODAY)

-- 해당 날자에 주간 
SELECT DATEADD( DAY, - CASE DATEPART(WEEKDAY, @TODAY) WHEN 1 THEN 7 ELSE  DATEPART(WEEKDAY, @TODAY) - 1 END + NUMBER + 1,  @TODAY)
  FROM MASTER..SPT_VALUES
 WHERE TYPE = 'P'
   AND NUMBER BETWEEN 0 AND 6

-- 해당 날자에 월간
SELECT DATEADD( DAY, (-1 * (DATEPART(DAY, @TODAY) - NUMBER - 1)), @TODAY)
     , DATENAME(WEEKDAY, DATEADD( DAY, (-1 * (DATEPART(DAY, @TODAY) - NUMBER - 1)), @TODAY))
  FROM MASTER..SPT_VALUES
 WHERE TYPE = 'P'
   AND NUMBER BETWEEN 0 AND DATEPART( DAY,  Eomonth( @TODAY ))-1

 

찾아보니 이것도 있네... 

set datefirst 1 -- 월요일은 1 화요일은 2 수요일은 3 ... 일요일은 7

 이번 플젝에서 작업일지 관련하여 메모장으로 정리하고 있는데...

일요일 쉬는 날 급발진으로... 한나절만에 만들었다. 아이.. 쉬어야 하는데... ㅠㅠ; 

 

 프로젝트 중 내가 개발해야 할 항목들이 여러가지가 있다. 

매일 백업관리되는 txt파일을 메모장으로 열어 순서대로 정리하면서 일한다. 

 프로젝트에서 따로 관리하는 레드마인도 있고... 현업들이 보겠다는 엑셀도 있고... 

어차피 내가 관리하는건 아니니까... 

 그러다가 내가 메모장 말고 별도로 프로그램하나 만들어 쓰자해서 만들어본거다. 

아래 보면

롤 투입 하나에 DAT도 있고 POP도 있고, MES라는 웹 화면도 있다. 

각각 해야 할 일에 대한 기간을 정의하고 진행율%를 기록해두면 

 두번째 그림처럼 각각의 퍼센트를 그래프로 표시도 해준다. 

 첫번째 그림은 상세 진행률의 평균%를 보여준다. 

 

데이타가 어느정도 정리되면... 

엑셀 그래프 간트챠트로 만든다거나...

화면 자체에서 간트챠트로 그려볼 생각인데... 

우선 플젝이 중요하니... 마치고 하든가...

한달 정도 남았으니 후딱 끝내버리자. 

 

1. 프로젝트에서 작업해야 할 항목 관리화면

 

2. 입력된 내용 정리해서 보여주는 화면.

 

3. 내용 수정 화면.

 

간트 챠트로... 그렸다. (퇴근해서 3시간 정도 한거..)

 

퇴근해서 또 한 3시간 했다. 

좀더 두꺼운 세로 점선은 (오늘)이라고 표시한건데 테스트를 위해 오늘보다 4일 이후로 설정했다. 

예정일보다 지난 일 수 만큼 빨갛게 칠해주고 몇일 지나는지 표시해준다. 

 

그리고 [숨김] 기능도 추가했다. 삭제는 아니고 숨길 수 있도록...

$000 은 정렬 순서다... 

 

(902) 정렬 순서를 지정할 수 있다. (역순:높은숫자가 앞으로 올라온다.) 

 

해당 주제를 클릭하면 내부 상세 정보를 팝업해서 보여준다.

https://youtu.be/mr_2ywAJ4Lo

 

내란 매국당 해체!

내란 동조범들 모두 감빵행...!

내란 우두머리와 그 주변인물들은 사형! 

조중동 폐간!으로 언론 개혁!

검찰은 기소하지 않을 권력을 뺏자!

판사놈들 판결문 모두 공개!

 

 이 땅에 자라나는 아이들이 잘 살 수 있는 그런 나라가 되었으면 좋겠다. 

국가 공권력이 국민들 목숨을 위협하는 그런 매국 내란 국짐당 같은 뿌리는 이제 뽑아버려야 하지 않겠나? 

 

 이제 똥파리들... 매국내란당... 기독교 극우들...  좀 찌그러져 살아라. 

그 동안 많이 해묵었잖아. 이제 아이들이 살 만한 세상으로 바꾸자.

 

 

 

뭐라고 하는지는 잘 모르겠다.. 

아주 예전에... 아이폰 ui에 처음 봤던 거였고...

어쨌든 이번 플젝에서 현장 설비 터치모니터에서 가상키보드로 날짜 및 시간을 입력을 하고 있기에...

그땐 내가 POP개발자는 아니었으니... 개발자에게 현장 작업자들이 불편해 보인다. 정도 했지만.. 

그후로 6개월 정도 지났는데... 가보니 그대로 더라.. 

 이건 그때 만들었었는데... 이번에 바꿔줄까? 고민중이다.  

입력하는게 익숙해진 작업자들에게 이걸 적용해주면 편할까?

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

C1FlexGrid - Merge()  (0) 2025.04.22
Popup?  (0) 2025.03.16
[일자 & 시간] 컨트롤...  (0) 2024.08.04
뭐 좀 만들어볼까하다가....  (0) 2024.08.03
Flow Condition] 조건 오브젝트 뷰 만들기?  (0) 2018.04.29

 이걸 뭐라 해야 하지... 

 

일단... 예전에 코드프로젝트에서 찾아서 쓰던 

http://www.codeproject.com/Articles/17502/Simple-Popup-Control

 

Simple Popup Control

How to create a custom pop-up control in C#.

www.codeproject.com

 

개인용 토이플젝 할때 쓰던거다... 

팝업을 띄워서 에디팅이 끝나거나 다른 부분들을 클릭하면 자동으로 닫히는 그런 팝업 컨트롤... 

콤보의 드롭박스 처럼... 필요할때 작게 나왔다 사라지는 그런거... 

라이센스가 LGPL 3이라... 현재 돈받고 하는 플젝에선 좀 찜찜해서..? 

 

 그래서 찾다보니...  원래는 C1ComponentOne에서 지원되는게 있나 뒤져보던 중에... 발견!

어제... 찾은건데... 문서가 다시 검색이 안되네. ㅠㅠ;

 

ToolStripDropDown popup = new ToolStripDropDown();

...

NumberPad pad = new NumberPad( ); // 내가 만든 키패드... 

 

ToolStripControlHost host = new ToolStripControlHost(  pad ) ;

popup.Closed += (ss, ee) => {

        pad?.Dispose();

        popup = null;

};

 

popup.Items.Add( host );

popup.Show( 대상 컨트롤, 대상컨트롤.Location );

 

 

이렇게 하면 팝업이 된다... 

 

찾았다.  👍

https://www.codeproject.com/Articles/17502/Simple-Popup-Control

 

## 테스트용으로... 키패드 띄움.. 

 

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

C1FlexGrid - Merge()  (0) 2025.04.22
달력/시각 컨트롤...  (0) 2025.03.16
[일자 & 시간] 컨트롤...  (0) 2024.08.04
뭐 좀 만들어볼까하다가....  (0) 2024.08.03
Flow Condition] 조건 오브젝트 뷰 만들기?  (0) 2018.04.29

 

음.. 내일 다시 작년에 했던 PLC 모니터링 하는 프로젝트를 다시 나가게 되었다.  DAT...

전보다 빡신거 아니라니까... 쉬엄 쉬엄 하지뭐... 

 나이가 이제 40대 후반끝물이라 그런가. 프로젝트도 개발로는 잘 안들어오네... 

게다가 C#언어를 기본으로 하는 개발자라 더욱더 어려워지는가 보다.

크몽을 보면 윈폼 프로젝트가 보이긴 하던데... 크몽을 해볼까낭? 

 

 작년 추석전 프로젝트가 너무 힘들어서 연장이고 뭐고 도망치듯 종료하고 나왔는데, 

분가을 하게 되고, 또 계엄?이란걸 거치고... 지금까지... 거의 집돌이로 살았다. 

 

 처음엔 AI를 좀 볼까 싶었는데... 보면 볼 수록 어렵기도 하고... 

대부분 ai의 API로 뭔가 하는 것만 떠오르고... 

 

 정작 하고 싶은건 내 PC에 AI모듈이 돌아서 코딩이나.. 문서 검색 또는 생성 이런거... 

내 자료를 이용해서 뭔가 학습시키고 조수처럼 부려먹을 수 없나 싶었는데... 

 영어의 벽!!! 그리고 귀차니즘? 쩝!  라마나 알파카로 뭔가 되는 것 같긴한데... 

공부를 거의 안해서 어떻게 되는건지는 모르겠다. 

 

 계엄! 

 써겨리의 도발로 계엄(12.3)을 선포한날 밤샜다. 뉴스를 따라가면서 어떻게 되는건가 싶어서 보는데...

참 친위 쿠테타 정리가 정말 쉽지 않구나... 꼭 제대로 처벌하고 다시는 국민들을 향해 총겨누는 일이 없기를...

 

사이비개독...

 이건 정말 '테러리스트' 로 규정하고 잡아 넣어야 하는거 아닌가? 이슬람 IS같은 놈들이 폭탄테러 하는 거랑

뭐가 다른가? 사이비 기독교단체가 정신 나가서 하는 짓들을 그냥 극우로 치부하고 마는건가? 

 내가 보기엔 '테러' 인데... 그럼 '테러리스트'로 IS 처럼 봐야 하는게 맞다고 생각하는데.. 

대구에 이슬람 사원 생기는 것도 불안했는데... 우리나라에 사이비 개독들로 테러단체가 이미 자리 잡고 있었어...

 

아무쪼록... 

오늘도 내일도 무사히...

'먹사니즘' '잘사니즘'  이재명 대표가 설계하는 세상이 되면 좋겠다. 

국가의 성장으로 세금 잘 거둬서 모두 잘 사는 나라가 되었으면 좋겠다. 

 

추가로 꼭 바라는 점은 조선 폐간시키기, 내란의 힘 정당해산! 

마지막으로 친일 매국노들 국가보안법으로 간첩으로 규정하기.

 

 

 

 

 늦은(?) 나이에 분가를 하게 되었다. 

 

프로젝트 끝나고 쉬는 중에 부모님의 분가요청으로... 나오게 되었다. 

 

그나마 본가에서 가까운 곳 오피스텔을 매매해서 자리를 잡았다. 

 

잔금 마치고 10일정도는 짐 실어나르면서 청소를 하였다. 

 

나름 짐 없이 산다했는데도 많이 들어 날렀다. 

 

벽한쪽에 TV놓는 자리처럼 휑한곳이 있길래... 컴퓨터를 놓기위해 

'고릴라랙'을 짜서 올려놓고 모니터 암을 달고 컴퓨터를 모니터 뒤에 두었다. 

보조 책상(ONA-804)으로 키보드 트레이( APL-KT65 )를 부착했다. 

 

# 컴퓨터 

 

 동향에 가까운 남동향이라 해가 아침부터 밝게 들어오고, 앞이 탁 트여서 답답하지도 않다. 

 

역앞이라 밤에 빛이 많이 들어와서 암막커튼도 했다.

 

층간소음은 그럭저럭... 조용한편인데, 발소리가 쿵쾅쿵쾅 들릴때가 있는데... 그래도 일찍 자는지 밤엔 조용하다. 

 

 

이제 혼자 생활하면서 어떻게 지내야 하는지 하나 하나 체크해보고 있는데... 

1. 식사시간? 밥을 차려서 먹고 치우고 하는데 대략 30~40분 가량 소요가 된다. 

   그래서 아침을 어떻게 먹을지?... 여러가지 시도중...

2. 세번정도 세탁기 돌려봤는데... 세탁기가 작아서 자주 돌려야 할 듯...

3. 음식쓰레기?... 

    아예 많이 나오면 자주 버리면 될 듯 하지만, 과일깍아먹으니 버리기도 애매하고 봉다리에 넣어놓았더니 곰팡이 피면서 썩더라... 3l짜리도 다 안찬거 버릴수밖에... 

4. 혼자 있는 시간에 익숙해져야 할듯 하다. 

   TV를 보는게 아니고... 본가에서는 귀로 듣기만 했는데... 너무 조용하니 이상하긴 하다.

 막 끝난 프로젝트에서 {설비 ---- mes서버}간에 데이타 통신을 ActiveMQ라는 것으로 구현이 되어 있었다.

메세지 전문을 만들면서 '보내는건 되어도 결과를 받을 순 없다.' 라는 답변을 받았다.

그런게 어딧냐고... 기간계 통신이 일방적으로 주기만 하는게 어디있느냐... 주고 받고 해야지... 라며 얘기를 했었다.

 

 프로젝트 끝나고 집에서 ActiveMQ관련해서 찾아보다 보니 RabbitMQ나 Kafka 같은 것들까지 나오길래...

구글링을 하면서 이게 뭔가 찾아봤더니 MSMQ같은 큐였다. 

 내 기억엔 MSMQ에서 양방향으로 비동기 통신을 했었던 걸로 기억하는데? 

이런것들은 한쪽에서 보내는 것만 된다고?

 

 몇 일을 고민도해보고 찾아보고 샘플도 만들어보고 테스트도 해보니... 내가 알던 방식이 맞다.

큐라는걸 사용할 뿐이지.. 주고 받고 해야지... 

기본 메세지 전송은 [프로듀서]라는게 [큐]에 등록(Send)하면 [컨슈머]가 꺼내서(Listner) 처리를 한다.

 

 Q. 서버.컨슈머가 메세지 처리 후 결과를 클라이언트에 돌려주는 방법이 있나?

 전 프로젝트 소스에서도 클라이언트.프로듀서가 전송 후 결과를 받는 것으로 처리 되어 있는 걸로 봐서는... 있지만?

서버쪽 소스는 내가 볼수 없었기에... 추측만 해볼 수 밖에...

 계기 ::

  설비에서 부자재 사용을 알릴때 서버에 요청하면 사용승인난 대기하던 부자재를 사용처리하면서 

 등록 ID를 설비에 돌려줘야 하는데... 이게 안되는게 아니고 안하는거였다? 왜? 귀찮아서 였을까??

 

간단하게 두가지 방법이 있었다. 

첫번째는 임시 큐를 사용하는 방법.

클라이언트.컨슈머 생성시 tempQueueDestination = session.CreateTemporaryQueue() 로 임시큐 사용

요청메세지에 NMSReplyTo = tempQueueDestination 을 할당하여 .Send

서버.컨슈머가 메세지를 수신하고 처리시 수신메세지.NMSReplyTo를 이용해서 서버.Producer를 만들고 Send하면

클라이언트.컨슈머에서 Receive 할 수 있다. - 테스트 결과 잘 된다.

mporaryQueue()

 

두번째 방법은 응답 컨슈머 생성시 selector를 지정

1. 클라이언트.컨슈머 생성시 selector를 res=producerID를 지정

2. 클라이언트.프로듀서의 요청메세지.Properties["req"] = null; 을 지정

3. 클라이언트.프로듀서의 요청메세지.Properties["pid"] = producerID; 을 지정

4. Send

 

1. 서버.컨슈머 생성시 selector를 req is null을 지정한다. 

2. 서버.컨슈머의 수신된 메세지 처리시

   서버.프로듀서의 응답메세지.Properties["res"] = 수신된메세지. Properties["pid"] 지정

3. Send

※ res, req를 등록하는 이유는 하나의 큐 JSFW.Queue에 등록하게되므로

자기가 올린 메세지를 자기가 수신하지 않도록 구분해주는 역할로 selector를 지정한다.

 

 클라이언트 프로그램을 여러개 띄워서 동시간에 동시 요청 가능하도록 만들고 테스트해보니 

원하던 동작을 잘 했다. ( 아래는 두개만 찍었지만.. 네개정도 띄우고 10초단위로 확인 해봤다. )

 

결론 : 잘 된다. 

 

예외 : 내 샘플 코드가 문제인지? 

서버.Consumer 프로그램을 수신을 멈춰놓고 긴시간 대기하면

클라이언트.프로듀서 프로그램은 10초마다 등록을 한다. 동기로 구현해놔서 Receive가 안되어 지정시간 동안 대기...

나중에 서버.Consumer 프로그램에서 다시 수신시작을 했을때 한번에 밀려들어오는데... 

 

클라이언트.프로듀서 프로그램에서 Thread로 10초마다 Send걸어놔서 그런지.. 

껐다 켰다 하면 같은 데이타로 Send가 여러번 일어나는 현상이??? 이건 샘플이 잘못된걸꺼야... _)_;;; 

1. ActiveMQ 

          -프로듀서:컨슈머=1:1, 1:n 

          -토픽, 큐

 

2. MSMQ (netMSMQBinding : two-way)

 

4. SQL MQ? 이런게 있어?

 

3. 코파일럿 AI로 ppt 생성해보기 

          -이전 프로젝트에서 만들었던 PPT내용을 ai로 재현이 되는지... 확인해보기.

         :: 맨날 말로만 된다고 하는 건 봤는데... 진짜 필요한 화면은 어떻게 만들수 있나?

 

5. 골프?...

 

--- 모르던게 생겼으니... 또 공부를 해야 다음 일도 하는거고...