프로그래밍/델파이 80

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..

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"로 주면 동작을 하지 않습니다. "..

델파이 컴파일러를 감염시키는 바이러스 주의(델파이 4~7)

최근 델파이 컴파일러의 특정 dcu(sysconst)에 바이러스 코드를 심어 감염된 컴파일러를 통하여 빌드하여 배포되는 모든 프로그램에 바이러스가 함께 빌드되어 문제가 되어 있다고 합니다. 바이러스명은 W32/Induc-A Virus (or the Delphi Virus) 이고, 시스템에 심각한 영향을 미치지는 않지만, 몇몇 백신 프로그램에서는 바이러스 감염시 해당 실행파일을 삭제해 버린다고 합니다. 실행 프로그램 자체를 삭제해 버리면 배포된 프로그램에 심각한 영향을 주게 되는데 말이죠... 관련된 글들을 모아 봤습니다. Delphi 4~7을 감염시키는 바이러스 유행중 Virus infects Delphi ; 해외에서 발견된 바이러스 증상 현재까지의 바이러스 대처 상황 현재까지의 바이러스 대처 상황 #2

프로그래스바(TProgressBar) 색 바꾸기

프로그레스바의 색을 바꾸는 방법은 매우 간단합니다. 위 그림을 보면, 붉은색으로 색을 변경하였는데, SendMessage로 메시지를 보내면 색 변경이 가능합니다. SendMessage(ProgressBar1.Handle, PBM_SETBARCOLOR, 0, RGB(255, 0, 0)); PBM_SETBARCOLOR 상수가 CommCtrl에 정의되어 있으므로, 그 유닛을 포함해 줘야만 컴파일이 성공적으로 됩니다. 아래 위 데모의 예제 소스를 첨부합니다. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls, Co..

728x90