TComboBox는 다양한 항목을 선택할 수 있는 편리한 컴포넌트입니다. 그러나 항목의 길이가 들쑥날쑥할 경우, 기본 설정으로는 모든 항목의 전체 내용을 표시하기 어렵습니다. 특히, 항목의 길이가 콤보박스의 너비보다 길 경우, 자동으로 커팅되어 표시됩니다. 본 기사에서는 TComboBox의 드롭다운 리스트를 항목의 길이에 맞추어 가변적으로 표시하는 방법을 자세히 설명하겠습니다.
기존 ComboBox 처리 내용
기본 설정
- DropDownCount: 드롭다운될 항목의 개수를 설정합니다. 이는 드롭다운 리스트의 높이를 결정짓는 요소입니다.
- 드롭다운 리스트 너비: 기본적으로 콤보박스의 너비와 동일합니다.
- 항목 길이: 항목의 길이가 콤보박스의 너비보다 길 경우, 자동으로 커팅되어 표시됩니다.
문제점
기본 설정으로는 TComboBox가 드롭다운될 항목의 너비를 지정할 수 있는 방법이 없습니다. 이는 긴 항목이 제대로 표시되지 않아 사용자 경험을 저하시킬 수 있습니다.
항목 길이에 맞춘 드롭다운 리스트 너비 지정 방법
Windows 메시지 사용
TComboBox의 드롭다운 목록 너비를 지정하기 위해 Windows 메시지인 "CB_SETDROPPEDWIDTH"를 사용할 수 있습니다. 이 메시지를 이용하여 허용 가능한 최소 너비를 픽셀 단위로 ComboBox에 보낼 수 있습니다.
SendMessage(theComboBox.Handle, CB_SETDROPPEDWIDTH, 200, 0);
위 예제는 theComboBox의 드롭다운 목록의 최대 너비를 200 픽셀로 제한하는 메시지를 보냅니다.
항목 길이에 맞춘 너비 지정 방법
드롭다운 리스트의 항목들을 모두 표시하기 위해서는 항목들 중 가장 긴 항목의 길이에 맞추어 너비를 지정하는 방법이 있습니다. 이를 위해 ComboBox_AutoWidth 프로시저를 구현할 수 있습니다.
procedure ComboBox_AutoWidth(const theComboBox: TCombobox);
const
HORIZONTAL_PADDING = 4;
var
itemsFullWidth: integer;
idx: integer;
itemWidth: integer;
begin
itemsFullWidth := 0;
// 드롭다운 상태에서 항목들의 최대 너비를 구함
for idx := 0 to -1 + theComboBox.Items.Count do
begin
itemWidth := theComboBox.Canvas.TextWidth(theComboBox.Items[idx]);
Inc(itemWidth, 2 * HORIZONTAL_PADDING);
if (itemWidth > itemsFullWidth) then itemsFullWidth := itemWidth;
end;
// 필요 시 드롭다운 너비 설정
if (itemsFullWidth > theComboBox.Width) then
begin
// 스크롤 바 유무 확인
if theComboBox.DropDownCount < theComboBox.Items.Count then
itemsFullWidth := itemsFullWidth + GetSystemMetrics(SM_CXVSCROLL);
SendMessage(theComboBox.Handle, CB_SETDROPPEDWIDTH, itemsFullWidth, 0);
end;
end;
폼의 OnCreate 이벤트 핸들러에서 프로시저 호출
폼이 생성될 때 ComboBox_AutoWidth 프로시저를 호출하여 콤보박스의 항목 길이에 맞추어 드롭다운 리스트의 너비를 지정합니다.
procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox_AutoWidth(ComboBox2);
ComboBox_AutoWidth(ComboBox3);
end;
동적으로 항목을 추가하거나 삭제하는 경우
콤보박스 내의 항목들이 동적으로 추가되거나 삭제되는 경우, OnDropDown 이벤트에서 ComboBox_AutoWidth 프로시저를 호출하여 드롭다운 리스트의 너비를 다시 설정할 수 있습니다.
결론
TComboBox의 항목 길이에 맞추어 가변 드롭다운 리스트를 구현하면 사용자 경험을 향상시킬 수 있습니다. Windows 메시지와 간단한 프로시저를 통해 이를 쉽게 구현할 수 있습니다. 위에서 설명한 방법을 따라하면, TComboBox의 드롭다운 리스트가 항목의 길이에 맞추어 가변적으로 표시되어 모든 항목을 완전하게 볼 수 있게 됩니다.
'delphi' 카테고리의 다른 글
문자열 목록에서 중복 제거를 위한 효과적인 방법 (0) | 2024.08.06 |
---|---|
다중 파일 삭제 방법("*"문자를 이용한 효율적인 파일 정리) (0) | 2024.08.06 |
TPrinter를 이용한 인쇄 시 무한루프 해결 방법 (0) | 2024.08.05 |
URLDownloadToFile을 이용한 다운로드 방법 (0) | 2024.08.03 |
이미지 파일명으로 사이즈(폭/높이) 알아내기 (0) | 2024.08.02 |