Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

[11.3] TControlList 컨트롤에서 여러 항목 선택 가능


Recommended Posts

마르코 칸투 (Marco Cantu)"The New VCL ControlList Multiple Selection in Delphi 11.3" 을 번역했습니다. (원문 작성: 2022년 3월, 최종 번역: 2023년 3월)

TControlList는 몇년 전에 새로 도입된 컨트롤이다. 그리고 이번 11.3 버전에서 더 향샹되어, 이제는 여러 개 항목 동시 선택 설정 옵션이 추가되었다.

ControlList란 무엇인가?

ControlList는 완전히 가상 방식을 사용하기 때문에 리스트 항목이 매우 많아도 잘 다룰 수 있다. 리스트에는 데이터와 함께 컨트롤들을 담을 수 있는데, 실제로는 메모리 안에 패널(panel) 하나가 단일 인스턴스로 들어 있으며, 그 패널 안에서 리스트에 있는 각 항목이 그려진다. 따라서 항목이 수천 심지어 수백만 개 인 경우에도 문제없이 처리한다.

이 단일 패널(panel)은 그 안에서 리스트의 항목이 표현되는 시점에, 표현할 컨트롤들을 업데이트하도록 프로그램에게 요청한다. 이런 요청을 하게 만드는 항목은 오직 패널을 통해 보여지는 범위 안에 있는 (몇개 정도의) 항목 (몇 개 정도) 밖에 없다는 점을 고려하면, 이  TControlList는 최소한의 처리 작업만으로도, 항목이 매우 많은 리스트를 사용자가 스크롤 할 때 자연스럽게 처리한다.

아래 그림은 이 컨트롤리스트에 레이블(label) 하나만 넣은 간단한 구성을 하는 개발 화면이다.

spacer.png

이 레이블에 항목의 순번을 표현하려면, 아래와 같이 코드를 작성하면 된다.

procedure TForm19.ControlList1BeforeDrawItem(AIndex: Integer; ACanvas: TCanvas;
  ARect: TRect; AState: TOwnerDrawState);
begin
  Label1.Caption := 'Item ' + (AIndex + 1).ToString;
end;

컨트롤 리스트 안의 항목이 별도로 존재하지 않으며 항목 상태라는 개변도 없다는 점을 위 코드에서 눈여겨 보라. 이 리스트의 요소를 처리하기 위한 위 이벤트 핸들러가 아닌 그 바깥에서 Label1의 Caption을 접근하는 것은 아예 말이 되지 않는다. 이 컨트롤 리스트의 ItemCount 프로퍼티를 100으로 지정하며 항목 갯수를 지정하면 실행 시 보이는 UI 화면은 다음 그림과 같다.

 spacer.png

사용자가 목록에서 항목 하나를 선택했을 때, 그 항목 무엇인지를 알아내는 코드는 다음과 같다.

Memo1.Lines.Text := 'Single selection: ' + (ControlList1.ItemIndex + 1).ToString;

ControlList에서 여러 항목 선택 허용하기

11.3 버전에서 TControlList에 MultiSelect 프로퍼티가 새로 들어갔다.

복수 항목을 선택할 수 있게 개발자가 지정하면, 최종 사용자는 Ctrl+클릭, Shift+클릭을 사용하여 여러 항목을 선택할 수 있다. Ctrl 키를 사용하여 원하는 항목을 하나하나 선택할 수 있고, Shift 키를 사용하여 특정 범위 안에 있는 모든 항목을 선택할 수 있다. 윈도우의 일반적인 리스트박스와 같은 방식이다. 선택된 항목을 해제할 때에도 마찬가지 키를 사용한다. 즉 "토글 선택" 방식이다. 여러 항목을 선택한 예시 화면은 다음과 같다.

spacer.png

선택된 항목을 프로그램에서 알 수 있도록 하려면, TControlList의 Selected 프로퍼티 (배열이다)를 사용한다. 예를 들면 아래 코드와 같다.

    for var I := 0 to ControlList1.ItemCount - 1 do
      if ControlList1.Selected[I] then
        Memo1.Lines.Add((I + 1).ToString);

 

 

11.3 버전의 변경을 요약한 글 보기

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.