📄 9928.txt
字号:
在form2中输入如下代码
Private Sub Form_Load()
Call showform(Me, ind)
End Sub
本程序调用了一些有关系统和绘图的API函数,有利于大家进一步了解
API函数的功能。本程序在vb5企业版,Win98中运行通过。
***************************************************************
VB中的时间处理问题
武汉 罗程
编程中常常会与时间打交道,VB编程自然也不例外。以下就谈谈我在
这方面的一点经验。
VB中提供了很多变量类型,Date型就是专门用于存储时间的。
1.Date型变量及其相关函数。
在内部,一个Date占8个字节的内存,你可以方便地用它来存储日期和
时间。给Date变量赋值是很容易的。但请保证输入顺序与系统默认的时间
表示顺序相同。例如:
Dim d As Date
d = #5/23/99 11:45:34 AM#
DateSerial函数可以把年、月、日的数字组合成一个Date值。TimeSerial
函数可把小时、分、秒的数字组合成一个Date值。且两函数可以叠加。
d = DateSerial(1999, 5, 23) + TimeSerial(11, 45, 34)
而DateValue 和TimeValue 函数则可将代表日期和时间的字符串转化
为Date 型,并且也可以叠加。
d = DateValue(“1999/ 5/ 23”) + TimeValue(“11: 45: 34”)
Format函数可按预定的格式显示或打印一个Date变量。如:
Print Format(d, “general date”) '99-5-23 11:45:34
Print Format(d, “long date”) '1999年5月23日
Print Format(d, “medium date”) '99-05-23
Print Format(d, “short date”) '99-5-23
Print Format(d, “long time”) '11:45:34
Print Format(d, “medium time”) '11:45 AM
Print Format(d, “short time”) '11:45
Format函数也允许你自己规定显示格式。如:
Print Format(d, “mmmm”) 'may 产生日期中月份的英文
以以上日期为例,如想显示其中的一部分信息可使用以下函数:
Print Month(d) '5
Print Day(d) '23
Print Year(d) '1999
Print Hour(d) '11
Print Minute(d) '45
Print Second(d) '34
Print WeekDay(d)'1
Weekday 提供了一组内部常量,vbSunday代表1,直到vbSaturday代表7。
Now 函数可返回今天的日期及时间。如:
Private Sub Form_Click()
Dim d As Date
d = Now
Print d
End Sub
灵活地应用以上的函数,可以大大地简化你的程序。例如想计算10000
秒等于几小时几分几秒可写为:
Private Sub Form_Click()
Dim d As Date
d = TimeSerial(0, 0, 10000)
Print d
End Sub
结果为2:46:40。
2.与时间相关的常用控件。
Timer控件是一个奇特的控件。Timer 控件会在固定时间间隔中运行Timer
事件。此间隔是由Interval属性决定的,其单位为千分之一秒。但不要以为将
其值设为0事件就可不间断的地运行了。结果恰恰相反,事件将一次也不运行。
同时还要注意变量的声明。如:
Private Sub Timer1_Timer()
Dim a As Integer
a = a + 1
Print a
End Sub
Dim a As Integer
Private Sub Timer1_Timer()
a = a + 1
Print a
End Sub
试试看,其结果是完全不同的。
当需要用户输入时间时,为避免出现错误的时间,可以使用日历控件。
它只允许用户在日历表中选择日期,避免了错误的发生。
3.记录时间的API函数。
GetTickCount Windows API函数可返回 Windows 启动以来消逝的毫秒
数,其精度高于VB的Timer 函数,且Timer 函数会在午夜清零,而GetTickCount
函数只有当机器连续使用49.7天后才返回零,这为我们编程提供了很大的方
便。例如想知道你的电脑连续工作多久了,可新建一工程,然后添加以下代
码:
Private Declare Function GetTickCount Lib “kernel32”() As Long
Private Sub Form_Load()
Dim d As Date
Dim t As Integer
Form1.Show
t = GetTickCount \ 1000
d = TimeSerial(0, 0, t)
Print d
End Sub
****************************************************************
Delphi中对象解除技巧
郑州 邹国栋
在Delphi程序设计中,我们需要通过解除建立的所有对象来避免内存泄
漏。但是,如果你在程序中不谨慎小心的话,很容易多次解除同一个对象,
这将会引起很严重的错误,造成应用程序崩溃,甚至是死机。
请看下面的程序:
procedure TForm1.Button1Click(Sender:TObject);
var
Button2,Button3:TButton;
begin
Button2:=TButton.Create(self);
Button3:=TButton.Create(Button2);
Button2.Free;
Button3.Free;
end;
在上例中,当执行到Button3.Free时会产生一个错误,因为在调用
Button2.Free时,Button2被解除,但因为Button2是Button3的宿主,Button3
也同时被解除,因此错误就不可避免地发生了。
要避免上述错误,有两种方法:第一,在解除宿主之前要先解除其所属的
所有组件。这种方法很简单,只要将上例中Button2.Free和Button3.Free换位
即可。第二,在Button3.Free执行之前将Button3变量设置为nil。程序如下:
Button2.Free;
Button3:=nil;
Button3.Free;
在上面的程序中,将Button3置为nil是为了阻止应用程序重新使用已解除
对象的内存。在调用Free对象方法时,它会确定对象是否为nil,如果不是,
Free对象方法会假定对象仍然存在,使用对象引用为它分配内存,然后调用
Destroy释放对象内存,并清除任何相关的虚拟对象方法的数据表格信息。而
Destroy对于有对象存在的内存地址不会做任何改变,所以如果在调用Destroy
之后测试该内存地址,它仍可能有效。所以当在程序中两次调用一个对象而没
有将对象引用置为nil时,对象引用将仍然引用对象解除之前所占用的内存地
址,这就是产生错误的原因。
当然,在实际开发过程中,大多数错误不会这样明显,解决的方法也要
依具体而定,不会这么简单地加一句话就能解决问题。我在这里只是说明一
种编程思想,起一个抛砖引玉的作用,具体的东西还要靠你在实践中去探索,
积累。
****************************************************************
在Delphi中利用Tbatch组件完成数据批处理
军械工程学院五系研究生队 王俊
----在数据库应用系统中,常常要对数据进行成批的如追加、删除、更改等
操作,这种批量操作在专门的数据库开发工具如VFP中用APPEND、COPY命令
带上相应的命令子句就能轻易完成。但在其它开发工具中并没有类似的命令,
而是提供能完成类似功能的控件或对象,如在PowerBuilder中就是利用
Pipe Line(数据管道)来完成两个或同构或不同构的表之间的数据批处理。
本文要介绍的是Delphi中用来完成数据批处理任务的组件TBatchMove。
TBatchMove组件能够:
将一个数据集中的数据追加到一个表中。
从一个表中删除满足条件的记录。
按旧表结构生成一个新表,若欲生成的新表已存在,则覆盖。
----具体的操作要通过设置TBatchMove的Mode属性后再调
用Execute方法来完成。为举例说明问题,我们在别名
数据库DBDEMOS中先创建两个dBase格式的表Test1.dbf和
Test2.dbf。二者的结构如下表:
Test1.dbf Test2.dbf
Name C 10 Name C 10
Code C 3 Code C 3
----其中表Test2.dbf在字段code上建立有唯一索引。同时假设表单中已有两
个TABLE控件Tsource和Tdest和一个TbatchMove组件batchmove1。Tsource和
Tdest的DatabaseName属性均设为DBDEMOS。
batchmove1的source属性设为Tsource,destination属性设为Tdest。
----在使用TbatchMove组件时,必须牢记:所有的操作都是以源表为标准针对
目的表进行的,下面就分别举例说明TbatchMove的各种操作模式:
batAppend 追加模式将源表中的数据追加到目的表中,目的表必须事先存在。
这是缺省模式。
batchmove1.source=Tsource;
batchmove1.destination=Tdest2;
batchmove1.Mode:=batCopy;
batchmove1.Execute;
batUpdate 更新模式用源表中匹配目的表的记录替换目的表中的相应记录。目
的表必须事先存在且有一已定义的索引用来匹配源表中的记录。
Tdest.IndexFieldNames:='code';
batchmove1.source=Tsource;
batchmove1.destination=Tdest ;
batchmove1.Mode:=batUpdate;
batchmove1.Execute;
batAppendUpdate 追加更新模式如果源表中有与目的表匹配的记录,则替换目
的表记录,否则,直接追加到目的表中。目的表必须事先存在且有一已定义的
索引用来匹配源表中的记录。
Tdest.IndexFieldNames:='code';
batchmove1.source=Tsource;
batchmove1.destination=Tdest ;
batchmove1.Mode:=batAppendUpdate;
batchmove1.Execute;
batCopy 拷贝模式按源表结构生成新表,源表中的数据同时拷贝到目的新表中。
如果要生成的新表已存在,则覆盖。
//按Test1.dbf生成新表xxx.dbf
//如果不指定扩展名dbf,生成的新表将是Paradox格式的xxx.db。
Tdest.TableName:='xxx.dbf';
batchmove1.source=Tsource;
batchmove1.destination=Tdest ;
batchmove1.Mode:=batCopy;
batchmove1.Execute;
batDelete 删除模式删除目的表中与源表匹配的记录。目的表必须事先存在且
有一已定义的索引用来匹配源表中的记录。
Tdest.IndexFieldNames:='code';
batchmove1.source=Tsource;
batchmove1.destination=Tdest ;
batchmove1.Mode:=batDelete;
batchmove1.Execute;
----TBatchMove还有一个重要属性ChangedTableName,在实际运用中,通过指
定ChangedTableName属性可以创建一个Paradox表,该表用来保存目的表中被
更改数据的原始备份,有了这个备份表就可以确保恢复目的表中的数据。
----顺便提一句,如果要删除某一个表中的全部记录,可以采用Table组件的
EmptyTable方法,例如Tdest.EmptyTable将清空Tdest所指定的表test2.dbf。
----本文中是以同构的dbf表进行的示例,在实际运用中,源表和目的表可能
同购,也可能异构,异构时,Delphi的BDE会自动进行类型和长度上的转换,
具体类型间的关系可以有关BDE的帮助。本文中各种操作模式的实际结果均可
以从Delphi的Database Desktop中查看到。
****************************************************************
Visual Foxpro 3.0 应用程序封面、背景及封底的制作
李湘江
使用VFP3.0编写应用程序时,我们利用系统本身的性能可以制作出类似于WORD、
EXCEL启动时的软件封面、漂亮的窗口背景和带背景音乐、移动字幕的动感封底,
使我们编写的VFP3.0应用程序更具有专业性。
一.封面、背景的制作
1. 用画笔或其它绘图工具软件绘制一幅BMP位图格式的封面图片文件Face.bmp。
也可从其它现有的图片文件中截取剪切一幅比较合适的图片,再用图片转换软件
将其转换为BMP位图格式文件,作为封面图片。
2. 以同样方法再作一幅背景图片Back.bmp,尺寸为屏幕大小,以全部覆盖主菜
单窗口空白区为准。如果屏幕分辩率为640×480,则背景图片尺寸大概为640×
450象素左右。
3. 进入Visual Foxpro 3.0系统环境,打开应用程序所在的项目,在命令行窗
口中键入Create Form或在“文件”菜单中选择“新建”、“表单”,建立一个
文件名为 Fack.scx 的新表单FORM1。
4. 设置表单FORM1的Picture属性,选取刚才作好的Face.bmp文件,调整表单
FORM1的窗口大小,使其恰好被封面图片全部覆盖;然后再设置表单FORM1的其
它属性:AutoCenter=.T.,Borderstyle= 0-无边框,MaxButton=.F.,
MinButton=.F.,Movlable=.F. 等。
5. 鼠标点击“表单控制栏”中的“标签”,并在表单FORM1上拉出一个矩形框
Lable1,设置Lable1的Caption属性为“人事管理系统”。
6. 鼠标点击“表单控制栏”中的“计时器”,在表单FORM1中加入两个计时器
对象Timer1和Timer2,设置Timer1的Interval属性为了3000(3秒),Timer2的
Interval属性为了4000(4秒),在Timer1的Time过程中加入语句:
_screen.picture="Back.bmp" &&打开屏幕背景图片
在Timer2的Time过程中加入语句:
release thisform &&释放封面表单
7.在主文件程序的最前面加入语句:
ZOOM WINDOWS SCREEN Max &&菜单主窗口最大化
DO FORM Face.scx &&执行封面表单
8. 实现效果:执行编译后的应用程序,菜单主窗口出现并扩大到最大化时,
弹出封面,封面停留3秒钟后打出背景图案,再经过1秒钟封面消失,程序进入
带有背景图案的主窗口界面。
二、带背景音乐、移动字幕封底的制作
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -