


09/12/2021 (버전 1.7)
03/13/2021 (버전 1.6)
02/01/2021 (버전 1.5)
20/18/2020 (버전 1.4)
10/31/2020 (버전 1.3)
10/27/2020 (버전 1.2)
10/26/2020 (버전 1.1)
05/03/2020
02/11/2019
02/08/2019
02/07/2019
ListBox를 사용하는 경우 일반적으로 ListBox 항목에 개체를 할당 할 때 OnDrawItem 이벤트를 사용하여 ListBox에 열을 표시/그리기하려고합니다.
괜찮지 만 열을 표시 할 헤더 컨트롤이 없으며 사용자가 크기를 조정하고 이동하고 열을 표시/숨길 수 없습니다.
THEADERCONTROL (DELPHI DEFAULT CONTROL)은 이러한 작업 중 일부를 허용하지만, 모든 단일 목록 상자에 대해 많은 코드를 작성하고 다시 페인팅 항목을 관리하고 열 위치를 계산해야합니다. 물론, 당신은 Hide/Show 열 기능을 사용할 수 없습니다.
그래서 저는이 구성 요소를 작업 해 왔으며 매우 유용하기 때문에 공유하기로 결정했습니다.
또한, DZLISTHEADER는 열이 보이는 영역을 대체 할 때 스크롤 막대를 표시합니다. ?
Delphi XE3를 지원합니다. Delphi 11
DZLISTHEADER를 양식으로 떨어 뜨린 다음 DZLISTHEADER 내부의 목록 상자를 떨어 뜨립니다.
dzlistheader.listbox = listbox를 설정합니다.
dzlistheader.columns 속성에서 원하는 열을 만듭니다 (디자인 시간에 열을 볼 수 있음).
그런 다음 dzlistheader의 ondrawitem을 작성하십시오 (Listbox의 OnDrawItem이 아닙니다.이 할당되지 않은 상태로 두십시오). 모든 단일 열을 쉽게 그릴 수 있도록 dzlistheader.dwcol 방법을 호출하십시오.
기본 기능을 알기 위해 예제 폴더를 참조하십시오.
이 아이디어에 따라 dzlistheader (Listbox 아님)의 outDrawItem을 작성해야합니다.
procedure TForm1.DzListHeaderDrawItem (Control: TWinControl; Index: Integer; Rect: TRect;
State: TOwnerDrawState);
var P: TPerson;
begin
P := TPerson(ListBox.Items.Objects[Index]);
DzListHeader.DwCol( 0 , Rect, P.ID);
DzListHeader.DwCol( 1 , Rect, P. Name );
DzListHeader.DwCol( 2 , Rect, P.Gender);
end ;그저 그렇게!
이 구성 요소는 두 번째 사용 옵션을 제공하므로 객체를 사용할 필요가 없으며 항목을 그리기 위해 코드를 작성할 필요가 없습니다. 이 옵션에서는 탭 문자로 분리 된 텍스트 셀이있는 항목을 추가해야합니다.
다음 테이블이 있다고 가정 해 봅시다.
| ID | 이름 | 핸드폰 |
|---|---|---|
| 1 | Jhon | 1111-2222 |
| 2 | 사라 | 3333-4444 |
| 3 | 알프레드 | 5555-6666 |
따라서 자동 조정 탭 텍스트 속성을 활성화하고 다음과 같은 탭 문자로 분리 된 셀이있는 ListBox에 항목을 추가하십시오.
1[TAB]JHON[TAB]1111-2222
2[TAB]SARAH[TAB]3333-4444
3[TAB]ALFRED[TAB]5555-6666
참고 : [탭]은 #9 문자를 나타냅니다
그런 다음 원하는 열을 구성하십시오. 이 예에서는 열이 있습니다 : id, name, phone. 코드 라인이 없으면 목록의 모든 항목을 인쇄하고 열 매개 변수로 정렬합니다.
런타임에 항목을 추가하려면 탭 분리 된 텍스트로 변환 될 문자열 배열을 지정하는 additem 함수를 사용할 수 있습니다.
셀 드로우를 사용자 정의하려면 탭 텍스트와 함께 ondrawitem을 사용해야 할 수도 있습니다. 이 경우 AutoDrawTabbedText를 비활성화하고 이벤트를 작성한 다음 getItemArray를 사용하여 현재 항목의 배열을 추출하여 DWCOL 방법을 사용하여 셀을 구하기 위해 분리되었습니다.
대화 상자 사용자 정의를 열려면 헤더 또는 열의 모든 부분을 마우스 오른쪽 버튼으로 클릭하십시오. 대화 상자 사용자 정의에서 열을 재정렬하고 열을 표시/숨기고 기본 순서를 설정할 수 있습니다.
AllowMoving: Boolean = 열을 활성화/비활성화
AllowResize: Boolean = 열을 활성화/비활성화 이동
AutoDrawTabbedText: Boolean = AutoDrawTabbedText를 사용할 때 객체 나 ondrawitem을 사용할 필요가 없습니다. 탭 구분 기호를 사용하여 열을 분할 된 열 상자에 항목을 추가 할 수 있습니다. 이 경우 항목을 그리기 위해 코딩 할 필요가 없습니다. 탭 텍스트와 함께 사용할 수있는 두 가지 방법이 있습니다. additem (항목 배열 추가, 구성 요소는 탭 텍스트에서 자동으로 변환); getArrayText (요청 된 색인 배열을 반환). 이 속성을 여전히 비활성화하고 탭 텍스트로 작업하고 이벤트를 작성하고 getArraytext를 사용하여 분리 된 열의 텍스트를 읽을 수 있습니다.
ColorNormalCol: TColor = 열 배경색
ColorHoverCol: TColor = 열에 마우스를 할 때 열 배경 색상
ColorLineNormal: TColor = 홀수 라인이 아닌 경우 (또는 useodd 비활성화), 선택된 선이 아닌 경우 라인 배경색 (목록 상자)
ColorLineOdd: TColor = 홀수 라인 및 useodd가 활성화 된 경우 라인 배경색
ColorLineSel: TColor = 선을 선택할 때 라인 배경색
ColorShape: TColor = 오리엔테이션 이동 또는 크기 조정을 나타내는 대시 색상
Columns: TDzListHeaderColumns = 열 수집
HeaderHeight: Integer = 고정 헤더 높이 (원하는 경우 열 캡션에 다중 선을 입력 할 수 있습니다)
LineCenter: Boolean = dwcol 함수가 선 높이에 따라 수직으로 텍스트를 그립니다.
LineTop: Integer = Linecenter가 False 일 때 DWCOL에 대한 텍스트의 y 위치를 나타냅니다.
ListBox: TCustomListBox = Listbox 객체 (필수!)
TextMargin: Integer = 열의 왼쪽과 오른쪽에있는 픽셀의 공간 (한 열의 텍스트가 다른 열의 텍스트에 붙어 있지 않도록 사용)
TitleFont: TFont = TITLE FONT
UseOdd: Boolean = 홀수 선에 대한 특정 색상 배경 사용 (ColorlineOdd 속성 참조)
Alignment: TAlignment = DWCOL 함수에 사용되는 텍스트의 정렬을 나타냅니다.
Caption: String = 열 제목의 캡션 텍스트
CaptionEx: String =이 캡션은 선택 사항이며 사용자 정의 대화 상자에 표시 할 전체 캡션을 지정하려면 사용합니다 (예 : 캡션 : "ID", CaptionEx : "ID of Person").
Customizable: Boolean = customize 대화 상자에서 열을 사용자 정의 할 수 있도록 허용
CustomTextFont: Boolean = 텍스트 폰트 속성에 저장된 결정 (TextFont가 변경 될 때 자동으로 설정 됨)
Hint: String = 열 힌트
MaxWidth: Integer = 크기 조정시 열 맥스 워드
MinWidth: Integer = 크기 조정시 열 minwidth
Name: String = 열 이름을 찾으려면 (ColbyName 함수) 및 저장/로드 사용자 정의 (SaveCustom/LoadCustom 함수). 커스터마이징에는 프로젝트를 변경할 수 있으므로 열 이름이 필요 하며이 경우 열이 열 이름에 따라 올바른 순서로 유지됩니다.
Sizeable: Boolean = 열 크기 조정 허용
TextFont: TFont =이 열에 대한 항목 텍스트를 그리는 데 캔버스가 사용하는 글꼴 (변경되지 않은 경우 캔버스는 ListBox Font를 사용하여 항목을 그리기)
Visible: Boolean = 열/숨기기 열
Width: Integer = 열 너비
Data: Pointer = 무료 사용에 대한 포인터 (비 게시 속성)
procedure LoadCustom ( const A: String);위치, 크기 및 가시성을 포함하여 문자열에서 열 사용자 정의를로드합니다. 레지스트리/INI 파일에서로드 할 수 있습니다.
function SaveCustom : String;위치, 크기 및 가시성을 포함하여 열 사용자 정의를 문자열에 저장합니다. 레지스트리/INI 파일에 저장할 수 있습니다.
function ColByID (ID: Integer): TDzListHeaderCol;열 ID로 tdzlistheadercol을 반환합니다. 컬럼을 이동할 때 ID는 고정 상태로 유지됩니다 (열의 위치는 인덱스 속성으로 정의됩니다).
function ColByName ( const aName: String): TDzListHeaderCol;열 이름으로 tdzlistheadercol을 반환합니다.
procedure DwCol (ID: Integer; Rect: TRect; const Value : Variant; Margin: Integer = 0 );OnDrawItem에서 열 항목 텍스트를 그리는 데 사용됩니다. ID는 수집 순서를 고려하여 열 번호를 나타냅니다. 따라서 열이 런타임에 이동하더라도 ID는 항상 동일하게 유지됩니다. 이것은 열의 주요 식별입니다. 값은 인쇄 할 텍스트를 나타냅니다. 값은 변형 유형이므로 물론 값을 형식화하려고하지 않는 한 문자열로 변환 할 필요가 없습니다. 열의 왼쪽에 마진을 지정하여 아이콘이나 다른 사용자 정의 그리기를 그릴 수 있습니다 (예제 소스 참조).
function AddItem ( const Ar: TArray<String>): Integer;이 기능을 사용하면 ListBox에 항목을 추가하여 탭 문자로 배열 문자열을 자동으로 분리하는 데 도움이됩니다. Tabbed Delimiter 메소드를 사용하여 데이터를 Listbox에 저장할 때만이 기능을 사용해야합니다. 일반적으로 AutoDrawTabbedText 속성과 함께이 제품을 사용하려면 ondrawitem을 작성할 필요가 없습니다.
function GetItemArray (Index: Integer): TArray<String>; 항목 텍스트에 데이터가 탭 문자로 분리 된 것을 고려할 때 ListBox의 인덱스에 비해 문자열 배열을 반환합니다. GetItemArray(Index)[Column] 사용하여 셀을 빠르게 읽을 수 있습니다.
function GetLeft : Integer;퇴근 경계에 따라 열의 왼쪽 위치를 반환합니다.
function GetRight : Integer;퇴근 경계에 따라 열의 오른쪽 위치를 반환합니다.
procedure OnColumnClick (Sender: TObject; Col: TDzListHeaderCol);열에서 왼쪽 클릭하면 발생합니다.
procedure OnColumnDraw (Sender: TObject; Col: TDzListHeaderCol; Canvas: TCanvas; Rect: TRect; Hover: Boolean);이 이벤트를 설정하면 열 제목 그리기 시간을 잡아서 캔버스를 변경하거나 현재 페인트 된 열에 추가 할 수 있습니다. 이벤트가 발사되면 내부 비트 맵이 사용되므로 열이 이미 페인트되었지만 화면으로 페인트되지 않았습니다. 따라서이 이벤트를 사용하면이 비트 맵 캔버스를 변경할 수 있습니다. 이벤트가 종료되면 비트 맵이 화면으로 칠해집니다. 호버 매개 변수는 마우스 가이 순간에 열 위에 있음을 나타냅니다.
procedure OnColumnRClick (Sender: TObject; Col: TDzListHeaderCol);열을 마우스 오른쪽 버튼으로 클릭하면 발생합니다.
procedure OnColumnResize (Sender: TObject; Col: TDzListHeaderCol);열이 크기가 커진 후에 발생합니다.
procedure OnDrawItem (Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);이 이벤트를 사용하여 DWCOL 메소드를 사용하여 모든 열을 작성해야합니다 (예제 소스 참조).
AutoDrawTabbedText = true를 사용하는 경우이 이벤트가 시작되지 않습니다
procedure MouseEnterCol (Sender: TObject; Col: TDzListHeaderCol);마우스가 열 영역에 들어가면 발생합니다.
procedure MouseLeaveCol (Sender: TObject; Col: TDzListHeaderCol);마우스가 기둥 영역을 떠날 때 발생합니다.