Q&A

  • TreeView내용을 전부 출력하는 법좀 부탁드립니다.
예전의 질답게시판에서 TreeView내용을 전부 출력하는 법을 찾아서 해보왔는데, 질문하신 분처럼 출력하면서 짤리고 가로로 펼쳐지면 가로도 짤리고해서
...도움을 요청합니다. 검색해서 찾은 소스는 수정하지 않고 올립니다.
이런저런 방법을 찾고 있으나 ...... 해결의 실마리를 찾지 못하고 헤메고 있습니다. 도와주세요.. 감사합니다.

TTreePrint = class
private
  FTreeView: TTreeView;
  nX, nY: integer;
  nOffsetX, nOffsetY: integer;
  nGap: integer;
  nLineWidth: integer;
  nHeight: integer;
protected
  procedure PrintTreeViewNode(tn: TTreeNode);  
public
  constructor Create(ATreeView: TTreeView); reintroduce;
  procedure PrintTreeView;
  procedure AdjustLine;
  procedure DrawParentLine(tn: TTreeNode);
published
  property XOffset  : integer read nOffsetX   write nOffsetX;
  property YOffset  : integer read nOffsetY   write nOffsetY;
  property Gap      : integer read nGap       write nGap;
  property LineWidth: integer read nLineWidth write nLineWidth;
end;

procedure TKIT_A05_F.SpeedButton2Click(Sender: TObject);
var
tp: TTreePrint;
begin
tp := TTreePrint.Create(TreeView1);
try
  tp.PrintTreeView;
finally
  tp.Free;
end;
end;

constructor TTreePrint.Create(ATreeView: TTreeView);
begin
nOffsetX   := 0;
nOffsetY   := 0;
nGap       := 150;
nLineWidth := 100;
FTreeView  := ATreeView;

inherited Create;
end;

procedure TTreePrint.AdjustLine;
begin
if nY < nHeight - Printer.PageHeight then begin
  Printer.NewPage;
  nY := -nOffsetY;
end
else nY := nY - nHeight;
end;

procedure TTreePrint.DrawParentLine(tn: TTreeNode);
var
ParentNode: TTreeNode;
begin
ParentNode := tn.Parent;
if Assigned(ParentNode) then begin
  if ParentNode.getNextSibling <> nil then begin
    Printer.Canvas.MoveTo(nOffsetX + ParentNode.Level*nGap, nY);
    Printer.Canvas.LineTo(nOffsetX + ParentNode.Level*nGap, nY - nHeight);
  end;
  DrawParentLine(ParentNode);
end;
end;

procedure TTreePrint.PrintTreeViewNode(tn: TTreeNode);
begin
if Assigned(tn) then begin
  AdjustLine;
  DrawParentLine(tn);

  nX := nOffsetX + tn.Level*nGap;
  
  if tn = FTreeView.Items.GetFirstNode then
    printer.Canvas.MoveTo(nX, nY - nHeight div 2)
  else Printer.Canvas.MoveTo(nX, nY);
  
  if tn.getNextSibling <> nil then begin
    Printer.Canvas.LineTo(nX, nY - nHeight);
    Printer.Canvas.MoveTo(nX, nY - nHeight div 2);
  end
  else Printer.Canvas.LineTo(nX, nY - nHeight div 2);

  Printer.Canvas.LineTo(nX + nLineWidth,  nY - nHeight div 2);
  
  Printer.Canvas.TextOut(nX + nLineWidth + 1, nY, tn.Text);
  PrintTreeViewNode(tn.getFirstChild);
  PrintTreeViewNode(tn.GetNextSibling);
end;
end;

procedure TTreePrint.PrintTreeView;
var
nOldMapMode: integer;          
begin
nX := nOffsetX;
nY := -nOffsetY;

Printer.BeginDoc;
nOldMapMode := SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC);
nHeight := Printer.Canvas.TextHeight('');
try
  PrintTreeViewNode(FTreeView.Items.GetFirstNode);
finally
  SetMapMode(Printer.Canvas.Handle, nOldMapMode);
  Printer.EndDoc;
end;
end;
1  COMMENTS
  • Profile
    별볼일없는 2002.03.19 20:53

    답변은 아니지만...쩝

    트리뷰의 내용을 스트링 그리드에 그대로 담았습니다.

    트리구조가

    1번 node
        2
           3

    2번 node
       2
           3

    이렇게 된걸
      스트링 그리드에

            1번 컬럼에
    row1  1번 node
    row2     2
    row3        3
    row4  2번 node    
    row5     2
    row6        3

    스트링 그리드에 넘기는건 트리뷰와 상관없이 트리구조가 만들어질때 안보이는 곳에서 스트링 그리드를 작성하고 출력시에는
    리포트 needdata(?) 이용하면 출력도 간단히 될것 같은데요

    별볼일 없는 넘이라 도움이 될런지...

    그럼 지나가다...
    위의 방법을 좀더 알고 싶으시면 멜주세요(간단한 소스 보내드릴께요)