델파이 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 빌드를 성공하여 테스트를 ..

2010에서 Zeos 7.0 설치 및 MySQL 5.1.4와 테스트기

SourceForge에서 Zeos 7.0 Beta 버전을 받아서 설치하는데, Bpl 파일을 못찾는 오류가 계속 나서 왜그런가 봤더니, 프로젝트 옵션의 output directory가 각 패키지마다 달라서 발생한 문제였습니다. 모두 Build 디렉토리로 맞추거나, 아니면 모두 기본 디렉토리로 생성되도록 하면 됩니다. 오랫만에 Zeos로 MySQL DB 연동을 하는터라 좀 헤맸네요. 간단하게 ZConnection을 두고 테스트용 MySQL 정보를 입력하고, ZQuery로 간단한 SELECT 쿼리를 수행하는데 자꾸 한글이 깨지는 것이었습니다. 삽입 및 갱신도 한글이 깨지는 현상이 발생하였습니다. MySQL쪽 문자셋(charset)을 확인해 봤더니, 운영 시스템만 "UTF-8"이고 모든 DB 및 클라이언트 연결..

성능비교(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..

브라우저를 포함한 창의 크기를 HTML 소스에 따라 자동 조정하기

서론 델파이 프로그램을 만들다 보면 공지사항 팝업창의 경우 일일이 컴포넌트를 배치하여 프로그래밍 하는 것 보다는 손쉽게 HTML로 화면을 제적하고, 폼 안에 브라우저를 넣어서 필요한 화면을 HTML로 보여줄 경우가 있습니다. 이런 경우, 팝업 형태의 폼을 한 만들고 TWebBrowser나 TEmbeddedWB 컴포넌트를 위로 올려서 디자인된 HTML 화면 크기에 맞도록 ClientWidth, ClientHeight 값을 조정하여 하곤 하였습니다. 하지만, 이런 식으로 작업을 하게 되면 팝업 창으로 표시할 각 HTML 내용들이 모두 같은 크기라면 문제가 없지만, 서로 다른 크기라면 그 각각의 경우를 위하여 프로그램 소스에서 직접 ClientWidth, ClientHeight를 따로따로 코딩해 주어야 하고,..

728x90