전체 글 269

Interface(TInterfacedObject)와 TInterfaceList 이야기

TInterfaceList에 Interface를 하나 추가하면 그 해당 Inteface item의 RefCount는 어떻게 될까? 굉장히 궁금했던 사항인데 오늘 그 결과를 속시원히 파헤쳐 보았다. 1. TInterfaceList에 Inteface를 하나 추가하면 해당 Interface Item의 RefCount가 늘어날까? -> 증가한다. 1만큼 증가한다. 2. 그럼 TInterfaceList에서 item 하나를 빼면? -> RefCount가 1만큼 감소한다. 감소만 하는거지 TInterfaceList에서 뺐다고 해서 자동으로 삭제되는 건 아니다. 그냥 1만큼 감소만 하는거다. 그런데 만약 여기서 빼서 RefCount = 0이 되면 그 때는 자동으로 삭제된다. 3. Interface를 하나 생성하면 생성..

Dangling Pointer

Dangling Pointer는 더 이상 참조할 수 없는 포인터를 가리킨다. Dangling Pointer는 두가지가 있는데, 하나는 의도적인 거고, 하나는 버그다. 아래 델파이 코드를 보자. var P: Pointer;begin P := nil; if Assigned (P) then Writeln ('You won''t see this'); GetMem(P, 1024); {P valid} FreeMem(P, 1024); {P no longer valid and still not nil} if Assigned (P) then Writeln ('You''ll see this'); end; 위와 같을 경우, 맨 마지막, Pointer P가 바로 Dangling poingter다. Free만 시키고 NIL을 ..

프로그래밍 2006.10.10

MFC 탭컨트롤에 TCN_SELCHANGE 메시지 날리는 방법

탭컨트롤에 SetCurSel() 함수를 호출해도 탭은 바뀌지만 TCN_SELCHANGE 메시지는 날아가지 않는다. 그래서 딱 탭만 바뀌지 아무런 일도 일어나지 않는다. 그래서 탭컨트롤을 클릭할 것처럼 만들려면 TCN_SELCHANGE 메시지를 날려줘야 한다. 다음과 같이 한다. this->m_tab.SetCurSel(0); // 첫번째 탭을 선택한다. NMHDR nmhdr;nmhdr.code=TCN_SELCHANGE; nmhdr.idFrom=IDC_TAB1; nmhdr.hwndFrom=m_tab.m_hWnd;SendMessage(WM_NOTIFY,IDC_TAB1,(LPARAM)&nmhdr);

경로에서 드라이브, 경로명, 파일명, 확장자등 가져오는 방법

void _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext ); 를 쓰면 된다. MSDN에 샘플. #include #include void main( void ) { char path_buffer[_MAX_PATH]; char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; char fname[_MAX_FNAME]; char ext[_MAX_EXT]; _makepath( path_buffer, "c", "\\sample\\crt\\", "makepath", "c" ); printf( "Path created with _makepath: %s\n\n", path_buffer ); _splitpath..

다이얼로그 박스에서 CDirTreeCtrl 사용해서 트리에 폴더 목록 표시하기

샘플 다운로드 : 위와 같이 트리에 폴더 목록을 표시하도록 하자. 다음과 같이 헤더 파일에 CDirTreeCtrl 클래스 형의 인스턴스와 OnSelChangeTree2 함수를 추가하자. 이 함수는 CDirTreeCtrl 트리로부터 발생하는 TVN_SELCHANGED 메시지를 처리하기 위해 사용된다.// 구현 protected: HICON m_hIcon; CDirTreeCtrl m_TreeCtrl2; // 메시지 맵 함수를 생성했습니다. virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg void OnSelchangedTree2(NMHDR* pNMHDR, L..

CRectTracker 쓰는 법(간단)

CRectTracker 는 사각형 영역을 잡는데 쓴다. 위와 같은 그림은 많이 봐왔을거다. MFC에 들어있는 클래스이고, #include "afxext.h" 를 해줘야 한다. 헤더파일에 private: CRectTracker m_tracker;이렇게 선언해 주고, 사용해야 할 곳에서(예를 들어 버튼을 누른다거나) CRect rect(10, 10, 100, 100); m_tracker.m_rect = rect; m_tracker.m_nStyle = 0; m_tracker.m_nStyle |= CRectTracker::dottedLine; m_tracker.m_nStyle |= CRectTracker::resizeOutside; this->Invalidate(); 그리고 LButtonDown 이벤트에서 다음..