2011-02-04 6 views
1

내 응용 프로그램이 가상 노드를 통해 반복되고 데이터를 확인합니다. 나는 VirtualStringTree를 포함하는 폼보다 이것을하기 위해 다른 폼을 사용하고있다. (내 이유가있어))VirtualTreeview 노드를 다른 양식으로 전달 하시겠습니까?

내 질문은 : 어떻게 그 노드 + 자신의 데이터를 내 다른 양식의 함수에 전달할 수 있으며 그러면 노드를 통해 루프 할 수 있습니다 (루프, 난 단지 다른 형태로 사용할 수있는 노드가 필요합니다).

또한 처리 양식이 표시되면 VirtualStringTree가 포함 된 양식이 삭제됩니다.

어떻게하면됩니까? 나는 동적 인 VirtualStringTree를 만드는 것에 대해 생각하고 있으며, 어쨌든 1 개의 트리에서 다른 트리로 노드를 넘겨 주지만, 더 나은 솔루션을 찾기 위해 먼저 여기에 물어볼 것입니다. :)

감사합니다. Jeff.

답변

13

I've mentioned before 당신이 일을 잘못하고있는 이유를 이제 알게 될 것입니다.

데이터를 저장하기 위해 트리 컨트롤을 사용하고 있습니다. 이는 의 데이터를으로 표시합니다. 작업 만 데이터를 저장하는 별도의 데이터 구조가 있어야합니다. tree 일 것이지만, 컨트롤 트리는 아닙니다. 노드를 표시 할 필요가 없으므로 처리 양식에 제공하는 것이이 트리 데이터 구조입니다.

데이터를 표시하려면 트리의 첫 번째 수준에있는 노드 수를 확인한 다음 트리 컨트롤의 RootNodeCount 속성을 해당 숫자로 설정합니다. 컨트롤은 많은 노드를 할당합니다. 컨트롤을 채우는 것과 같은 대량 작업에는 AddNewNode을 호출하지 마십시오. 트리가 전에 표시되지 않은 화면에 노드를 표시하면 OnInitNode 이벤트 핸들러가 실행됩니다. 여기에서 노드를 초기화하고 데이터 구조의 값과 연결합니다. 트리 컨트롤은 어떤 노드를 초기화하는지 알려줍니다. PVirtualNode 포인터와 부모 노드를 기준으로 어느 노드인지를 나타내는 인덱스를 통해 초기화됩니다. 노드를 초기화 할 때 트리에 노드에 자식이 있는지 여부를 알려줍니다. 당신은 그것을 말할 필요가 없습니다 얼마나 많은 아직 아이; 컨트롤이 알고 싶으면 다른 이벤트를 요청할 것입니다.

데이터가 프리젠 테이션 프리젠 테이션으로 분리되었으므로 더 이상 데이터의 수명과 다른 발표자의 수명에 대해 걱정할 필요가 없습니다. 처리 형식은 트리 뷰 컨트롤이 처음부터 데이터를 소유하지 않았기 때문에 트리 뷰 컨트롤이 여전히 존재하는지 여부에 관계없이 데이터를 처리 할 수 ​​있습니다.

은 참조 : 당신은 당신이 단지 노드 중 하나 개 수준이 말한


Model–View–Controller

  • . 괜찮아. 단 하나의 레벨을 가진 트리는 리스트으로 더 일반적으로 알려져 있습니다. 목록을 추적하는 데 사용할 수있는 몇 가지 사항이 있습니다. 가장 간단한 방법은 어레이입니다. TList을 사용할 수도 있고 직접 링크 된 목록을 작성할 수도 있습니다. 이 예제에서는 트리 컨트롤에 집중하기 때문에 배열을 사용합니다.

    각 노드는 기록 TData로 표시하기위한의 데이터를 가정하자, 그래서 당신은 그 배열 :

    당신은 당신이 어떤 소스에서 정보를 배열을로드 한 후
    var 
        Data: array of TData; 
    

    , 이제 트리 컨트롤을 채울 준비가되었습니다. (컨트롤이 빈 시작하는 경우, 하나) 즉, 두 줄의 코드로 쉽게 : 나무가 그 노드의에 대한 자세한 정보가 필요한 것으로 판단

    Tree.ResetNode(nil); // remove all existing nodes from tree 
    Tree.RootNodeCount := Length(Data); // allocate new nodes for all data 
    

    으로, 그것은 OnInitNode 이벤트를 트리거에 의해 시작됩니다. 노드의 Index 필드는 주어진 트리 노드에 해당하는 TData 레코드를 찾기에 충분하기 때문에이 이벤트를 위해해야 ​​할 일은별로 없습니다. 나무 자체를 페인트하고자하는 경우

    procedure TJeffForm.TreeInitNode(Sender: TBaseVirtualTree; 
        ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); 
    begin 
        Assert(Node.Index < Length(Data), 'More nodes than data elements!?'); 
        InitialStates := []; // If the node had children, or if it should be 
             // initially disabled, you'd set that here. 
    end; 
    

    , 그것은 OnGetText 이벤트를 트리거로 할 텍스트를 각각 볼 수 노드의 표시를 요청합니다. 노드의 Index 필드는 부모와 관련된 항목을 알려줍니다. 내가 TDataName라는 문자열 필드를 가지고 있다고 가정 한 위

    procedure TJeffForm.TreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; 
        Column: TColumnIndex; TextType: TVSTTextType; var CellText: UnicodeString); 
    begin 
        if TextType = ttStatic then 
        exit; 
        case Column of 
        NoColumn, 
        0: CellText := Data[Node.Index].Name; 
        1: CellText := 'Second column'; 
        else 
         Assert(False, 'Requested text for unexpected column'); 
        end; 
    end; 
    

    (그냥 목록을 가지고 있기 때문에, 그 인덱스는. 목록에서 인덱스에 해당)하고 우리가 주 열에 표시해야하는지 있다고 . 트리가 두 번째 열을 지나치는 텍스트를 요청하면 우리는 아직 제품을 출시 할 준비가되지 않았 음을 알리는 어설 션 오류가 발생합니다.

    완전히 별도의 배열 데이터 구조를 조사하기 위해 노드 색인을 사용하는 방법에 유의하십시오. 우리는 트리 컨트롤을 완전히 파괴 할 수 있었고 데이터는 여전히 존재할 수있었습니다. 처리 양식에서 데이터를 처리해야하는 경우 트리 컨트롤이 아닌 Data 배열을 지정하십시오.

+0

내 트리에는 노드 레벨이 1 개만 있습니다. 나는 네가 방금 말한대로하는 법을 정말로 모른다. 의사 표본을 좀 주시겠습니까? 나는 델파이에 정말로 깊지 않습니다. 저는 보통 시각적 인 컨트롤을 사용합니다. – Jeff

+0

@ 제프 당신은 계층 구조가 없다는 것을 의미합니까? 모든 것이 같은 수준입니까? 그렇다면 노드를 목록에 저장하십시오! –

+0

hierachy는 없습니다. 그러나 메모의 데이터 레코드에는 TStringlists 및 많은 변수와 같은 개체가 포함되어 있으므로 TStringlist에 저장한다는 의미라면 그럴 가능성이 없습니다. P – Jeff

관련 문제