delphi 7

정렬된 TStringList의 Add와 Find에 대하여...

특정 단어를 빠르게 검색하기 위하여 정렬된(Sorted := true) TStringList 객체를 사용하고 있었습니다. 그런데, 생각했던것 보다 성능이 매우 떨어졌습니다. 처음 구현할 때는 Find 메소드를 사용하지 않고 무조건 Add 메소드만을 이용했었습니다. Duplicates 속성에서 dupIgnore를 할당하여, 중복된 단어일 경우에는 음수 값을 반환할 것으로 생각했었기 때문입니다. 그래서 무조건 단어를 Add한 이후에 음수 값을 반환하면, 단어에 따른 부가 처리 부분을 수행하지 않도록 하였었습니다. 그러나 복병은 TStrings.Add 메소드에 있었습니다. Duplicates := dupIgnore를 할당하였어도 Add 메소드는, 중복된 단어인 경우에는 해당 단어의 위치값을 반환하고, 중복되지..

엑세스 바이얼레이션(Access Violation) 주소로 오류가 발생한 소스상의 위치 찾기

서론 델파이로 만든 프로그램을 일반 사용자들에게 배포할 때는 기본적으로 불필요한 디버깅 정보를 모두 제거하고 배포를 하게 됩니다. 따라서 유레카로그(EurekaLog) 등의 오류 추적 모듈이 없기 때문에, 다음과 같은 오류창을 만났을 경우 어디서 오류가 발생하였는지 알 수가 없어서 문제 해결이 어렵습니다. 사용자와 동일한 동작을 통한 재현으로 동일한 오류가 발생한다면 다행히도 쉽게 오류를 추적해서 문제를 해결할 수 있지만, 재현이 불가능하고 해당 사용자에게서만 위와 같은 오류창이 발생하게 되면 정말 난감하게 됩니다. 위와 같은 엑세스 바이얼레이션(Access Violation)창이 나타난 경우, 배포한 프로그램에 map 파일이 있다면 그 주소를 가지고 오류가 발생한 부분을 찾을 수 있습니다. 그 방법에 ..

잘동작하던 ActiveX가 기능 추가후, 먹통이 되어 버린 경험.

서론 기존에 잘 사용하던 ActiveX에 몇 가지 속성 및 기능을 추가할 일이 있어서 관련 작업을 하던 중에 좀 황당한 사건을 겪었습니다. 속성 및 기능 추가를 위하여 기존 프로젝트에 몇몇 새로운 유닛을 추가하고, 새로운 기능을 구현한 직후 테스트에서 잘 동작을 하였었습니다. 그러나 버그 수정을 위하여 몇번 빌드를 하고 테스트를 하던 과정중에 이상한 현상을 경험하게 되었습니다. 정말 특이하게도 그런대로 동작하던 ActiveX가 점차 꼬여 가더니, 결국에는 Type Library에서 속성을 수정하거나, 심지어 수정된 소스를 저장하려고만 하여도 델파이 IDE가 아무런 응답을 하지 않게 되버리는 문제가 발생하기 시작하였습니다. 더군다나 델파이를 재시작하고, 재부팅을 하여 겨우 ocx 빌드를 성공하여 테스트를 ..

성능비교(Round, Trunc, Floor, MulDiv, 정수연산)

화면에 표시하거나, 프린터에 인쇄를 할 경우 해상도에 따른 좌표 계산을 자주하게 됩니다. 좌표 계산을 위하여 위 정수연산을 하거나, Round, Trunc, Floor, MulDiv 등의 함수를 사용하게 됩니다. 그럼 이 방법들 중에서 가장 성능이 뛰어난 것은 무엇인지 갑자기 궁금하여 다음과 같이 간단한 소스로 성능을 실험해 보았습니다. var i, nX, nOldX: integer; dwStart, dwEnd: DWORD; begin nOldX := 50; dwStart := GetTickCount; for i := 0 to 10000000 do nX := Trunc(nOldX * 72. / 25.4); dwEnd := GetTickCount; Memo2.Lines.Add('Trunc(nOldX * 7..

Format와 wvsprintf

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

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

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

728x90