设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: tmtony
打印 上一主题 下一主题

[高6]在Access的MDE中如何用VBA自定义纸张

[复制链接]
11#
发表于 2005-12-14 06:50:00 | 只看该作者
呵呵,现在成熟的第三方控件已经解决了这些问题了.unicode码,一般都支持.
12#
发表于 2005-12-14 07:55:00 | 只看该作者
TO:secowu

我看不会.学过VS 2003 C#和DELPHI,发现:

1、C#是DELPHI的盗版.

2、C#编译速度慢.不爽.

3、C#的第三方控件现在还不如DELPHI这么多和成熟

4、ADO.NET的操作方式做MIS非常别扭,这点不知道是我不懂其中的妙处。还是ado.net太嫩了。

但是论语言方面,C#是JAVA的盗版。完全面向对象,IDE和智能提示等工具又做得比DELPHI 好。在C#上面搞其它的编程,相当舒服。

很久以前也搞过VB6,发现VB6:

1、不是真正的面向对象编程,连继承窗体都不支持。晕~

2、数据库编程模式相当差,模式太过简单,第三方的支持又少。设计数据库的效率相当低。

3、很多地方的操作能力都不如人意,VB6这玩意很多地方都制约着程序员的思维。

好,说说DELPHI :

1、真正面向对象编程,又可以过程化的语言。

2、而且支持窗体继承和控件继承,做这些都相当的爽。VB就是因为没有这个,如果要做一个控件的加强版,就要写非常多的委托代码。原控件有100个属性的话,如果你要想这些属性都要全用的话,就要傻乎乎的重复写100遍委托码。而且,VB的控件设计模式做得相当的笨,那个什么"数据袋",要加载控件的时候,要用户傻乎乎的一个个属性的去读取和保存。因为这种笨拙的设计模式,造成用VB做控件的人少之又少。

3、强大又灵活的数据库编程模式。(呵呵,只有DELPHI才做到这个)

灵活的源:DELPHI把链接源、数据源泉和控件都分开了,本来很多ACCESS中要用到代码实现的东西,在DELPHI中都免代码现实。因为控件可以跨窗体引用,所以它很轻易的支持数据源不同窗体间的绑定。呵呵,这个很趣的功能,很有用。我可以把一些经常用到的重复的数据源写在一个控件中。

计算字段:DELPHI很精明,它把横向计算性质的字段都用一个事件引发,你可以在这个事件中写入这个计算字段所要的值。呵呵,比什么嵌入式函数都要灵活多了。如此一来,人家DELPHI可以调试计算字段的内容了。不用错误了显示那些奇怪的“#错误”,都不知道什么事。二来,计算字段也是编译运行了,快!

4、丰富的第三方控件支持。光是报表,都有6种的选择。人家还是全部开源的~^_^

报表支持:普通式,分组式,主从式,交叉报表,动态报表,多栏表。报表还支持用户自定义界面。

数据控件:

优秀的控件有DEV系列的,那些小数据库绑定控件,功能相当丰富。

如:文本框可以弹出一个计算器 ,组合框可以弹出一个树视,让用户选择节点。组合框也支持象ACCESS那样的多列下拉表,而且人家还可以列排序,筛选,调大小和宽度,列中可以用条件格式(写代码,超灵活)。最有趣的是,人家有一个超级组合框,可以把任意的控件或窗体放到里面中,你在打开此组合框时,就可以弹出你的自定义控件~~~

那个cxGrid,才是100%叫“只有你想不到,没有做不到”。如果还是做不到嘛,嘿嘿,行!人家源码全开放,你有能力就改这个控件吧。

<FONT face=Verdana color=#61b713>那个树表控件,真是强而又强。一般树表的加载,你只要设一下数据源,父ID和主ID等等这些信息,它在运行的时候就可以把整个树表都加载到当中了。你向这个数据源添加新记录,晕~~这个树表就会自动添加对应的节点。你又可以直接在树表中进行操作节点,移动、复制、添加、改名。哈哈~~一句代码都不用写,数据源的相应数据就自
13#
发表于 2005-12-20 01:23:00 | 只看该作者
!!卖广告的?
14#
发表于 2006-4-17 02:45:00 | 只看该作者
在xp系统中利用print对象可以实现,转换为mde后使用正常

首先将页面边距和自定义纸张设置为两个表,

在模块中编写代码

Public Sub PrintMargin(r As Report)
Dim intTop As Integer '上边距
Dim intLeft As Integer '左边距
Dim intBottom As Integer '下边距
Dim intRight As Integer '右边距
Dim strPrtname As String '报表名称
Dim intpapersize As Integer '纸张大小
Dim intorientation As Integer '打印方向
strPrtname = r.name
intTop = DLookup("[RPTTOP]", "页面", "[RPTNAME]='" & strPrtname & "'") * 567
intBottom = DLookup("[RPTBOT]", "页面", "[RPTNAME]='" & strPrtname & "'") * 567
intLeft = DLookup("[RPTLEFT]", "页面", "[RPTNAME]='" & strPrtname & "'") * 567
intRight = DLookup("[RPTRIGHT]", "页面", "[RPTNAME]='" & strPrtname & "'") * 567
intpapersize = DLookup("[papersize]", "页面", "[RPTNAME]='" & strPrtname & "'")
intorientation = DLookup("[Orientation]", "页面", "[RPTNAME]='" & strPrtname & "'")
r.Printer.PaperSize = intpapersize
r.Printer.Orientation = intorientation
r.Printer.TopMargin = intTop
r.Printer.BottomMargin = intBottom
r.Printer.LeftMargin = intLeft
r.Printer.RightMargin = intRight
End Sub

Public Sub SavePM(r As Report)
Dim RS As DAO.Recordset
Dim strPrtname As String
strPrtname = r.name
Set RS = CurrentDb.OpenRecordset("SELECT * FROM 页面 WHERE rptName='" & strPrtname & "'")
RS.Edit
RS("rpttop") = r.Printer.TopMargin / 567
RS("rptbot") = r.Printer.BottomMargin / 567
RS("rptleft") = r.Printer.LeftMargin / 567
RS("rptright") = r.Printer.RightMargin / 567
RS("papersize") = r.Printer.PaperSize
RS("Orientation") = r.Printer.Orientation
RS.Update
End Sub

在报表的close事件中调用Call SavePM(Reports(Me.name))

在报表打开前Call PrintMargin(Reports("报表名称"))
15#
发表于 2006-8-20 04:13:00 | 只看该作者
以下是引用tmtony在2005-4-18 11:58:00的发言:



大家知道,在Access的MDB中可以定义自定义纸张,但MDE就不行了,而在Access XP后有了Printer对象,需要可以设置纸张边距等各种页面设置,但无法选择自定义纸张.


希望大家就这个问题进行研讨.


斑竹也遇到这个问题啊。我第一次要打印报表。所以也“研究”了一下。





你想要的都有。




















PrtDevMode 属性





        


        





使用 PrtDevMode 属性可以设置或返回“打印”对话框中为窗体或报表指定的打印设备模式信息。


注意   如果需要 PrtDevModePrtDevNamesPrtMip 属性的完整文档,推荐查阅 Win32 Software Development Kit。


设置


PrtDevMode 属性设置是一个 94 字节的结构,对应的是在 Win32 Software Development Kit 中定义的 DEVMODE 结构。有关 PrtDevMode 属性成员的详细内容,请参阅 Win32 Software Development Kit 。


PrtDevMode 属性使用下列成员。














成员


说明





DeviceName


一个最多为 32 字节的字符串,该字符串用于指定驱动程序所支持的设备名称。例如,如果 Hewlett-Packard LaserJet IIISi 是指定的打印机,则字符串为 “HP LaserJetIIISi”。每台打印机驱动程序都有唯一的字符串。





SpecVersion


一个 Integer 值,用于指定在 Win32 Software Development Kit 中 DEVMODE 结构的版本号。





DriverVersion


一个 Integer 值,用于指定打印机驱动程序开发者指定的打印机驱动程序的版本号。





Size


一个 Integer 值,用于指定 DEVMODE 结构的字节大小。(该值不包含特定设备数据的可选 dmDriverData 成员,该成员将遵循此结构)。如果应用程序只处理与驱动程序无关的部分数据,则可以使用此成员来求出此结构的长度,而不用理会版本的不同。





DriverExtra


一个 Integer 值,以字节为单位指定特定设备数据的可选 dmDriverData 成员大小。如果应用程序不使用设备特定的信息,可将此成员设为 0。





Fields


一个 Long 值,用于指定在 DEVMODE 结构中,哪些保留的成员已经被初始化。该值可以是特定常量的任一组合,或完全不是其中的任一值。有关可用常量的详细内容,请参阅[url=mkMSITStore:d:\Program%20Files\Microsoft%20Office%202000\Office\2052\acmain9.chm::/html/FieldsConstants.htm]字段成员常量[/url]。





Orientation


一个 Integer 值,用于指定纸张的打印方向。它可以是 1 (纵向)或者 2 (横向)。





PaperSize


一个 Integer 值,用于指定打印纸张的大小。如果设置此成员为 0 或 256,则纸张的长度和宽度分别由 PaperLength 和 PaperWidth 成员指定。否则,可以将 PaperSize 成员设为预定值。有关可用值的详细内容,请参阅[url=mkMSITStore:d:\Program%20Files\Microsoft%20Office%202000\Office\2052\acmain9.chm::/html/PaperSizeValues.htm]PaperSize 成员值[/url]。





PaperLength


一个 Integer 值,以 1/10 毫米为单位来指定纸张的长度。此成员将覆盖 PaperSize 成员所指定的纸张长度, PaperSize 成员为自定义纸张设置长度,或为使用不同大小纸张的点阵打印机等设备设置纸张长度。





PaperWidth


一个 Integer 值,以 1/10 毫米为单位来指定纸张宽度。此成员将覆盖 PaperSize 成员所指定的纸张宽度。


<TR vAlign=t
16#
发表于 2006-8-20 04:15:00 | 只看该作者
以下是引用tmtony在2005-4-18 11:58:00的发言:


大家知道,在Access的MDB中可以定义自定义纸张,但MDE就不行了,而在Access XP后有了Printer对象,需要可以设置纸张边距等各种页面设置,但无法选择自定义纸张.

希望大家就这个问题进行研讨.



PrtDevMode 属性示例

以下示例使用 PrtDevMode 属性来检查用户定义的报表页大小。
  1. Type str_DEVMODE

  2.     RGB As String * 94

  3. End Type



  4. Type type_DEVMODE

  5.     strDeviceName As String * 16

  6.     intSpecVersion As Integer

  7.     intDriverVersion As Integer

  8.     intSize As Integer

  9.     intDriverExtra As Integer

  10.     lngFields As Long

  11.     intOrientation As Integer

  12.     intPaperSize As Integer

  13.     intPaperLength As Integer

  14.     intPaperWidth As Integer

  15.     intScale As Integer

  16.     intCopies As Integer

  17.     intDefaultSource As Integer

  18.     intPrintQuality As Integer

  19.     intColor As Integer

  20.     intDuplex As Integer

  21.     intResolution As Integer

  22.     intTTOption As Integer

  23.     intCollate As Integer

  24.     strFormName As String * 16

  25.     lngPad As Long

  26.     lngBits As Long

  27.     lngPW As Long

  28.     lngPH As Long

  29.     lngDFI As Long

  30.     lngDFr As Long

  31. End Type



  32. Sub CheckCustomPage(rptName As String)

  33.     Dim DevString As str_DEVMODE

  34.     Dim DM As type_DEVMODE

  35.     Dim strDevModeExtra As String

  36.     Dim rpt As Report

  37.     Dim intResponse As Integer

  38.     ' 在“设计”视图中打开报表。

  39.     DoCmd.OpenReport rptName, acDesign

  40.     Set rpt = Reports(rptName)

  41.     If Not IsNull(rpt.[b]PrtDevMode[/b]) Then

  42.         strDevModeExtra = rpt.[b]PrtDevMode[/b]   

  43.         ' 获取当前的 DEVMODE 结构。

  44.         DevString.RGB = strDevModeExtra

  45.         LSet DM = DevString

  46.         If DM.intPaperSize = 256 Then

  47.             ' 显示用户自定义大小。

  48.             intResponse = MsgBox("The current " _

  49.                 & "custom page size is " _

  50.                 & DM.intPaperWidth / 254 _

  51.                  & " inches wide by " _

  52.                 & DM.intPaperLength / 254 _

  53.                  & " inches long. Do you want " _

  54.                 & "to change the settings?", 4)

  55.         Else

  56.             ' Currently not user-defined.目前用户未自定义。

  57.             intResponse = MsgBox("The report " _

  58.                 & "does not have a custom page " _

  59.                 & "size. " _

  60.                 & "Do you want to define one?", 4)

  61.         End If

  62.         If intResponse = 6 Then

  63.             ' 用户需要更改设置。

  64.             ' 初始化字段。

  65.             DM.lngFields = DM.lngFields Or _

  66.              DM.intPaperSize Or DM.intPaperLength _

  67.                 Or DM.intPaperWidth

  68.             DM.intPaperSize = 256    ' Set custom page.

  69.             ' 提示输入长和宽。

  70.             DM.intPaperLength =_

  71.              InputBox("Please enter page length " _

  72.                 & "in inches.") * 254

  73.             DM.intPaperWidth =_

  74.              InputBox("Please enter page width " _

  75.                 & "in inches.") * 254

  76.             LSet DevString = DM        ' 更新属性。

  77.             Mid(strDevModeExtra, 1, 94) = DevString.RGB

  78.             rpt.[b]PrtDevMode[/b] = strDevModeExtra

  79.         End If

  80.     End If

  81. End Sub
复制代码

以下示例显示如何改变报表的打印方向。此示例将打印方向从纵向切换到横向,或是从横向切换到纵向,这取决于报表当前的打印方向。<RE><CODE>Sub SwitchOrient(strName As String)

    Const DM_PORTRAIT = 1

    Const DM_LANDSCAPE = 2

    Dim DevString As str_DEVMODE

    Dim DM As type_DEVMODE

    Dim strDevModeExtra As String

    Dim rpt As Report

    ' Opens report in Design view.

    DoCmd.OpenReport strName, acDesign

    Set rpt = Reports(strName)

    If Not IsNull(rpt.PrtDevMode) Then

        strDevModeExtra = rpt.PrtDevMode

        DevString.RGB = strDevModeExtra

        LSet DM = DevString

        DM.lngFields = DM.lngFields Or _

             DM.intOrientation    ' Initialize fields.

        If DM.intOrientation = DM_PORTRAIT Then

            DM.intOrientation = DM_LANDSCAPE

        Else

            DM.intOrientation = DM_PORTRAIT

        End If

        LSet De
17#
发表于 2007-6-11 23:51:00 | 只看该作者
以下是引用guoya在2006-4-16 18:45:00的发言:


在xp系统中利用print对象可以实现,转换为mde后使用正常

首先将页面边距和自定义纸张设置为两个表,

在模块中编写代码

Public Sub PrintMargin(r As Report)
Dim intTop As Integer '上边距
Dim intLeft As Integer '左边距
Dim intBottom As Integer '下边距
Dim intRight As Integer '右边距
Dim strPrtname As String '报表名称
Dim intpapersize As Integer '纸张大小
Dim intorientation As Integer '打印方向
strPrtname = r.name
intTop = DLookup("[RPTTOP]", "页面", "[RPTNAME]='" & strPrtname & "'") * 567
intBottom = DLookup("[RPTBOT]", "页面", "[RPTNAME]='" & strPrtname & "'") * 567
intLeft = DLookup("[RPTLEFT]", "页面", "[RPTNAME]='" & strPrtname & "'") * 567
intRight = DLookup("[RPTRIGHT]", "页面", "[RPTNAME]='" & strPrtname & "'") * 567
intpapersize = DLookup("[papersize]", "页面", "[RPTNAME]='" & strPrtname & "'")
intorientation = DLookup("[Orientation]", "页面", "[RPTNAME]='" & strPrtname & "'")
r.Printer.PaperSize = intpapersize
r.Printer.Orientation = intorientation
r.Printer.TopMargin = intTop
r.Printer.BottomMargin = intBottom
r.Printer.LeftMargin = intLeft
r.Printer.RightMargin = intRight
End Sub

Public Sub SavePM(r As Report)
Dim RS As DAO.Recordset
Dim strPrtname As String
strPrtname = r.name
Set RS = CurrentDb.OpenRecordset("SELECT * FROM 页面 WHERE rptName='" & strPrtname & "'")
RS.Edit
RS("rpttop") = r.Printer.TopMargin / 567
RS("rptbot") = r.Printer.BottomMargin / 567
RS("rptleft") = r.Printer.LeftMargin / 567
RS("rptright") = r.Printer.RightMargin / 567
RS("papersize") = r.Printer.PaperSize
RS("Orientation") = r.Printer.Orientation
RS.Update
End Sub

在报表的close事件中调用Call SavePM(Reports(Me.name))

在报表打开前Call PrintMargin(Reports("报表名称"))

为何要在报表预览的“页面设置”调用后要按"确定"才能改变?
18#
发表于 2008-6-15 20:24:07 | 只看该作者
这个需要收藏,以前困扰过我,没解决
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-8 16:11 , Processed in 0.089869 second(s), 29 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表