본문 바로가기
delphi

TComboBox의 항목 길이에 맞춘 가변 드롭다운 리스트 구현 방법

by doran365 2024. 8. 5.

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의 드롭다운 리스트가 항목의 길이에 맞추어 가변적으로 표시되어 모든 항목을 완전하게 볼 수 있게 됩니다.