第一个lambda过程

请先打开CaseStyudy目录下的文件"PDFCreator示例.Table"后再运行本节的示例代码。

在生成复杂文档时,使用lambda过程过程是必须的,否则代码会很冗长。

上一节我们以打印员工备注为例,介绍了测量文本的方法及应用,其代码就不够简洁。

想象一下,如果有数十个文本内容要绘制,难道要写数十段代码来测量和定位每个文本?

没必要,我们可以利用lambda过程优化, 将文本的测量、定位和绘制做成一个lambda过程,这样不管有多少文本要绘制,都只需依次调用该过程即可。

这是我写好的lambda过程:

Dim DrawText =
Function
(tText As String, tFont As Font, tRect As RectangleF, tUnderLine As Boolean, tDistance As Integer)
    tRect.Height = pdc.MeasureString(tText, tFont, tRect.Width).Height
'测量文本的高度,并设置为tRect的高度
   
If tRect.Bottom > rcPage.Bottom Then '如果超过页面范围
        pdc.NewPage()
'新增一页
        tRect.Y = rcPage.Y
'重置tRect的起始位置
   
End If
    pdc.DrawString(tText, tFont, color.Black, tRect)
'绘制 文本内容
   
If tUnderLine Then '绘制 要求有下划线
        pdc.DrawLine(pens.Black, tRect.Left, tRect.Bottom, tRect.Right, tRect.Bottom)
   
End If
    tRect.Offset(0, tRect.Height + tDistance)
'下移tRect到tDistance指定的位置,准备绘制下一个内容
   
Return tRect
End
Function

参数 说明
tText 文本内容
tFont 文本字体
tRect RectangleF类型,文本绘制区域
tUnderLine 逻辑型,是否绘制下划线
tDistance 用于指定本文本和下一个内容之间的垂直间距

这个lamda过程的关键在于tRect参数,绘制之前,将其高度设置为文本高度:

tRect.Height = pdc.MeasureString(tText, tFont, tRect.Width).Height '测量文本的高度,并设置为tRect的高度

绘制结束后,将其移动到下一个内容的绘制位置:

tRect.Offset(0, tRect.Height + tDistance)

等效于:

tRect.Y = tRect.Y + tRect.Height + tDistance

最后返回这个tRect给调用者,用于绘制下一个内容:

Return tRect

所以tRect除了用于指定绘制区域,还相当于一个位置游标。

示例

下面是完整的测试代码,可直接在命令窗口执行:

Dim file As String = "c:\temp\test.pdf"
Dim
pdc As New PDFCreator()
pdc.PaperKind = Drawing.Printing.PaperKind.B5

Dim
rcPage As RectangleF = pdc.PageRectangle() 'lambda过程要调用的外部变量,必须提前定义
rcPage.Inflate( - 72, - 72)
'设置页边距为72磅,也就是2.54厘米 
'
用于测量、定位和绘制文本的lambda过程

Dim
DrawText =
Function (tText As String, tFont As Font, tRect As RectangleF, tUnderLine As Boolean, tDistance As Integer)
    tRect.Height = pdc.MeasureString(tText, tFont, tRect.Width).Height
'计算内容的高度,并设置为tRect的高度
   
If tRect.Bottom > rcPage.Bottom Then '如果超过页面范围
        pdc.NewPage()
'新增一页
        tRect.Y = rcPage.Y
'重置tRect的起始位置
   
End If
    pdc.DrawString(tText, tFont, color.Black, tRect)
'绘制 文本内容
   
If tUnderLine Then '绘制 要求有下划线
        pdc.DrawLine(pens.Black, tRect.Left, tRect.Bottom, tRect.Right, tRect.Bottom)
   
End If
    tRect.Offset(0, tRect.Height + tDistance)
'下移tRect到tDistance指定的位置,准备绘制下一个内容
   
Return tRect
End
Function
'
以下为内容绘制代码,全部通过调用DrawText实现,代码变得整洁很多
Dim
rect As RectangleF = rcPage 'rect为绘制区域,我们将通过调整rect的位置和高度,来实现动态布局
Dim
fntTitle As New Font("微软雅黑", 14, FontStyle.Bold) '标题字体
Dim
fntName As New Font("微软雅黑", 10, FontStyle.Bold) '员工姓名字体
Dim
fntMemo As New Font("宋体", 10) '员工备注字体
rect = DrawText.Invoke(
"员工列表", fntTitle, rect, False, 30) '绘制标题
For
Each r As Row In Tables("员工").Rows
    rect = DrawText.Invoke(r(
"姓名").ToString(), fntTitle, rect, True, 5) '绘制员工姓名
    rect = DrawText.Invoke(r(
"备注").ToString(), fntMemo, rect, False, 25) '绘制员工备注
Next

pdc.Save(file)

Process.Start(file)

生成的文档为:


本页地址:http://www.foxtable.com/webhelp/topics/6115.htm