글쓴이: 박지훈.임프

Delphi/C++Builder 컨설턴트, 볼랜드포럼 운영자, 데브퀘스트 대표

고속 압축 알고리즘 비교 테스트: LZO/Snappy/SynLZ/LZ4/QuickLZ/Zlib

통상적인 시각으로는 파일 압축이란 가급적 작은 크기로 줄이는 압축률을 우선으로 따지지만, 그런 용도 외에 아주 빠른 압축 알고리즘이 필요할 때가 있습니다. 그런 경우는 주로, 전체 프로세싱 작업 구간들중에서 메모리 속도보다 훨씬 느릴 수밖에 없는 네트워크 전송 구간이나 디스크 저장 구간의…

FireDAC: FDMemTable vs. ClientDataSet Android 성능 비교

Delphi 및 C++Builder의 새로운 데이터 액세스 컴포넌트로 추가된 FireDAC은, 다양한 데이터베이스 서버들을 지원할 뿐만 아니라 기능 면에서도 대단히 강력합니다. 또한 성능도 매우 뛰어난데요.그런데 성능 면에서의 장점 설명들은 보통 윈도우 플랫폼에 치중되어 있습니다. 최근 저는 Delphi 기반 Android 프로젝트를 진행하던 과정에서, 안드로이드에서 FDMemTable의…

FireDAC에서 DB2 AS/400 네이티브 연결 (수정)

IBM의 중형 컴퓨터 AS/400 (iSeries, System i)은 역시 IBM의 메인프레임(zSeries, System z)과 마찬가지로 매우 폐쇄적인 시스템으로, OS 자체적으로 데이터베이스 서버도 내장하고 있는 것이 한 특징입니다. AS/400의 OS 자체가 데이터베이스와 완전히 통합되어 있는 구조인데요. AS/400의 데이터베이스를 'DB2'라고 부르기는 하지만 유닉스나 윈도우, 리눅스…

ZXing.Delphi 바코드 스캔 예제 소스

앞서 바코드 스캔 라이브러리 ZXing.Delphi에 대한 소개와 버그 수정에 대한 포스트를 올렸는데요. 이번에는 이 라이브러리를 제대로 사용하기 위한 예제 프로젝트에 대해 설명해보겠습니다. 원론적으로 보면, ZXing.Delphi 라이브러리의 사용법 자체는 꽤 간단합니다. 먼저 TScanManager 객체를 생성해놓습니다. 카메라를 액티브시킨 후, TCameraComponent의 OnSampleBufferReady 이벤트가 발생되면 이벤트…

FMX: 바코드 스캔 라이브러리, ZXing.Delphi 소개 및 버그 수정

ZXing.Delphi

저는 현재 공장 자동화 목적의 안드로이드 앱을 개발중인데, 라인/공정별 각 단계마다 라벨에 찍혀있는 QR code를 스캔하는 기능이 필요합니다. (QR code도 바코드의 한 종류로서 2D barcode에 속합니다) 바코드를 스캔하는 방법에는 바코드 스캐너 전용 기기를 사용하는 경우와 스마트폰/태블릿 등의 범용 기기를 이용하는…

FMX: CameraComponent의 Quality 속성 버그

안드로이드 기반 단말기를 위한 앱을 개발하던 중, Firemonkey 카메라 컴포넌트의 해상도 설정 기능에서 작은(?) 버그를 발견했습니다. 기기의 최고 해상도보다 해상도를 낮춰 설정한 후 카메라를 재구동하면 해상도가 최고 해상도로 강제 설정되어버리는 것입니다. 더 골치아픈 것은, 이것을 막기 위해 카메라 재구동 전에 해상도를…

지정 시간 후 자동으로 닫히는 Modal 폼

잘 아시다시피 델파이/C++빌더에서 폼을 여는 방식에는 Show와 ShowModal 두 가지 방법이 있습니다. 각각 modeless, modal이라고 하는데요. modal로 폼을 연다는 것은 해당 폼을 닫기 전에는 다른 폼으로 입력 포커스를 이동할 수 없도록 강제하는 것입니다. 그런데 가끔은, modal 방식으로 폼을 열었으면서도 일정…

with 구문의 위험성 – cxGrid 및 TRect의 사례

델파이(오브젝트 파스칼) 언어에서 with 구문이 종종 위험할 수 있다는 말은 델파이 개발자라면 한번쯤은 들어보셨을 겁니다. with 구문은 그 블럭 안의 식별자가 어느 객체에 속한 것인지를 모호하게 만들 수 있기 때문인데요, 주로 self에 속한 멤버와 with에 속한 멤버 사이에서 문제가 발생하기…

DBGrid에서 체크박스로 멀티셀렉트 하기

저 개인적으로는 그리드 컴포넌트로는 서드파티인 DevExpress의 cxGrid를 주로 사용하기 때문에, 간단한 로직 검증 테스트 목적 외에는 TDBGrid를 잘 사용하지 않습니다. 하지만 제가 지원하는 여러 사이트들 중에는 업무용 기본 그리드 컴포넌트로 TDBGrid를 사용하고 있는 경우가 종종 있습니다. 지난주 제가 기술지원을 하고 있는…

초중고 SW 교육 의무화 반대, 두번째 이야기

며칠전에 쓴 초중고 SW 교육 의무화 추진을 중단하라 글에 제가 예상치도 못했던 엄청난 반응이 쏟아졌습니다. 페이스북과 블로그 본문을 통해 반박 의견도 일부 있었지만 공감한다는 의견과 페이스북 좋아요가 줄을 이었네요. 사실 저는 이런 일로 주목받는 것을 즐기는 사람은 아닌, 가평 시골에 묻혀…

초중고 SW 교육 의무화 추진을 중단하라

지난 6월 26일, 모 언론에 SW 교육 정규과정화가 무산될 위기에 처했다는 기사가 실렸었습니다. SW 정규교과 도입 결국 무산? 저는 그 기사를 보고 정말 다행이다라고 가슴을 쓸어내렸었습니다. 그런데 어제 난데없이 SW 정규과정화를 내년부터 중학교에 강제하고 2017년부터는 초등학교에도 실시겠다는 기사가 나왔고, 곧이어…

파일 진행 상황을 보여주기 – TImpFileStream

Delphi, C++Builder 개발자들에게 TStream 클래스는 아주 친숙하죠. TStream은 TFileStream, TMemoryStream, TBlobStream, TWinSocketStream 등으로 상속되어 TStream의 인터페이스로 여러 컴포넌트 및 루틴들에서 사용됩니다. 특히 TFileStream은 Delphi와 C++Builder에서 로컬의 파일을 읽어들이고 쓰는 데 가장 일반적인 방법으로 많이 쓰이고 있습니다. 그런데, 대용량의 파일을 읽고 쓰는 작업을 하거나 혹은 네트워크를 통해…

Windows Server 2008에서 “Could not load file or assembly Microsoft.Build.Framework…” 에러

윈도우 서버 2008 OS에 델파이/C++빌더의 최근 버전들(2010~XE5)을 설치한 경우, 기본 상태에서는 컴파일하려고 할 때 컴파일러 에러가 뜨면서 컴파일이 되지 않습니다. 정확한 에러 메시지는 다음과 같습니다.

이 에러가 발생하는 원인은, 델파이/C++빌더(이하 RAD Studio)의 최근 버전들이 컴파일에 이용하는 빌드엔진인 MSBuild가 없어서입니다. MSBuild는 .NET 프레임워크에…

TClientDataSet+TDBNavigator가 극도로 느려지는 문제에 대한 해결책

개인적으로 저는 잘 사용하지 않지만, DBNavigator 컴포넌트는 데이터베이스 애플리케이션에서 정말 유용한 컴포넌트입니다. TDBNavigator의 역할은 현재 연결되어 있는 데이터셋의 레코드 단위 운영을 위한 컴포넌트로서, 아시다시피 데이터셋의 앞으로/뒤로, 최초/최종 등의 작업을 위한 UI를 간단히 구성해줍니다. 그런데, 델파이/C++빌더의 XE2 이후 버전들부터는, 이 TDBNavigator가 TClientDataSet과 연결해서…

RichEdit 컨트롤의 특이한 버그

이 버그는 아주 특이한 조건에서만 발생하기 때문에 대부분의 개발자들에게는 별 상관이 없겠습니다만... 기록삼아 적어둡니다. 폼에 TRichEdit를 놓고, 아래와 같이 몇가지 속성들을 조정합니다.

이 상태로 컴파일하고 실행해보면, 분명히 디자인시에 리치에디트에 아무런 내용을 넣지 않았음에도 실행된 프로그램에서는 다음과 같이 깨진 문자열이…

Windows7에서 THeaderControl 섹션의 OwnerDraw 문제

이번 포스트에서는, 윈도우7의 Aero UI에 맞게 THeaderControl의 헤더섹션을 제대로 OwnerDraw 하는 방법에 대해 살펴봅니다. THeaderControl은 글자 그대로 헤더 섹션들을 정의해놓은 헤더 컨트롤입니다. ListView에도 포함되어 있구요. 이 HeaderControl의 각 섹션에는 Text 속성을 통해 나타날 텍스트를 지정해줄 수 있습니다. 그런데 이 Text에는 멀티라인, 즉 여러…

임프의 dfm 폼 컨버터

Delphi 및 C++Builder에는 dfm 폼 파일을 바이너리에서 텍스트로 혹은 그 반대로 변환하기 위한 유틸리티 convert.exe가 포함되어 있습니다. 일반적으로는 텍스트 포맷의 dfm 파일이 유리한 점이 많은데, 예를 들면 당연히 텍스트 파일만이 diff가 가능하기 때문에 SubVersion 같은 버전 관리 시스템에서 관리하기도 편리합니다. Delphi…

Undocumented: InputBox 함수에서 Password 입력 받기

간단하지만 경우에 따라 꽤 유용하게 쓸 수 있는 팁입니다. (아쉽게도, Delphi/C++Builder의 XE2  버전 이상에서만 가능한 기능입니다 -.-;;) VCL에 InputQuery와 InputBox라는 함수가 있습니다. 아주 초보적인 함수인데, 아주 자주 쓰는 개발자도 있고 전혀 존재조차 모르는 분들도 꽤 많이 있습니다. 이 두 함수는 본질적으로…

XE3/XE4에서 TClientDataSet의 한글 길이 버그, 패치 파일

앞서의 글, http://blog.devquest.co.kr/imp/786에서 썼던 문제, 즉 TClientDataSet에서 10자 이상의 한글 필드를 사용했을 때 'Field xxx not found' 에러가 발생하는 문제에 대한 패치를 만들었습니다. 반나절 가까이 작업했네요. 엠바카데로에 버그리포트는 올리지 않을 생각입니다. 알고 있는 버그들이 꽤 많은데, 이 한건을 리포트하고 나면 나머지 버그들은…