본문 바로가기

파이어몽키

TListView Dynamic Appearance로 추가한 항목을 코드로 제어하기

(해당 기능은 RAD 스튜디오 10.1 베를린 이상에서 사용할 수 있습니다.)


TListView는 이미 정의된 ItemAppreance를 이용해 목록을 구성하기 때문에 TListBox에 비해 스크롤이 부드럽고 빠릅니다.


하지만, 베를린 버전에서 Dynamic appreance 기능이 추가되어 아래 그림과 같이 아이템 항목을 마음대로 정의할 수 있습니다.



Dynamic Appreance에 대한 자세한 내용은 아래 링크를 참고하세요.

오늘 소개할 내용은 위와 같이 사용자가 추가한 항목을 코드를 통해 제어하는 예제입니다.


아래 코드는 ListView1에서 Text2 아이템을 찾아 글자색을 녹색으로, 글자 스타일을 Bold, Italic으로 설정합니다.

procedure TForm2.Button3Click(Sender: TObject);
  function GetTextItem2: TCustomTextObjectAppearance;
  var
    Obj: TCommonObjectAppearance;
  begin
    Result := nil;
    for Obj in ListView1.ItemAppearanceObjects.ItemObjects.Objects do
    begin
      if not (Obj is TCustomTextObjectAppearance) then
        Continue;

      if Obj.Name = 'Text2' then
      begin
        Result := Obj as TCustomTextObjectAppearance;
        Break;
      end;
    end;
  end;
var
  Text2: TCustomTextObjectAppearance;
begin
  // Text2 항목 찾기
  Text2 := GetTextItem2;

  if not Assigned(Text2) then
    Exit;

  Text2.TextColor := TAlphaColorRec.Green;
  Text2.Font.Style := [TFontStyle.fsBold, TFontStyle.fsItalic];
//  Text2.re
end;


아래 코드는 ListView의 크기가 변경된 경우(TListView.OnResize) 내부 항목들의 위치와 너비를 일괄조정하는 샘플입니다.

procedure TForm2.ListView1Resize(Sender: TObject);
var
  L, R, W, Ratio: Single;
  Obj: TCommonObjectAppearance;
begin
  W := ListView1.Width - ListView1.ItemSpaces.Left - ListView1.ItemSpaces.Right;
  L := W;
  R := 0;

  for Obj in ListView1.ItemAppearanceObjects.ItemObjects.Objects do
  begin
    // 가장 왼쪽의 이미지 제외
    if Obj is TCustomImageObjectAppearance then
      Continue;

    // 가장 왼쪽 위치
    if Obj.PlaceOffset.X < L then
      L := Obj.PlaceOffset.X;
    // 가장 오른쪽 위치
    if (Obj.PlaceOffset.X + Obj.Width) > R then
      R := Obj.PlaceOffset.X + Obj.Width;
  end;

  Ratio := (W-L) / (R-L); // (변경된 너비 / 원래너비)
  for Obj in ListView1.ItemAppearanceObjects.ItemObjects.Objects do
  begin
//    if Obj.PlaceOffset.X < L then
    if Obj is TCustomImageObjectAppearance then
      Continue;

    Obj.PlaceOffset.X := ((Obj.PlaceOffset.X - L)  * Ratio) + L;
    Obj.Width := Obj.Width * Ratio;
  end;
end;


샘플 프로젝트

ListViewDynamicAppearance.zip