如何在运行时更改Access窗体上的字段宽度?

时间:2009-06-02 23:54:05

标签: forms vba ms-access access-vba

我正在为我的MS-Access表单设计一个自定义布局系统。到目前为止一切都很好 - 我有这个主意!但现在变得棘手:调整各个字段的大小,使其宽度以有吸引力的方式匹配。

不幸的是,我有点困在这里 - 当然必须有一些功能,属性或方法调用,让我来指定一个给定的字段的确切宽度......但即便如此,我一直无法找到它。

有人可以在这里向我提供我迫切需要的信息吗? 或者更好,建议一个合适的Google查询或参考网站,以便为我提供查询答案?

4 个答案:

答案 0 :(得分:2)

在代码中,在运行时,这就是你要做的:

我!MyControl.Width = 1.5 * 1440

1.5是1.5“,1440是TWIPs,它是根据屏幕分辨率和Windows基本字体大小调整大小的相对测量单位。

现在,你在哪里这样做?

如果您在同一个表中有不同的记录需要不同的布局,则可以在OnCurrent事件中执行此操作。这样,当您从一个记录导航到另一个记录时,OnCurrent事件将检查您使用的宽度的任何数据控件并设置宽度。如果只有两个布局,则If / Then / Else最佳。如果有两个以上,那么SELECT CASE会更好。

另外,如果你正在调整和调整colums,那么分配模块级常量会很有帮助(这是从我1997年首次创建的具有15种不同记录类型和3种基本布局的应用程序中提取的)有8或9个小变化):

Const Height = 0.1583 * 1440
Const row1Top = 1.0208 * 1440 ' top of first row
Const row2Top = row1Top + 0.2083 * 1440
Const row3Top = row2Top + 0.2083 * 1440
Const row4Top = row3Top + 0.2083 * 1440
Const row5Top = row4Top + 0.2083 * 1440
Const row6Top = row5Top + 0.2083 * 1440
Const row7Top = row6Top + 0.2083 * 1440
Const Logic0Top = 1.6833 * 1440
Const logic1Top = Logic0Top + 0.1667 * 1440
Const logic2Top = logic1Top + 0.1667 * 1440
Const logic3Top = logic2Top + 0.1667 * 1440
Const logic4Top = logic3Top + 0.1667 * 1440
Const lblLogic0Top = Logic0Top - 0.0208 * 1440
Const lblLogic1Top = lblLogic0Top + 0.1667 * 1440
Const lblLogic2Top = lblLogic1Top + 0.1667 * 1440
Const lblLogic3Top = lblLogic2Top + 0.1667 * 1440
Const lblLogic4Top = lblLogic3Top + 0.1667 * 1440
Const DateWidth = 0.7833 * 1440
Const lWidth = 2.0167 * 1440
Const rWidth = 2.7771 * 1440
Const lMemoWidth = 4.8771 * 1440
Const commtWidth = (2.745 * 1440)
Const lCommt = 3.775 * 1440
Const CommtHeight = 1.5 * 1440
Const memoHeightOffset = 0.94 '0.8354
Const bksCommtHeight = ((memoHeightOffset + 0.5) * 1440) + 250
Const ConditionWidth = 4.2417 * 1440 - 15
Const memo3Tall = ((memoHeightOffset + 1.4146) * 1440) + 160
Const memo4Tall = ((memoHeightOffset + 1.2063) * 1440) + 160
Const memo5Tall = ((memoHeightOffset + 0.9979) * 1440) + 160
Const memo6Tall = ((memoHeightOffset + 0.7896) * 1440) + 160
Const memoShort = (1.5208 * 1440) + 160 ' Height of memo
Const lblOffset = -0.3291 ' adjusts memo label top for new layout
Const lblMemoTop3 = ((lblOffset + 1.9167) * 1440) - 480 - 100
Const lblMemoTop4 = ((lblOffset + 2.125) * 1440) - 480 - 55
Const lblMemoTop5 = ((lblOffset + 2.3333) * 1440) - 480 - 100
Const lblMemoTop6 = ((lblOffset + 2.5417) * 1440) - 480 - 100
Const lblMemoTop7 = ((lblOffset + 2.75) * 1440) - 480 - 100
Const lblBib0 = (2.5833 * 1440) - 480
Const Bib1 = 2.4674 * 1440
Const Bib2 = 2.6257 * 1440
Const Bib3 = 2.784 * 1440
Const Bib4 = 2.9424 * 1440

非常复杂,因为表单非常复杂(OnCurrent事件变得如此之大,我不得不将其拆分为两个不同的子程序 - 我不记得子程序的确切最大大小,但它可能是64K。是的,那是多么糟糕,是的,我后悔以这种方式实现。如果我做了它,我会使用带有隐形标签的标签控件,并为每个记录类型分配一个标签。但我没想到当时那样。

如果你不需要垂直移动或调整大小,你可能会遇到一些常数:

Col1Left
Col2LeftA
Col2LeftB
Col1WidthA
Col1WidthB
Col2WidthA
Col2WidthB

这将允许您有两列控件,第二列有两个不同的水平位置,每列有两个不同的宽度。我建议对这些常量使用非常透明的名称,以便您的代码或多或少不言自明。

答案 1 :(得分:0)

可以使用me.CtlName.PropertyName或Forms!CtlLName.PropertyName在VBA代码中引用任何给定控件的所有属性。在你的情况下,将是me.CtlName.Width。

请注意,属性的大小是缇。每英寸有1440缇。如果您使用公制,我不知道有多少缇以厘米为单位。

那就是我说我的表单大小与1024x768相匹配,除非客户端另有要求。

答案 2 :(得分:0)

  

如何更改字段宽度[问题]

使用SQL DDL:

ALTER TABLE MyTable ALTER MyField VARCHAR(20);

这不会影响列的其他属性,例如如果最初以这种方式创建它将保持NOT NULL,并且默认值(如果有的话)将是相同的。

P.S。我正在回答OP的问题,而不是有争议的编辑。

答案 3 :(得分:0)

为什么要在运行时更改字段宽度?像这样的行为不属于典型的Windows UI约定,并且在表单显示后,当事情开始改变大小时,可能会通过您的用户进行循环。只需显示字段,并在显示表单后单独保留大小。

对于这样的问题,请考虑gloves