프로그래밍 319

AQTime을 이용한 프로파일링을 위한 델파이 7 프로젝트 옵션 설정 및 빌드

델파이 프로그램의 성능을 최적화하기 위한 프로파일링 도구로 자주 애용되는 AQTime으로 델파이 7 프로그램을 프로파일링하기 위한 컴파일 설정 방법에 대하여 알아 보겠습니다. AQTime에서 메소드별 혹은 라인별 프로파일링을 하려면, 디버깅 정보가 있어야 합니다. 이를 위하여 아래와 같이 Project Options에서 설정값을 변경해 주어야 디버깅 정보가 로딩되어 올바른 프로파일링을 할 수 있습니다. 아래 Project Options 설정 옵션들 중에서 붉은색으로 표시한 사항들은 반드시 설정해 주셔야 합니다. 꼭 런타임 패키지(runtime package)들을 사용하실 경우에는 AQTime에서 해당 런타임 패키지를 수동으로 추가해 주어야 합니다. 프로젝트 옵션을 모두 위와 같이 설정한 이후에는 프로젝트..

TIdMessage.GenerateHeader의 제목 처리 버그

Indy를 이용하여 메일 발송 프로그램을 만들어서 사용중이었습니다. 그런데, 특정 메일은 HTML 내용이 제대로 보이지 않고, 태그가 펼쳐져 보이는 것이었습니다. 원인을 분석해보니, SMTP서버로 메일을 보낼 때, TIdMessage에서 메일 헤더를 생성합니다. 그러나 이 부분에서 제목에 한글이 있는 경우 인코딩을 하는데, 제목이 긴 경우 특정 길이(75) 이하로 잘라서 헤더를 생성해주게끔 되어 있습니다. 문제는 헤더를 생성하는 부분에서 제목이 특정 길이(75) 이상인 경우 이미 올바로 헤더를 모두 만들어져 있는데, 그 값을 GenerateHeader에서 처리하는 부분에서 한번 더 불필요하게 처리를 하면서, 헤더 부분이 깨져서 메일 전체가 잘못되는 현상이 발생하게 됩니다. 이를 해결하기 위해서, 델파이7..

Format와 wvsprintf

델파이에서 문자열을 포맷팅하는 데 Format 함수를 사용하게 되는데, 숫자를 포맷팅하는 경우에 0으로 남은 문자를 채우는 기능이 아쉬울 경우가 많습니다. C 함수의 printf로 보자면, "%02d"는 Delphi의 Format로는 적용이 안됩니다. 윈도우에서 제공하는 wvsprintf 함수를 이용하면 이 문제를 해결할 수 있습니다. wsprintf도 비슷하게 해결할 수 있지만, 델파이의 Windows 유닛에 wsprintf 함수의 선언이 잘못되어 있어서 그대로는 사용이 불가능합니다. 아래는 시각을 표시하기 위하여 Format 함수를 이용하는 방법과 wvsprint 함수를 사용하는 예제코드입니다. procedure TForm1.Button1Click(Sender: TObject); var strTime..

ForceDirectoriesOfIdFTP ; 디렉토리 강제 생성하기

델파이로 FTP 프로그래밍을 하다가 보면, 특정 경로를 만들어야할 일이 생깁니다. 그런데 TIdFTP에서 기본으로 제공하는 MakeDir 메소드는 현재 위치에서 바로 아래의 디렉토리만 생성이 가능합니다. SysUtils.ForceDirectories 함수와 같이 경로를 따라가며 없을 경우 강제로 모두 생성해 주는 메소드가 없어서 직접 만들어 봤습니다. 그럼, 유용하게 쓰시길~ {** FTP 서버에 접속된 IdFTP 객체에 지정한 경로의 디렉토리를 강제로 생성합니다. IdFTP에 대한 ForceDirectories 버전 @param AIdFTP FTP 서버에 접속된 IdFTP 객체 @param strMakeDir 생성할 디렉토리 경로 *} procedure ForceDirectoriesOfIdFTP(AId..

델파이 IDE 환경정보를 그대로 활용하자.

델파이 IDE를 내마음에 맞게 수정하여 그 상태를 그대로 기억시켜 놓는 유용한 기능이 있습니다. "Save Desktop" 기능인데, 이를 이용하여 내가 설정해 놓은 Desktop화면으로 코딩 및 디버깅이 가능합니다. Desktop 모드가 두 가지가 있는데, 일반적인 코딩(디자인)시에 사용하는 Desktop과 디버깅시 이용할 수 있는 Desktop이 있습니다. 디버깅시에는 코딩(디자인)시와는 다르게 Watch창 등을 추가해 놓고, 편리하게 디버깅할 수 있는 환경을 마련해 놓으면 더욱 유용하겠죠. 아래 그림과 같이 Desktop speedsetting에서 미리 기억시켜둔 Desktop으로 바로 전환이 가능하고, 그 옆의 "Save Desktop" 버튼을 이용하여 새로 설정한 Desktop을 새롭게 기억시킬..

TMonthCalendar에서 날짜 선택에 대한 이벤트 확장하기

델파이 컴포넌트들 중에서 Win32에 있는 TMonthCalendar는 달력을 화면에 표시한 이후에, 날짜를 선택할 때 주로 사용하는 컴포넌트이지만, 한 가지 단점이 있습니다. OnChange 이벤트로 날짜 선택여부를 확인할 수 없다는 점입니다. OnChange 이벤트는 날짜를 선택하지 않고, 월을 바꾸거나 년도를 바꾸어도 발생하게 됩니다. 이를 해결하기 위하여 CN_NOTIFY 이벤트를 서브클래싱할 수도 있지만, 동일한 기능을 TMonthCalendar 클래스를 상속받아 OnSelectDay 이벤트로 추가한 새로운 컴포넌트로 만들어 봤습니다. 아래 소스를 참고하시기 바랍니다. interface uses Classes, SysUtils, Windows, Messages, Controls, CommCtrl..

SyntaxHighlighter 2.0.320 적용

아무런 생각없이 스킨을 변경하였더니, 기존에 적용해 놓았던 SyntaxHighlighter 1.5가 사라져 버렸습니다. -_-; 그래서 다시 자료를 받으려고 검색을 해보았더니, 지난 2월에 SyntaxHighlighter 2.0.320 새로운 버전이 나와 있더군요. 새로운게 당연스럽게 좋을것이라 여기고 무작정 적용을 해 놓았더니만, 결정적으로 기존에 적용해 놓았던 태그를 모두 수정해 줘야만 하는 문제가 -_-; 괜스레 긁어 부스럼을 만든듯한 느낌입니다만, 그대로 새로운 언어들에 대한 하일라이팅을 지원한다는 점에 위안을 삼기로 하고, 일단 표시 안되는 부분들은 그대로 두고, 시간 나는대로 하나씩 다시 수정을 해줘야 겠네요.. 적용하는 방법은 매우 쉽습니다. 스킨의 HTML 소스의 마지막에 다음을 추가해줍니..

프로그래밍 2009.10.09

WinInet Component Suite를 이용한 파일 업로드(POST) 예제

앞서 WinInet Component Suite를 소개했었습니다. GET 방식에 대한 예제만 있었는데, 이번에는 POST 방식으로 파일 업로드하는 예제를 소개하겠습니다. 파일을 업로드 하기 위해서는 multipart/form-data로 데이터를 전송해야 합니다. multipart/form-data 형식으로 데이터를 직접 만드는 방식 보다는, 인디에 이미 클래스화 되어 있는 TIdMultiPartFormDataStream로 간단하게 만들 수 있습니다. 자세한 내용은 아래의 소스를 참조해 주시기 바랍니다. uses IdMultipartFormData, WINet var AIdMultiPartFormDataStream : TIdMultiPartFormDataStream; AStringStream : TStri..

Internet Explorer7 에서 현재 활성화 되있는 탭윈도우 핸들 얻기

Internet Explorer7 에서 현재 활성화 되있는 탭윈도우 핸들 얻는 방법입니다. 아래는 C++ 코드입니다. #include HWND GetTabWnd(CComQIPtr spBrowser) { HWND hwndTab = NULL; CComQIPtr spServiceProvider = spBrowser; if (spServiceProvider != NULL) { CComQIPtr spWindow; if (SUCCEEDED(spServiceProvider->QueryService( SID_SShellBrowser, IID_IOleWindow, (void**)&spWindow))) { spWindow->GetWindow(&hwndTab)); } } return hwndTab; } 아래는 델파이 코드입..

Live Templates(라이브 템플릿)

Delphi 2007부터 포함된 Live Templates 기능의 데모 그림이 아래와 같습니다. 기존 델파이에서도 이미 제공하는 기능이었지만, 아래 데모에서 보시는 것과 같이 좀더 사용하게 쉽도록 기능이 향상되었습니다. 아래 데모는 try... finally 구분에 대한 데모인데, 주로 객체를 소멸을 보장하기 위한 코드를 작성하는 간단한 사용 예를 보여줍니다. 생성할 클래스까지 자동으로 지정하고, 탭()키로 다음 입력할 항목으로 이동하고, 엔터()키로 마무리 템플릿 편집을 마무리합니다. 다음은 델파이 IDE에서 기본적으로 제공하는 템플릿 목록입니다. 직접 템플릿을 작성할 때, 주의해야할 점은 대소문자 구분을 명확히 해야 한다는 점입니다. 언어 속성의 값을 "delphi"로 주면 동작을 하지 않습니다. "..

728x90