vb怎么新建c语言文件大小,大一 “VB简单的程序设计”常见错误汇总(1)

“VB简单的程序设计”常见错误汇总

一、“VB简单的程序设计”常见错误

1.2 常见错误和难点分析

1.标点符号错误

在VB中只允许使用西文标点,任何中文标点符号在程序编译时产生"无效字符"错误,在该行以红色字显示。用户在进入VB后不要使用中文标点符号。中、西文状态下标点符号对照见下表所示。

中、西状态下标点符号对照

西文状态

,

.

'

"

;

_

<

中文状态

'

"

——

2.字母和数字形状相似

L的小写字母"1"和数字"l"形式几乎相同、O的小写字母"。"与数字"0"也难以区,这在输入代码时要十分注意,避免单独作为变量名使用。

3.对象名称(Name)属性写错

在窗体上创建的每个控件都有默认的名称,用于在程序中唯一地标识该控件对象。系统为每个创建的对象提供了默认的对象名,例如,Text1、Text2、Command1、Label1等。用户可以将属性窗口的(名称)属性改为自己所指定的可读性好的名称,如txtInput、txtOutput、

cmdOk等。对初学者,由于程序较简单、控件对象使用较少,还是用默认的控件名较方便。

当程序中的对象名写错时,系统显示"要求对象"的信息,并对出错的语句以黄色背景显示。用户可以在代码窗口的"对象列表"框检查该窗体所使用的对象。

4.Name属性和Caption属性混淆

Name属性的值用于在程序中唯一地标识该控件对象,在窗体上不可见;而Caption属性的值是在窗体上显示的内容。

5.对象的属性名、方法名写错

当程序中对象的属性名、方法名写错时,VB系统会显示"方法或数据成员未找到"的信息。在编写程序代码时,尽量使用自动列出成员功能,即当用户在输入控件对象名和句点后,系统自动列出该控件对象在运行模式下可用的属性和方法,用户按空格键或双击鼠标即可,这样既可减少输入也可防止此类错误出现。

6.变量名写错

用Dim声明的变量名,在后面的使用中表示同一变量而写错了变量名,VB编译时就认为是两个不同的变量。例如,下面程序段求1~100的和,结果放在Sum变量中:

Dim sum As Integer,i As Integer

Sum=0

For i =1 to

100

Sum=Sun+i

Next i

Print Sum

显示的结果为100。原因是累加和表达式Sum=Sun+i中的右边的变量名Sum写成Sun。VB对变量声明有两种方式,可以用变量声明语句显式声明,也可以用隐式声明,即不声明直接使用。上述变量名的写错,系统为两个不同的变量各自分配内存单元,造成计算结果不正确。因此,为防止此类错误产生,必须对变量声明采用限制其为显式声明方式,也就是在通用声明段加Option

Explicit语句。

7.语句书写位置错

在VB中,除了在"通用声明"段利用Dim等对变量声明语句外,其他任何语句都应在事件过程中,否则运行时会显示"无效外部过程"的信息。若要对模块级变量进行初始化工作,则一般放在Form

Load()事件过程中。

8.无意形成控件数组

若要在窗体上创建多个命令按钮,有些读者会先创建一个命令按钮控件,然后利用对该控件进行复制、粘贴,这时系统显示:“已经有一个控件为"Command1"。创建一个控件数组吗?”的信息,若单击"是"按钮,则系统创建了名称为Command1的控件数组。若要对该控件的

Click事件过程编程,系统显示的框架是:

Private Sub Command1_Click(Index As Integer)

End Sub

Index表示控件数组的下标。

若非控件数组,Click事件过程的框架是:

Private Sub Command1_Click()

End Sub

请注意直到学习第四章数组前,一律不使用控件数组。

9.Print方法中定位问题

定位通过Tab、Spc函数和最后的逗号、分号和无符号来控制。VB中通过Print方法中各参数的综合使用达到所需的结果,但初学者往往难以掌握。

(1) Tab(n)与Spc(n)的区别

Tab(n)从最左第1列开始算起定位于第n列,若当前打印位置已超过n列,则定位于下一行的第n列,这是常常定位不好出现的问题。在格式定位中,Tab用得最多。

Spc(n)从前一打印位置起空n个空格。例如,下面程序段显示了Tab与Spc的区别,效果如图所示。

Private Sub Commandl_Click()

Print "1234567890”,

Print

Tab(1);"**"';Tab(2);"%%%";spc(2);"$$$$"

End Sub

(2)

紧凑格式";"分号的使用

紧凑格式";",即输出项之间无间隔。但对于数值型,输出项之间系统自动空一列,而由于数值系统自动加符号位,因此,大于零的数值,实际空两列。对于字符型之间无空格。

例如,下面程序段,效果如图所示。

Private Sub Command1_Click()

Print 1;-2;3

Print"1234";"5678"

Print"A";"B";"C";"D","E","F"

End Sub

从该例应区分数值和字符在紧凑格式输出的差异。

10.打开工程时找不到对应的文件

一般,一个再简单的应用程序也应由一个工程.vbp文件和一个窗体.frm文件组成。工程文件记录该工程内的所有文件(窗体.frm文件、标准模块.bas文件、类模块.cls文件等)的名称和所存放在磁盘上的路径。

若在上机结束后,把文件复制到软盘上保存,但又少复制了某个文件,下次打开工程时就会显示"文件未找到"。也有在VB环境外,利用Windows资源管理器或DOS命令将窗体文件等改名,而工程文件内记录的还是原来的文件名,这样也会造成打开工程时显示"文件未找到"。

解决此问题的方法:一是修改.vbp工程文件中的有关文件名:二是通过"工程"菜单的"添加窗体"中的"现存"选项,将改名后的窗体加入工程。

二、表达式

1.书写规则

(1)运算符不能相邻。例a+-b是错误的。

(2)乘号不能省略。例x 乘以y

应写成:x*y

(3)括号必须成对出现,均使用圆括号。

(4)表达式从左到右在同一基准上书写,无高低、大小。

2. 不同数据类型的转换

运算结果的数据类型向精度高的数据类型靠.

Integer< P>

3.逻辑表达式书写错,在VB没有造成语法错而形成逻辑错

例:数学表达式 3≤x<10 VB表达式为 3<=x<10

问题在于VB中的逻辑量与数值量可互转

4.同时给多个变量赋值,在VB没有造成语法错而形成逻辑错

例 Dim x%,y%,z%

x=y=z=1

5. 标准函数名写错

6.变量名写错

检查方法:在通用声明段加Option Explicit

7.语句书写位置错

在通用声明段只能有Dim语句,不能有赋值等其他语句

1.逻辑表达式书写错,在VB没有造成语法错而形成逻辑错

例如,要将数学上表示变量x在一定数值范围内如3≤x<10,以VB的逻辑表达式表示,有的读者写成的VB表达式为:

3<=x<10

此时在其他语言中将产生语法错,而在VB中不产生语法错,程序能运行,但不管x的值为多少,表达式的值永远为True,这造成程序能正常运行的假象,其结果是不正确的。

因为在VB中,当两个不同类型的变量或常量参加运算时,有自动向精度高的类型转换的功能。例如,逻辑常量True转换为数值型的值为-1,False为0;反之数值型非0转换为逻辑型的值为True,0为False。同样数字字符与数值运算,转换为数值型。

例如,语句Print

True+3 '显示的结果是2

Print

"123"+100 '显示的结果是223

Print#5/1/2000#+3 '显示的结果是00-5-4

根据此原因,表达式:

3<=x <10

(1)

(2)

值的计算过程是:首先根据x的值计算3<=x,结果总为True或False;然后该值(-1或0)与10比较永远为True。正确的VB表达式书写为:

3<=x And x<10

2.同时给多个变量赋值,在VB没有造成语法错而形成逻辑错

例如,要同时给x,y,z三个整型变量赋初值1,有的读者写成如下赋值语句:

x=y=z=1

在C语言中,上述语句是可以实现同时对多个变量赋值,而在VB中规定一句赋值语句内只能给一个变量赋值,但上述语句并没有产生语法错,运行后x,y,z中的结果均为0。

原因是VB将y=z=1作为一个表达式,再将表达式的结果赋值给x。在VB中默认数值型变量的初值为0,根据上面错误1的分析类推,因此表达式y=z=l的结果为0,所以x赋得的值为0、y、z变量的值为默认值o。

3.标准函数名写错

VB提供了很多标准函数,如IsNumeric()、Date()、LeR()等。当函数名写错时,如将

IsNumeric写成IsNummeric,系统显示"子程序或函数未定义",并将该写错的函数名选中提醒用户修改。

[提示]

如何判断函数名、控件名、属性、方法等是否写错,最方便的方法是当该语句写完后,按

Enter键,系统把被识别的上述名称自动转换成规定的首字母大写形式,否则为错误的名称。

4.数据合法性检查中引起程序的死循环

在数据输入时,经常需要对输入的数据作合法性检查,以确保程序运行的正确性。如在实验::第1题中,对输入的温度要求是数字,否则删除原输入的内容,焦点仍定位于文本柜。有关属性设置见下表,界面如图2所示,程序段如下。

表2 控件有关属性

有关控件名

TabIndex

Text1

2

Text2

3

Command1

4

Command1

5

Private Sub Text1_LostFocus()

If

Not IsNumeric(Text1)Then

Text1=""

Text1.SetFocus

End If

EndSub

Private Sub Text2_LostFocus()

If

Not IsNumeric(Text2)Then

Text2=""

Text2.SetFocus

End

If

End Sub

当华氏温度(Text1)输入错时,焦点在Text2处不停地闪动,程序产生死循环。

原因是当Textl输入结束按Tab键,激发Textl

LostFocus事件,焦点已到Text2;但当判断Textl文本框输入数据错时,执行Textl.SetFocus,使焦点从Text2拉回到Textl;而又激发Text2_LostFocus事件,此时并没有判断Text2文本框输入数据错,又执行

Text2.SetFocus,使焦点从Text1拉回到Text2,如此交错造成死循环。

而当摄氏温度(Text2)输入错时,程序正常运行。因为当Text2输入结束按Tab键,焦点已到Commanl,因此不会产生死循环。

解决Text1输入错时死循环的问题,只要把Private Sub

Text2_LostFocus()事件的If表达式If Not

IsNumeric(Text2)Then改为:IfText2<>""And

Not isNumeric(Text2)Then即可。

5.如何终止死循环

当编写程序时考虑不周到,产生死循环(尤其使用第四章介绍的循环结构)时,只要同时按Ctrl+Break键就町终止死循环,找出死循环的原因,修改程序。

6.声明局部变量和窗体级变量的问题

在VB程序中,除了大量的控件对象外,还要使用一些变量,暂时存放一些中间结果。这些变量的声明可以放在过程外的"通用声明"段(称为窗体级变量),也可以放在过程中(称为局部变量),怎样安置这些变量,初学者觉得有点头疼。两者区别:窗体级变量在本窗体的所有过程中均可使用:而局部变量仅在变量所在的过程中可使用,也即随着本过程的执行而分配存储空间,当执行到EndSub语句,分配的内存空间回收,变量的值也丢失。

具体对实验二第2题来说,在方法一中窗体内有四个过程,共同要用到三个变量a,b,c,因此这些变量的声明应在"通用声明"段,否则Click事件过程中a,b,c变量的值为零。在方法二中只有一个事件过程,变量a,b,c作为过程级变量声明,当然声明与窗体级变量效果相同。

方法一: 方法二:

Dim

ag,b#,c# Private

Sub Form_Click()

Private Sub

Textl_LostFocus() Dima#,b#,c#

… '对变量a赋值 … '用到变量a,b,c

EndSub EndSub

Private Sub Text2_LostFocus()

… '对变量b赋值

EndSub

Private Sub Text3_LostFocus()

… '对变量c赋值

EndSub

Private Sub Command1_Click()

… '用到变量a,b,c

EndSub

7.在Form

Load事件中,SetFocus方法不起作用

原因同Print方法,因为系统在窗体装入内存时无法同步地用SetFocus方法定位控件的焦点。解决的方法在属性窗口对要定位焦点的控件将其Tablndex值设置为。就可。

8.程序运行时对多个文本框间焦点移动的问题

方法-:按"Tab"键。这时可不必编程,直接利用系统提供的功能方便地在各控件之间移动。若要确定离开或进入了哪个控件,则利用"控件LostFocus''或"控件_GotFocus''事件进行判断。

方法二:按"回车"键。这时必须通过KeyPress事件编程宋实现,有关程序段如下:

Private Sub某文本框_KeyPress(KeyAscii As

Integer)

If KeyAscii=13 Then

另一控件.SetFocus

End If

End Sub

三、选择结构/循环结构常见错误

1.选择结构语法错误

(1)块IF语句中如果有Else,必须单独作为一行;且End

If不可缺省;

(2)多条件选择ElseIf关键字的书写:

ElseIf 不要写成Else If;

(3)Select Case语句要与End

Select配对出现;

(4)Select Case

后不能出现多个变量;Case子句后不能出现变量及有关运算符;

(5)Select

Case结构中Case后面的表达式之一是:Is

,它是简单关系式,例如:

Private Sub Command1_Click()

x =

Val(InputBox("输入学生成绩"))

Select Case

x

Case Is <

60 ' 不能写成:Case x<60

Print "不及格"

Case Else

Print "及格"

End

Select

End Sub

以下语句也是错误的:

Select Case x1,x2,x3

Case

(x1+x2+x3)>=270

Print "优秀"

……

End Select

2.选择结构逻辑错误

VB程序的语法错误在编译过程中系统会给出提示信息。但是,如果存在逻辑错误系统就无能为力了,只能给出错误的结果,此时程序员很难找出错误所在。下面的例子是一个多条件表达式,例如,根据输入学生的百分制成绩,显示出五个不同的等级评定,评定条件如下:

以下程序段是正确的:

Private Sub Command1_Click()

Dim mark As Integer, grade As String

mark = InputBox("请输入学生的成绩:")

If mark >= 90 Then

grade =

"优"

ElseIf mark >= 80 Then

grade =

"良"

ElseIf mark >= 70 Then

grade =

"中"

ElseIf mark >= 60 Then

grade =

"及格"

Else

grade =

"不及格"

End If

Print grade

End Sub

如果将IF……End

IF之间的语句改为以下程序段结果就是错误的:

If mark >= 60 Then

grade =

"及格"

ElseIf mark >= 70 Then

grade =

"中"

ElseIf mark >= 80 Then

grade =

"良"

ElseIf mark >= 90 Then

grade =

"优"

Else

grade =

"不及格"

End If

以上语句除了输入小于60分的输出正确以外,其他只要输出大于或等于60分的都输出“及格”。这是因为只要遇到第一个满足条件的即不再往下进行判断。

另外还应该注意的是,Then后面不能写语句,必须换行。

1.在选择结构中缺少配对的结束语句

对多行式的If块语句中,应有配对的End

If语句结束。否则,在运行时系统会显示"块

If没有End If"的编译错误。

同样对Select

Case语句也应有与其相对应的EndSelect语句。

2.多边选择ElseIf关键字的书写和条件表达式的表示

多边选择ElseIf子句的关键字ElseIf之间不能写有空格,即不能写成Else

If。

在多个条件表达式的表示时,应从最小或最大的条件依次表示,以避免条件的过滤。

3.Select Case语句的使用

(1)"表达式列表i"中不能使用"变量或表达式"中出现的变量。例如,上述多边选择的例子改为Select

Case语句实现,方法一Case子句中出现变量mark,运行时不管mark的值多少,始终执行Case

Else子句,运行结果不正确;方法二、方法三正确。

方法一: 方法二: 方法三:

Select Case mark Select Case

mark Select Case mark

Case

mark>=90 Case

Is>=90 Case

Is>=90

Print"优"

Print"优" Print"优"

Case

mark>=80 Casels>=80 Case 80 To 89

Print"良" Print"良" Print"良"

Casemark>=70 Case Is>=70 Case 70To 79

Print"中" Print"中" Print"中"

Case

mark>=60 Case Is>=60 Case 60TO 69

Print

"及格" Print "及格 Print"及格"

Case Else

Case

Else

Case

Else

Print"不及格" Print"不及格"

Print"不及格"

End

Select End

Select End Select

(2)在"变量或表达式"中不能出现多个变量。实验三第5题对三门课程奖学金的判断,只能用If语句的多边选择,而不能用SelectCase语句实现。例如,有些读者用如下语句表示:

Select Case markl,mark2,mark3

Case

(markl+mark2+mark3)/3>=95

Print"一等奖"

End Select

这样就会在"Select Case

markl,mark2,mark3"语句行出现编辑错误:同时Case(markl+mark2

+mark3)/3>=95书写也错误。

3.不循环或死循环问题

出现不循环或死循环主要是循环条件、循环初值、循环终值、循环步长的设置有问题。

例如,以下循环语句不执行循环体:

For i=1 To 10 Step

–2 '

步长为负,初值必须大于等于终值才能循环

For I=100 To

10 '

缺省步长默认为正1,初值必须小于等于初值才能循环

Do While

False ' 循环条件是逻辑常量False,不执行循环

Do While

0 ' 循环条件为0等同于False

例如,以下循环形成死循环:

For I=10 to 100 Step

0 ' 步长为0初值永远不会超过终值

Do While

True '

循环条件是逻辑常量True,永远满足循环条件

Do While

1 ' 循环条件为非零值等同于True

4.循环结构中缺少配对的结束语句

For循环缺少Next语句;Do语句缺少Loop,尤其是多重循环这类问题更应该注意。

5.多重循环语句内外循环交叉

For i=1 to

4 For i=1 to 4

For j=1 to

5 应改为: For j=1 to

5 或将Next后面的j和i均去掉;

?i+j; ?i+j;

Next

I Next

j 或将以下两行写成一行:Next i, j

Next

j Next i     Next后面的i,j不能缺且顺序不能错

6.计数、累加、连乘结果变量赋初值问题

计数一般的语句格式是:n=n+1的形式,每循环一次自动加1,而累加的一般格式是:s=s+x,每次将x的值累加到s中去。如果已经定义n、s为数值型变量,则默认初值为0,可以省略赋初值。而连乘的一般格式是:p=p*j,此时p应该赋初值1。例如,求10!的语句为:

p=1

for i=1 to 10

p=p*i

next I

如果是多重循环,存放累加、连乘结果的变量初值设置放在内、外循环的位置应视具体问题分别处理。

例如,以下程序段是求出30位同学三门课的平均成绩:

Private Sub Command1_Click()

For i = 1 To 30

aver =

0       ' 每换一位同学重新置0

For j = 1 To

3

m = InputBox("输入第" & j &

"门课的成绩:")

aver = aver + m

Next j

aver = aver

/ 3

Print "第"

& i &

"位同学的平均成绩是:", aver

Next

End Sub

1.不循环或死循环的问题主要是循环条件、循环初值、循环终值、循环步长的设置有问题。例如,以下循环语句不执行循环体:

For i=10 To 20

Step-1 '

步长为负,初值必须大于等于终值,才能循环

For i=20 To10 '

步长为正,初值必须小于等于终值,才能循环

Do While False '

循环条件永远不满足,不循环

例如,以下循环语句死循环:

For i=10 To 20 Step

0 '

步长为零,死循环

Do While

1 ' 循环条件永远满足,死循环

2.循环结构中缺少配对的结束语句

For…Next语句没有配对的Next语句;Do语句没有一个终结的Loop语句等。

3.循环嵌套时,内外循环交叉:

For I=1 to

4

For j=1 to 5

Next

i

Next j

上述循环的交叉运行时显示"无效的Next控制变量引用"。

4.累加、连乘时,存放累加、连乘结果的变量赋初值问题

(1)一重循环

在一重循环中,存放累加、连乘结果的变量初值设置应在循环语句前。

例如,求1~100的3的倍数和,结果放入Sum变量中,如下程序段,输出结果如何?

Private SubForm_Click()

Fori=3 To

100 Step 3

Sum=0

Sum=Sum+i

Next i

Print

Sum

End Sub

要得到正确的结果,应作如何改进?

(2)多重循环

在多重循环中,存放累加、连乘结果的变量初值设置放在外循环语句前,还是内循环语句前,这要视具体问题分别对待。

例如,期末30位学生参加三门课程的考试,求每个学生的三门课程的平均成绩如下程序能否实现,应如何改进?

aver=0

For i=1 To 30

For j=1 To

3

m=InputBox("输入第"&j&"门课的成绩")

aver=aver+m

Next j

aver=aver/3

Print aver

Nexti

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VB窗体控件大小随窗体大小变化自動調整 有时窗体变化后,如改变分辨率后控件大小却不能随之改变。手工代码调整实在麻烦,下面的模块实现自动查找窗体上控件并使其改变大小以适应窗体变化。 在Form的Resize事件中调用函数Resize_All就能实现控件自动调整大小,如: Private Sub Form_Resize() Dim H, i As Integer On Error Resume Next Resize_ALL Me 'Me是窗体名,Form1,Form2等等都可以 End Sub 在模块中添加以下代码: Public Type ctrObj Name As String Index As Long Parrent As String Top As Long Left As Long Height As Long Width As Long ScaleHeight As Long ScaleWidth As Long End Type Private FormRecord() As ctrObj Private ControlRecord() As ctrObj Private bRunning As Boolean Private MaxForm As Long Private MaxControl As Long Private Const WM_NCLBUTTONDOWN = &HA1 Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function ReleaseCapture Lib "USER32" () As Long Function ActualPos(plLeft As Long) As Long If plLeft < 0 Then ActualPos = plLeft + 75000 Else ActualPos = plLeft End If End Function Function FindForm(pfrmIn As Form) As Long Dim i As Long FindForm = -1 If MaxForm > 0 Then For i = 0 To (MaxForm - 1) If FormRecord(i).Name = pfrmIn.Name Then FindForm = i Exit Function End If Next i End If End Function Function AddForm(pfrmIn As Form) As Long Dim FormControl As Control Dim i As Long ReDim Preserve FormRecord(MaxForm + 1) FormRecord(MaxForm).Name = pfrmIn.Name FormRecord(MaxForm).Top = pfrmIn.Top FormRecord(MaxForm).Left = pfrmIn.Left FormRecord(MaxForm).Height = pfrmIn.Height FormRecord(MaxForm).Width = pfrmIn.Width FormRecord(MaxForm).ScaleHeight = pfrmIn.ScaleHeight FormRecord(MaxForm).ScaleWidth = pfrmIn.ScaleWidth AddForm = MaxForm MaxForm = MaxForm + 1 For Each FormControl In pfrmIn i = FindControl(FormControl, pfrmIn.Name) If i < 0 Then i = AddControl(FormControl, pfrmIn.Name) End If Next FormControl End Function Function FindControl(inControl As Control, inName As String) As Long Dim i As Long FindControl = -1 For i = 0 To (MaxControl - 1) If ControlRecord(i).Parrent = inName Then If ControlRecord(i).Name = inControl.Name Then On Error Resume Next If ControlRecord(i).Index = inControl.Index Then FindControl = i Exit Function End If On Error GoTo 0 End If End If Next i End Function Function AddControl(inControl As Control, inName As String) As Long ReDim Preserve ControlRecord(MaxControl + 1) On Error Resume Next ControlRecord(MaxControl).Name = inControl.Name ControlRecord(MaxControl).Index = inControl.Index ControlRecord(MaxControl).Parrent = inName If TypeOf inControl Is Line Then ControlRecord(MaxControl).Top = inControl.Y1 ControlRecord(MaxControl).Left = ActualPos(inControl.X1) ControlRecord(MaxControl).Height = inControl.Y2 ControlRecord(MaxControl).Width = ActualPos(inControl.X2) Else ControlRecord(MaxControl).Top = inControl.Top ControlRecord(MaxControl).Left = ActualPos(inControl.Left) ControlRecord(MaxControl).Height = inControl.Height ControlRecord(MaxControl).Width = inControl.Width End If inControl.IntegralHeight = False On Error GoTo 0 AddControl = MaxControl MaxControl = MaxControl + 1 End Function Function PerWidth(pfrmIn As Form) As Long Dim i As Long i = FindForm(pfrmIn) If i < 0 Then i = AddForm(pfrmIn) End If PerWidth = (pfrmIn.ScaleWidth * 100) \ FormRecord(i).ScaleWidth End Function Function PerHeight(pfrmIn As Form) As Double Dim i As Long i = FindForm(pfrmIn) If i < 0 Then i = AddForm(pfrmIn) End If PerHeight = (pfrmIn.ScaleHeight * 100) \ FormRecord(i).ScaleHeight End Function Public Sub ResizeControl(inControl As Control, pfrmIn As Form) On Error Resume Next Dim i As Long Dim widthfactor As Single, heightfactor As Single Dim minFactor As Single Dim yRatio, xRatio, lTop, lLeft, lWidth, lHeight As Long yRatio = PerHeight(pfrmIn) xRatio = PerWidth(pfrmIn) i = FindControl(inControl, pfrmIn.Name) If inControl.Left < 0 Then lLeft = CLng(((ControlRecord(i).Left * xRatio) \ 100) - 75000) Else lLeft = CLng((ControlRecord(i).Left * xRatio) \ 100) End If lTop = CLng((ControlRecord(i).Top * yRatio) \ 100) lWidth = CLng((ControlRecord(i).Width * xRatio) \ 100) lHeight = CLng((ControlRecord(i).Height * yRatio) \ 100) If TypeOf inControl Is Line Then If inControl.X1 < 0 Then inControl.X1 = CLng(((ControlRecord(i).Left * xRatio) \ 100) - 75000) Else inControl.X1 = CLng((ControlRecord(i).Left * xRatio) \ 100) End If inControl.Y1 = CLng((ControlRecord(i).Top * yRatio) \ 100) If inControl.X2 < 0 Then inControl.X2 = CLng(((ControlRecord(i).Width * xRatio) \ 100) - 75000) Else inControl.X2 = CLng((ControlRecord(i).Width * xRatio) \ 100) End If inControl.Y2 = CLng((ControlRecord(i).Height * yRatio) \ 100) Else inControl.Move lLeft, lTop, lWidth, lHeight inControl.Move lLeft, lTop, lWidth inControl.Move lLeft, lTop End If End Sub Public Sub ResizeForm(pfrmIn As Form) Dim FormControl As Control Dim isVisible As Boolean Dim StartX, StartY, MaxX, MaxY As Long Dim bNew As Boolean If Not bRunning Then bRunning = True If FindForm(pfrmIn) < 0 Then bNew = True Else bNew = False End If If pfrmIn.Top < 30000 Then isVisible = pfrmIn.Visible On Error Resume Next If Not pfrmIn.MDIChild Then On Error GoTo 0 ' ' pfrmIn.Visible = False Else If bNew Then StartY = pfrmIn.Height StartX = pfrmIn.Width On Error Resume Next For Each FormControl In pfrmIn If FormControl.Left + FormControl.Width + 200 > MaxX Then MaxX = FormControl.Left + FormControl.Width + 200 End If If FormControl.Top + FormControl.Height + 500 > MaxY Then MaxY = FormControl.Top + FormControl.Height + 500 End If If FormControl.X1 + 200 > MaxX Then MaxX = FormControl.X1 + 200 End If If FormControl.Y1 + 500 > MaxY Then MaxY = FormControl.Y1 + 500 End If If FormControl.X2 + 200 > MaxX Then MaxX = FormControl.X2 + 200 End If If FormControl.Y2 + 500 > MaxY Then MaxY = FormControl.Y2 + 500 End If Next FormControl On Error GoTo 0 pfrmIn.Height = MaxY pfrmIn.Width = MaxX End If On Error GoTo 0 End If For Each FormControl In pfrmIn ResizeControl FormControl, pfrmIn Next FormControl On Error Resume Next If Not pfrmIn.MDIChild Then On Error GoTo 0 pfrmIn.Visible = isVisible Else If bNew Then pfrmIn.Height = StartY pfrmIn.Width = StartX For Each FormControl In pfrmIn ResizeControl FormControl, pfrmIn Next FormControl End If End If On Error GoTo 0 End If bRunning = False End If End Sub Public Sub SaveFormPosition(pfrmIn As Form) Dim i As Long If MaxForm > 0 Then For i = 0 To (MaxForm - 1) If FormRecord(i).Name = pfrmIn.Name Then FormRecord(i).Top = pfrmIn.Top FormRecord(i).Left = pfrmIn.Left FormRecord(i).Height = pfrmIn.Height FormRecord(i).Width = pfrmIn.Width Exit Sub End If Next i AddForm (pfrmIn) End If End Sub Public Sub RestoreFormPosition(pfrmIn As Form) Dim i As Long If MaxForm > 0 Then For i = 0 To (MaxForm - 1) If FormRecord(i).Name = pfrmIn.Name Then If FormRecord(i).Top < 0 Then pfrmIn.WindowState = 2 ElseIf FormRecord(i).Top < 30000 Then pfrmIn.WindowState = 0 pfrmIn.Move FormRecord(i).Left, FormRecord(i).Top, FormRecord(i).Width, FormRecord(i).Height Else pfrmIn.WindowState = 1 End If Exit Sub End If Next i End If End Sub Public Sub Resize_ALL(Form_Name As Form) Dim OBJ As Object For Each OBJ In Form_Name ResizeControl OBJ, Form_Name Next OBJ End Sub Public Sub DragForm(frm As Form) On Local Error Resume Next Call ReleaseCapture Call SendMessage(frm.hwnd, WM_NCLBUTTONDOWN, 2, 0) End Sub
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值