在FastReport印出公司組織樹狀圖 |
|
pedro
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
在工作上有個需求, 就是列印公司組織樹狀圖, 這讓我想了好些時間,
現在分享給網路上的朋友.
所使用的技巧是:
1.使用TreeView顯示樹狀圖, 然後用Perform(WM_PRINT..)這個作業系統的message,
去傾印TreeView到Bitmap.Handle.
2.然後使用ClientDataSet暫存檔的方式, 建立blob欄位, 填入這個bmp, report page上
擺置一個圖片.
3.因為TreeView子節數量過多, 於是裁剪成數個bmp填入數筆的資料.
4.裁切的height和report page上的圖片height要設成一致.
以下是示意程式碼
procedure TForm1.Button1Click(Sender: TObject); const perHeight=535; var bmp,bmp1: TBitmap; i:Integer; btop,bcount:Integer; stream:TMemoryStream; begin TreeView1.Top:=-200; for i:=0 to 100 do begin TreeView1.Items.Add(nil,IntToStr(i)); end; TreeView1.FullExpand; TreeView1.Height:=(TreeView1.Items.Count*16)+20; bcount:=TreeView1.Height div PerHeight; bmp := TBitmap.Create; try bmp.Width := TreeView1.Width; bmp.Height := TreeView1.Height;; bmp.Canvas.Lock; try TreeView1.Perform(WM_PRINT, bmp.Canvas.Handle, PRF_CHILDREN or PRF_CLIENT or PRF_NONCLIENT); finally bmp.Canvas.UnLock; for i:=0 to bcount do begin btop:=i*PerHeight; bmp1:=TBitmap.Create; bmp1.Width:=TreeView1.Width; bmp1.Height:=PerHeight; bmp1.Canvas.CopyRect(Rect(0,0,TreeView1.Width,PerHeight),bmp.Canvas,Rect(0,btop,TreeView1.Width,btop+PerHeight)); stream:=TMemoryStream.Create; bmp1.SaveToStream(stream); ClientDataSet1.Append; TBlobField(ClientDataSet1.FieldByName('bmp')).LoadFromStream(stream); ClientDataSet1.Post; bmp1.Free; stream.Free; end; end; finally bmp.Free; end; FrReport1.ShowReport; end; ![]() |
vagrant
一般會員 ![]() ![]() 發表:29 回覆:72 積分:20 註冊:2003-07-04 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |