GSI

void ChoiceDirectoryPath(char* pathFolder)
{
 ASSERT( pathFolder );
 
 sprintf( pathFolder, "" );
 
 //CString m_strDirPath;
 ITEMIDLIST *pidlBrowse;
 char pszPathname[MAX_PATH];
 BROWSEINFO BrInfo;
 BrInfo.hwndOwner = NULL; //GetSafeHwnd();
 BrInfo.pidlRoot = NULL;
 memset( &BrInfo, 0, sizeof(BrInfo) );
 BrInfo.pszDisplayName = (LPSTR)pszPathname;
 BrInfo.lpszTitle = _T("폴더를 선택해 주세요.");
 BrInfo.ulFlags = BIF_RETURNONLYFSDIRS;
 // 다이얼로그 뛰우기
 pidlBrowse = SHBrowseForFolder(&BrInfo);
 if(pidlBrowse != NULL)
 {
  BOOL bSuccess = ::SHGetPathFromIDList(pidlBrowse, (LPSTR)pszPathname);
  if( bSuccess )
  {
   sprintf( pathFolder, "%s", pszPathname );
  }
 }
}

// 사용할때
 char szDirectory[MAX_PATH];
 ZeroMemory( szDirectory, sizeof(szDirectory) );
 ChoiceDirectoryPath( szDirectory );
 if( strlen(szDirectory) <= 0 )
  return 0;

Posted by gsi
:

void CDlgProgPage::OnBnClickedBtnProgBackgroundload()
{
 // 이미지 로드 - 여기에 오픈 다이얼로그를 적용해야징.
 // 이미지가 로드 되고 나면 화면을 업데이트 한다.
 CFileDialog OpenDlg( TRUE, "Add Files", "*.*", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT,
  "Bitmap Files(*.*)|*.bmp|Jpeg Files(*.*)|*.jpg|PNG Files(*.*)|*.png|AVI Files(*.*)|*.avi|All Files(*.*)|*.*|" );

 if( OpenDlg.DoModal() == IDOK )
 {
  // 이미지 정보를 View로 보낸다.
  g_ProgView->SetBackgroundImage(GetImage(OpenDlg.GetPathName()));
  // 백그라운드 이미지가 있다면 체크박스 속성을 활성화 한다.
  CheckBackgroundImage();
 }
}

Posted by gsi
:


모니터링 툴 개발 코드를 싸그리 날렸네욤.. 덜덜덜..

사실 요놈으로 출퇴근 하면서 개발중이긴 한데..
이것도 하다 보니 키보드 치는게 느는군요.. 사람이란게 대단한건지...

그래도 이걸로 VS 2008, Blend 등등을 다 돌려 가면서 작은 화면에서
하다 보면 지하철에서 이상한 넘이라고 가끔 보는 사람들도 있더군요..
아마도 그 분들은 프로그램을 하신 분들일듯 합니다. ^^..

다시금.. 목표를 세우고.. 작업을 해야 될듯 합니다.
Posted by gsi
:


DB, Webservice, C#, WPF를 통합적으로 공부 하기 위해서.
현재 모니터링 툴을 하나 개발 중이다.

대충 이런 개념이다.

프로그램을 하다 보면 로그를 남겨야 하고,
그 로그로 인한 상태 정보를 파악하고자 할때가 많다.
그래서 그 로그 정보를 해당 DB로 저장하도록 한다.

웹 서비스를 통해서 해당 로그 정보를 DB로 저장하게 된다.

그리고 모니터링 툴은 현재 변경된 정보만을 DB에서 웹 서비스를 통해서
지속적으로 화면에 출력하게 된다.

출력되는 내용에 따라서 에러나 경고 메시지는 창을 통해서 새롭게 출력이 되게 된다.

대충 이런 개념이다.

현재 DB, 웹 서비스 부분은 완료 되었으며,
모니터링 툴의 UI 부분도 대충은 마무리가 되어 가고 있다.

심플하게 구성해 봤지만.
다양한 어플리케이션을 배울 수 있는 아주 좋은 프로젝트인듯 하다.

이후에 다양하게 응용할 부분은 해당 어플리케이션의 시스템 상태 정보를 볼수 있는 경우나,
IDC 센터의 서버를 이용해서 모니터링을 받게 되면, 유지 보수 및 원격지에서도
해당 어플리케이션의 정보를 탐색이 가능할듯 하다.

이후에는 프로그램의 노가다를 최대한 줄이기 위한 나만의 복사코드를 DB화 해서
원격지에서 해당 클립 보드로 전송하고, 그 내용을 바로 적용 가능하도록 하고
더 나아가면, 음성 인식 시스템을 도입해서, 해당 내용을 빠르게 검색하고
내용 전송을 통한 코드 적용을 극대화 하는 것도 연구중이다.

이 부분에서는 음성 인식 패턴을 다양하게 구축할 수 있는 서버가
관건인듯 하지만.. 아직은 자금이나, 아이디어가 많이 부족하기 때문에.
다양한 단위 테스트를 통한 학습을 우선 해야 할듯 하다.

우선 모니터링 툴에 대한 일부 내용들은 내가 WPF용으로 따로 만든 티스토리 페이지에서
지속적으로 업데이트할 생각이다.

WPF 관련된 내용은 여기 페이지가 많아지는 걸 없애기 위해서
그쪽에서 여러가지 테스트를 통한 내용들을 정리할 생각이다.

바쁘지만.. 요즘 같은 시기가 나에게는 다시금 오지 않을 30대 초반의
자유인듯 하다.
Posted by gsi
:

C# Deep Copy

C# 2008. 9. 24. 20:06 |


C#을 사용하다 보면 포인터의 개념이 없기 때문에 클래스인 경우는 참조 형태로 처리가 되는거 같아요.

A 의 클래스를 a, b로 선언하고 a의 값을 b로 대입하게 되면 참조 형태가 되어서 a의 값을 바꾸게 되면
결국에 b의 값도 바뀌게 되는 경우가 있습니다.

물론 데이터형인 경우는 깊은 복사가 이루어 지지만 클래스인 경우는 일반 복사가 이루어 지는듯 합니다.
간혹 깊은 복사를 해야 할때가 오는데요..

ICloneable을 상속 받아서 처리 하면 아래와 같이 처리 하면 될듯하네요.

// 샘플 코드
    class Cell : ICloneable
    {
        string var;

        public string Var
        {
            get { return var; }
            set { var = value; }
        }

        public Cell(string var)
        {
            this.Var = var;
        }

        public object Clone()
        {
            return new Cell(this.Var);
        }
    }

    class Cells : List<Cell>, ICloneable
    {
        public Cells()
        {
        }

        public object Clone()
        {
            Cells listCell = new Cells();
            foreach (Cell c in this)
            {
                listCell.Add((Cell)c.Clone());
            }

            return listCell;
        }
    }

Posted by gsi
: