반응형
  • 셀 병합을 위해서 마우스를 이용해서 셀 선택 후 마우스 좌측 버튼을 누른 상태에서 드래그 했을때 선택 영역이 표시되지 않는 오류 조치
  • Activity 선택 후 키보드의 방향 키로 Acivity 이동 시 메모와 연결된 선이 바로 Refresh 되지 않는 오류 조치

 

WANIPlanner Ver. 1.0.3.37 설치 프로그램

WANIPlanner_Installer.msi
4.19MB

 

WANIPlanner 실행 후 열기 버튼을 이용해서 로드해서 참조할 수 있는 예제 파일

개발WBS_Sample01.pln
0.31MB

 

WANIPlanner 사용을 돕기 위한 각 기능별 간단한 사용자 매뉴얼

WANIPlanner_Manual_Ver0.1.pdf
4.58MB

반응형

'WPF > WANIPlanner' 카테고리의 다른 글

WANIPlanner Ver 1.0.3.35  (0) 2024.04.20
WANIPlanner Ver 1.0.1.22  (0) 2024.03.07
WANIPlanner Ver 1.0.1.21  (1) 2024.03.04
WANIPlanner Ver 1.0.1.3  (0) 2024.01.14
WANIPlanner Ver 1.0.1.2  (1) 2024.01.12
반응형

WANIPlanner Ver 1.0.3.35 

  • 심볼 이동 시 메모와 연결된 선이 바뀌지 않는 오류 조치
  • 부하 보기 기능 추가

WANIPlanner 내에 생성한 각 Activity들의 시작/종료일자 기간 동안에 겹치는 Activity들의 수를 일자별로 집계해서 보여주고 차트로 한 눈에 쉽게 식별할 수 있는 기능을 추가한 버전이다.

주요 항목별 세부 Activity들의 일정이 서로 겹치게 될 경우, 얼마나 많은 Activity들이 일자별로 몇 개나 겹치고 있는지를 쉽게 확인할 수 있도록 했다.

 

보기 탭을 선택하고 Ribbon 메뉴 중 보하 보기 체크 박스를 체크하면, 일자별로 겹치는 Activity들의 개수를 상단에 표기하고 하단에 라인 그래프로 현황을 쉽게 볼 수 있는 뷰가 나타난다.

 

홈 탭의 Net./Cal. 선택에 따라 Net.을 선택한 경우에는 휴일에 Activity 개수가 0으로 표기되고, Cal.을 선택했을 경우에는 휴일에도 일자가 겹치는 Activity의 개수를 표기해서 보여준다. 하단의 라인 그래프 또한 동일하게 표시된다.

 

부하 표시 체크 박스 선택 했을 경우 화면

 

WANIPlanner Ver. 1.0.3.34 설치 프로그램

WANIPlanner_Installer.msi
4.19MB

 

WANIPlanner 실행 후 열기 버튼을 이용해서 로드해서 참조할 수 있는 예제 파일

개발WBS_Sample01.pln
0.31MB

 

WANIPlanner 사용을 돕기 위한 각 기능별 간단한 사용자 매뉴얼

WANIPlanner_Manual_Ver0.1.pdf
4.58MB

 

반응형

'WPF > WANIPlanner' 카테고리의 다른 글

WANIPlanner Ver 1.0.3.37  (0) 2024.04.23
WANIPlanner Ver 1.0.1.22  (0) 2024.03.07
WANIPlanner Ver 1.0.1.21  (1) 2024.03.04
WANIPlanner Ver 1.0.1.3  (0) 2024.01.14
WANIPlanner Ver 1.0.1.2  (1) 2024.01.12
반응형

메모 표시하기/숨기기 버튼을 이용해서 메모를 화면에 보이게 하던지 숨기게 할 수 있는 기능을 추가했다.

필요에 따라 메모 표시/숨기기를 할 수 있도록해서 편의성을 높였다.

 

 

 

WANIPlanner Ver. 1.0.1.22 설치 프로그램

WANIPlanner_Installer.msi
4.18MB

 

WANIPlanner 실행 후 열기 버튼을 통해서 참고할 수 있는 예제 파일

개발WBS_Sample01.pln
0.33MB

 

WANIPlanner 각 기능별 간단한 사용자 매뉴얼

WANIPlanner_Manual_Ver0.1.pdf
4.33MB

 

반응형

'WPF > WANIPlanner' 카테고리의 다른 글

WANIPlanner Ver 1.0.3.37  (0) 2024.04.23
WANIPlanner Ver 1.0.3.35  (0) 2024.04.20
WANIPlanner Ver 1.0.1.21  (1) 2024.03.04
WANIPlanner Ver 1.0.1.3  (0) 2024.01.14
WANIPlanner Ver 1.0.1.2  (1) 2024.01.12
반응형

계획 문서 내의 Activity(심볼)에 연결된 메모를 추가/삭제 할 수 있는 기능을 추가했다.

메모에 대한 주요 기능은

  • 메모 생성/삭제
  • 메모를 원하는 위치로 이동(Move)
  • 메모 내용 작성
  • 메모 좌/우/하단에서 메모 사이즈 조절

 

WANIPlanner Ver. 1.0.1.21 설치 프로그램

WANIPlanner_Installer.msi
4.20MB

 

WANIPlanner 실행 후 열기 버튼을 통해서 참고할 수 있는 예제 파일

개발WBS_Sample01.pln
0.33MB

 

WANIPlanner 각 기능별 간단한 사용자 매뉴얼

WANIPlanner_사용자매뉴얼_Ver0.1.pdf
4.33MB

반응형

'WPF > WANIPlanner' 카테고리의 다른 글

WANIPlanner Ver 1.0.3.37  (0) 2024.04.23
WANIPlanner Ver 1.0.3.35  (0) 2024.04.20
WANIPlanner Ver 1.0.1.22  (0) 2024.03.07
WANIPlanner Ver 1.0.1.3  (0) 2024.01.14
WANIPlanner Ver 1.0.1.2  (1) 2024.01.12
반응형

미처 챙기지 못했던 부분을 보완해서 올린다.
일정계획의 시작/종료일자 변경 시 Validation 체크 부분을 보완했다.
기존 버전에서 Activity(심볼)의 시작/종료 체크 없이 일정계획의 시작과 종료일자가 변경되었던 부분을 일자 변경 시 이미 생성된 Activity의 시작/종료 일자를 체크해서 변경되는 일자가 Activity(심볼)의 시작/종료 일자 범위를 벗어나는 경우 메시지로 이러한 사실을 알리고 변경이 되지 않도록 처리했다.
 

 
WANIPlanner Ver. 1.0.1.3 설치 프로그램

WANIPlanner_Installer.msi
4.16MB

 
WANIPlanner 실행 후 열기 버튼을 통해서 참고할 수 있는 예제 파일

개발WBS_Sample01.pln
0.33MB

 
WANIPlanner 각 기능별 간단한 사용자 매뉴얼

WANIPlanner_사용자매뉴얼_Ver0.1
4.10MB
반응형

'WPF > WANIPlanner' 카테고리의 다른 글

WANIPlanner Ver 1.0.3.37  (0) 2024.04.23
WANIPlanner Ver 1.0.3.35  (0) 2024.04.20
WANIPlanner Ver 1.0.1.22  (0) 2024.03.07
WANIPlanner Ver 1.0.1.21  (1) 2024.03.04
WANIPlanner Ver 1.0.1.2  (1) 2024.01.12
반응형

버킷리스트 중의 하나 인 일을 이제 시작하고자 한다.
어플리케이션 개발자로 나름 적지 않은 경험과 배움, 학습으로 다양한 개발 언어와 개발 툴을 다루어 온 것 같다.
Java와 Spring Framework 기반의 웹 개발을 오랫 동안 했었고, 업무로 Java기반의  EJB를 이용한 Groupware 개발을 시작으로 Spring Framework 기반의 웹 개발 및 유지보수 업무를 했었다.
2005년 처음으로 Spring Framework 기반의 내가 생각하는 그룹웨어를 한번 만들어 보자는 무모한 시도를 했었고, 나름 성과도 있었던 것 같다.
이렇게 만들었던 그룹에어의 명칭은 UniWorks라 스스로 명명하고 2~3번 정도의 대대적인 개편도 나름 했었고, 지금도 계속 작업 중인 나의 프로젝트이기도 하다. 이렇게 시작했던 Groupware 프로젝트를 통해서 실제 업무에 많은 도움을 받기도 했다.
특히 내가 생각하는 Groupware를 만들어 보자는 다소 무모한 시도를 통해서 Java와 Spring Framework를 좀 깊이 알게 되는 계기가 되기도 했다. 이런 시도를 통해서 Java, Spring Framework, Javascript, HTML5, Json, REST 등의 다양한 웹 기술들을 익히고 적용하면서 나의 실력을 키울 수 있었던 것 같다.
 
그러다 업무가 바뀌면서 C# 기반의 윈도우 어플리케이션 개발 및 운영을 하게 되었다.
20년을 넘게 했던 웹 개발 업무에서 윈도우 어플리케이션으로의 전환이 쉽지는 않았기에 생소하고 많이 당황했던 기억이 있다. 특히 윈도우 API 등을 새로 익히고, 특히 유지보수하고 있는 시스템이 데이터를 시각적으로 표현해서 컨트롤 해야 했던 어플리케이션이었기에 어려움은 더 했던 것 같다. 
이제 막 윈도우 프로그램을 시작하는 개발자가 모든 것들을 직접 그리고 컨트롤해야 하는 어플리케이션을 맡다보니 매일매일이 새로운 도전이었고 고난의 연속이었다.
이때 최소한 DataGrid 형태의 컨트롤을 직접 한번 만들어 보자는 오기가 생겨서 시작한 WANIGrid 프로젝트를 시작으로 윈도우에서 WinForm기반의 Drawing, 스크롤처리, 마우스 이벤트, 키이벤트 등을 조금씩 이해해 나가기 시작했다.
이러한 노력 덕분에 나름 어느 정도 수준까지는 올라갈 수 있었던 것 같고, 내가 생각하는 일정계획 시스템을 한번 만들어보자는 생각을 하게 되었고, 지난 1년을 오롯이 투자해서 오늘 버전 1.0.0.2를 내놓게 되었다.
아직도 가야할 길은 많지만 조금 더 사용하기 편한 앱을 목표로 조금씩 조금씩 나아가는걸 목표로 계속 만들어 가볼 생각이다. 지금까지는 혼자 생각으로 만든 앱이다 보니 많은 부분이 미흡하지만 오늘 보다는 내일이 좀 더 좋아 질거라는 믿음으로 계속 만들어 갈 계획이다.
 
이 글을 읽으신 분들은 아래의 첨부파일을 설치해서 사용해 보시고, 조금 더 개선이 필요하거나 더 좋은 아이디어가 있다면 가감없이 댓글로 올려주셨으면 한다.
 
[WANIPlanner_Installer.msi] 는 WANIPlanner 설치 프로그램이며, 다운로드 받아서 더블 클릭을 해서 설치하면 된다.
[개발WBS_Sample01.pln] 파일은 샘플 파일로 WANIPlanner 설치 후 바탕화면의 WANIPlanner를 실행해서 열기 메뉴를 클릭해서 파일을 읽어 들이면 WANIPlanner를 이용해서 만들 수 있는 예제를 볼 수 있다.
[WANIPlanner_사용자매뉴얼_Ver0.1.pdf] 파일은 간단한 사용자 매뉴얼이다.

WANIPlanner_Installer.msi
4.16MB
개발WBS_Sample01.pln
0.33MB
WANIPlanner_사용자매뉴얼_Ver0.1
4.10MB

 

반응형

'WPF > WANIPlanner' 카테고리의 다른 글

WANIPlanner Ver 1.0.3.37  (0) 2024.04.23
WANIPlanner Ver 1.0.3.35  (0) 2024.04.20
WANIPlanner Ver 1.0.1.22  (0) 2024.03.07
WANIPlanner Ver 1.0.1.21  (1) 2024.03.04
WANIPlanner Ver 1.0.1.3  (0) 2024.01.14
반응형

기존에 ClickOnce로 배포했던 앱을 여러 이유로 새로운 명칭과 설치 URL 변경 등으로 새로 만들어서 배포를 할 경우, 기존 ClickOnce 앱의 삭제를 사용자에게 맡길 것인가 아니면 자동으로 삭제하고 설치도 자동으로 하고 싶을 경우 어떻게 하면 될까?

여러가지 방법이 있을 수 있다. 

기존 ClickOnce 배포 앱을 삭제하기 위한 스크립트를 만들어서 스크립트 실행을 통해서 삭제 또는 설치할 수가 있다.

이럴경우 스크립트 파일(WScript)의 디버깅이나 제어가 여러가지로 불편할 수가 있고, 편집기로 쉽게 스크립트 내용을 볼 수 있는 단점이 있다.

스크립트 파일로 삭제/설치도 좋지만 요즘 보안이다 뭐다 해서 주요 정보들을 스크립트로 제공하는 것도 문제가 될 수 있다.

아래는 이러한 문제를 개선한 실행 앱(exe)을 통해서 기존의 ClickOnce 앱을 삭제하고 설치하는 소스이다.

public class ClickOnceRemoveInstall
    {        
        public static void Main(string[] args)
        {
            //CMD 창을 숨긴다.
            var handle = GetConsoleWindow();
            ShowWindow(handle, SW_HIDE); // 숨기기

            //활성화된 ClickOnce App. Kill            
            Process.Start("taskkill", "/F /IM ClickOnce앱명칭*");
            Process killProc = Process.GetProcessesByName("taskkill").FirstOrDefault();
            killProc.WaitForExit();
            killProc.Close();
            
            //기존 설치된 ClickOnce App. 제거
            string app = "dfshim.dll,ShArpMaintain ClickOnceAppName.application, Culture=neutral, PublicKeyToken=e5ccc1554e61cee3, processorArchitecture=x86";
            Process.Start("rundll32.exe", app);
            Process removeProc = Process.GetProcessesByName("dfsvc").FirstOrDefault();
            System.Threading.Thread.Sleep(3500); //제거 창이 뜰때까지 잠깐 대기
            if (removeProc != null)
            {
                IntPtr h = removeProc.MainWindowHandle;               
                SetForegroundWindow(h);                
                SendKeys.SendWait("O"); //제거 창에서 확인 버튼 클릭을 위해 Key 입력
                removeProc.Close();                
            }
            
            System.Threading.Thread.Sleep(500);
            
            //새로운 ClickOnce App. 설치
            string appUrl = "http://ClickOnce배포서버명 또는 접속URL/ClickOnceAppName.application";
            Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " + appUrl);
            Process installProc = Process.GetProcessesByName("dfsvc").FirstOrDefault();
            System.Threading.Thread.Sleep(2500); //설치 창이 뜰때까지 잠깐 대기
            if (installProc != null)
            {
                IntPtr h = installProc.MainWindowHandle;                
                SetForegroundWindow(h);                                
                SendKeys.SendWait("I"); //설치 창에서 설치 버튼 클릭을 위해 Key 입력               
                installProc.Close();
            }            
        }
        
        [DllImport("User32.dll")]
        static extern int SetForegroundWindow(IntPtr point);
        
        [DllImport("kernel32.dll")]
        static extern IntPtr GetConsoleWindow();

        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        const int SW_HIDE = 0; // 숨기기
        const int SW_SHOW = 1; // 보이기
    }

 

반응형
반응형

프로그램에서 언어나 문화권에 대한 설정 값을 받아와서 요일 정보를 반환하는 함수

DateTime 을 입력하면 그에 맞는 요일을 반환한다. 

반환하는 값은 월요일, 화요일 .... 토요일, 일요일 로 값을 반환한다.

public static string WeekDay(DateTime dateTime)
{
    //반환할 요일
    String weekDay = string.Empty;
    //입력받은 일자에 대한 요일정보
    var dt = dateTime.DayOfWeek;
    //프로그램에서 언어나 문화권에 대한 설정값을 받아온다.
    CultureInfo cultureInfo = CultureInfo.CurrentCulture;
    weekDay = cultureInfo.DateTimeFormat.GetDayName(dateTime.DayOfWeek);
    return weekDay;
}
반응형
반응형

오라클에서 BLOB 정보를 가져오는 쿼리를 MyBatis를 이용해서 작성하는 경우 BLOB 정보를 Map 형태로 바로 받으면 안되며, 반드시 ResultMap으로 받아야 한다.

<resultMap type="java.util.Map" id="imgResult">
	<result column="IMG" property="IMG" javaType="[B" jdbcType="BLOB"/>
</resultMap>

Select 절에서는 resultType이 아닌 resultMap을 이용해서 imgResult로 설정해야 한다.

<select id="select_img" parameterType="java.util.Map" resultMap="imgResult">
	select img from img_table where id = #{id}
</select>

이렇게 가져온 이미지를 컨트롤 단에서 사용 방법은 아래와 같다.

Map<String, Object> imgMap = imageService.select_img(map);
byte[] arr = (byte[]) imgMap.get("IMG");

String base64Encode = null;
if (arr != null && arr.length > 0) {
	base64Encode = byteToBase64(arr);
    base64Encode = "data:image/png;base64," + base64Encode;
}

private static String byteToBase64(byte[] arr) {
	String result = "";
    
    try {
    	result = Base64Utils.encodeToString(arr);
    } catch (Exception e) {
    	e.printStackTrace();
    }
    return result;
}

이렇게 가져온 base64Encode 의 값을 JSP 또는 HTML의 img 태그에 src로 할당하면 이미지를 브라우저에서 바로 볼 수 있게 된다.

반응형

'Java 기반 Web > Java' 카테고리의 다른 글

MyBatis 에서 어의 없는 오류..ㅠㅠ  (0) 2022.05.28
반응형

jquery datepicker를 이용해서 년월만 선택하고 싶을 때가 있다.
이때 유용하게 사용할 수 있는 방법이다.
활용성을 높이기 위해 공통 js파일에 show_calendar_month라는 Function을 정의해서 사용했다. 이렇게 이용을 하면 사용하고자 하는 페이지에서 보다 유연하게 사용할 수 있다.
input 파라미터로는 선택한 년월을 표기할 textbox의 id를 넣어 주면 된다.
년월 picker 기능은 모두 Function에 정의해 두고 호출만 하면 된다.

function show_calendar_month(obj) {
	$("#" + obj).datepicker({
		monthNames: [ "1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월" ],
		monthNamesShort: [ "1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월" ],
        changeMonth: true,
        changeYear: true,
        showButtonPanel: true,
        dateFormat: 'yy-mm',
        onChangeMonthYear: function (year, month, inst) {
        	$(this).val($.datepicker.formatDate('yy-mm', new Date(year, month - 1, 1)));
    	},
        onClose: function(dateText, inst) { 
            var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
            var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
            $(this).datepicker('setDate', new Date(year, month, 1));
        },
        beforeShow : function(input, inst) {
            if ((datestr = $(this).val()).length > 0) {
                actDate = datestr.split('-');
                year = actDate[0];
                month = actDate[1]-1;
                $(this).datepicker('option', 'defaultDate', new Date(year, month));
                $(this).datepicker('setDate', new Date(year, month));
            }
        }
    });
    
    $("#" + obj).focus(function () {
        $(".ui-datepicker-calendar").hide();
    });
    
    $('#' + obj).datepicker('show');
}

이렇게 정의한 Function을 html/jsp 파일에서 아래와 같이 호출만 하면 된다.

...
<td class="c" width="250px">
	<input type=text id="Fdate1" name="Fdate1" value='<cnsone:date value="${Fdate1}"/>' readonly style="width:70px;text-align:center;">
	<input type='button' onClick="show_calendar_month('Fdate1');" style="background:url(${WEBROOT}/images/icon/calendar.gif);border:0;width:16px;height:18px;cursor:hand;vertical-align:middle;">
</td>
...

스타일 시트를 추가해서 기존에 보이던 일자를 보이지 않도록 처리한다.
<style>
table.ui-datepicker-calendar { display:none; }
</style>
달력 아이콘 버튼을 클릭하면 아래의 이미지와 같이 년월 picker의 모습을 보게 된다.
년과 월만을 선택하는 UI를 datepicker를 이용해서 간단하게 만들 수 있다.

그림1 - 년월 Picker
반응형

+ Recent posts