2017-05-08 7 views
5

Delphi VCL 프로젝트에서 두 개의 열이있는 간단한 TVirtualStringTree을 만들었습니다. 첫 번째 열에는 표시 할 데이터의 Name을 식별하는 텍스트가 포함됩니다. 데이터 레코드에는 상태 필드도 포함됩니다. 두 번째 열은 텍스트가없는 이미지 (16x16 픽셀)를 사용하여 레코드 상태를 나타냅니다.TVirtualStringTree의 열에 아이콘이나 이미지를 표시하는 방법은 무엇입니까?

데모를 검색했지만 VTV가 노드를 표시하는 방법에 대한 전체 프로세스를 마스터하지 못하고 지정된 열의 노드에 표시 할 아이콘을 얻지 못했습니다.

그래서 세 관련 질문이 :

  1. 내가 텍스트가 OnGetText 이벤트에 할당하는 방법을 볼 수 있지만 어디 할당하거나 내 기록의 현재 상태를 반영하기 위해 이미지를 변경해야합니까?

  2. 이미지를 실제로 열에 표시하려면 어떻게해야합니까?

  3. 이미지의 크기가 제한되었거나 아이콘보다 클 수 있습니까? 그렇다면 가능한 경우 각 행의 높이를 조정하기 위해 설정을 변경해야합니까? 같은

+0

내 질문에 명확하지 않을 수 있습니다. 노드를 특정 열 내에서 표시하도록합니다. 나는 그것을 반영하기 위해 질문을 편집했다. – Ashlar

+0

추가 된 프로그램 코드 – Ashlar

+0

if kind ...를 추가하려고 시도했지만 여전히 아이콘이 표시되지 않습니다. 또한 GetMageIndex 시작 부분에 showmessage를 배치하고 노드 생성 중에 호출되지 않는다는 것을 알았습니다. 프로그램이 실행되면 노드로 마우스를 이동할 때만 호출됩니다. – Ashlar

답변

5

TImageListTVirtualStringTree.Images 속성, 이벤트 OnGetImageIndex 예를 처리 :

procedure TForm1.VirtualStringTree1GetImageIndex(Sender: TBaseVirtualTree; 
    Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; 
    var Ghosted: Boolean; var ImageIndex: Integer); 
var 
    NodeRec: PNodeRec; 
begin 
    NodeRec := Sender.GetNodeData(Node); 
    if Assigned(NodeRec) then 
    begin 
    if (Column = 1) then 
    begin 
     if Kind in [ikNormal, ikSelected] then 
     begin 
     case NodeRec.Status of // check the needed status(es) 
      1: ImageIndex := 1; // whichever image you need 
      2: ImageIndex := 2; // whichever image you need 
      // ... 
     end; 
     end; 
    end; 
    end; 
end; 

오전 나는 이미지의 크기가 제한하거나 아이콘보다 클 수? 내가 (가능한 경우) 각 행의 높이를 조정할 수있는 설정을 변경해야 그렇다면, 할

당신이 16 × 16 이미지를 필요로 진술 때문에, 그 무슨 뜻인지 확실하지. 다른 이미지 목록의 크기가 다를 수 있으면 OnGetImageIndexEx을 사용할 수 있습니다. 가변 높이의 경우 TreeOptions.MiscOptionstoVariableNodeHeight을 설정하고 OnMeasureItem 이벤트를 처리 할 수 ​​있습니다. VTV 캔버스에 그래픽을 그릴 수있는 또 다른 방법은 예를 들어 OnBeforeItemPaint/OnAfterItemPaint을 처리하는 것입니다.

+1

나는 동의하고 그렇게했다. – Ashlar

0

이미지 목록 16 × 16 (이미지) 생성 및 사용 코드 : 당신은 (귀하의 경우 16 × 16)을 할당 할 필요가

procedure TMyTreeView.OnDrawTextEx(Sender: TBaseVirtualTree; 
    TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; 
    const Text: string; const CellRect: TRect; var DefaultDraw: Boolean); 
var i: integer; 
begin 
    if (Node <> nil) then 
    begin 
     case Column of 
     cStatusColumn: 
     begin 
      DefaultDraw := false; 

      i := 0; // assign the image index from Images list here 

      if (i <> -1) then 
      begin 
       Images.Draw(TargetCanvas, CellRect.Left + 
        ((CellRect.Width - Images.Width) div 2), CellRect.Top, i); 
      end; 
     end 
     else 
     begin 
      DefaultDraw := true; 
     end; 
     end; 
    end 
    else 
    begin 
     DefaultDraw := true; 
    end; 
end; 
+1

구성 요소 편집기를 사용하고 treeview 구성 요소를 선택하면 "onDrawText"이벤트는 생성 할 수 있지만 "onDrawTextEx"이벤트는 생성 할 수 없습니다. 구성 요소에서 이벤트를 선택하면 MyTreeView가 아닌 ​​MyForm1에 대한 이벤트가 생성됩니다. VitrualStringTree 구성 요소를 사용하고 있습니다. 코드에 표시된대로 이벤트 소유자가 맞습니까? – Ashlar

+0

TMyTreeView는 가상 트리 뷰의 하위 클래스입니다. 하지만 구성 요소 편집기를 사용하고 있으므로이 경우 OnDrawTextEx 내용을 복사하여 OnDrawText 이벤트 처리기에 붙여 넣으십시오. 내 샘플이 위의 OnGetImageIndex 샘플과 다른 점은 이미지가 열의 중앙에 위치하기 때문입니다. – dwrbudr