发信人: aaaaaaaaa()
整理人: cobe(2000-02-12 23:54:15), 站内信件
|
编者的话
====================================================================
大家好!
这是关于VB和ASP的免费邮件列表。
如果您有问题或想回答别人的问题,请给我写信。
如果您有好的作品或您发现了好的作品,不要忘
了让大家共享。
热情欢迎您的参与!!!
版主 冯德平
[email protected]
=============================================
VB邮件(6.9)
a VB应用小集
一、访问VB外来数据库
VB最引人注目的特点,也是其最令程序员关心的地方,就是它访问多种数据 库的强大功能。VB中将非MS Access数据库称为外来数据库(External Database) ,如dBASE、FoxPro、ODBC等。VB中使用数据控制访问外来数据库同访问Access数 据库类似,这里不再赘述,现在主要读一下用生成对象的方法来访问外来数据库 。访问外来数据库((以dBASE为例)大致分为以下几步:
第一步:建立一个Access型数据库,并在数据库中创建新表—即为附加表。通过 设置
附加表的各属性值,使其与你所要访问的数据库建立链接关系。程序代码如下:
DimDbasDatabase
DimTdasNewTabledef
SetDb=OpenDatabase("MYDB.MDB")
Td.Connect="dBASE:DATABASE=c:\DATADIR"
Td.SourceTableName="AU THOR"
Td.Name="dBASEAuthorTable"
Db.tabledefsAppendTd
Db.close
第二步:设置INI文件路径。在VB的程序中使用了访问外来数据库操作,将应 用程序生成EXE文件后,必须提供一个INI文件。若找不到这个INI文件,将会导致 不能访问数据库,并出现“NOTFOUNDIN STOLLABKISAMS’的错误信息。设置INI文 件路径后,VB的程序会在WINDOWS子目录中寻找与应用程序同名的INI文件。设置 INI文件路径代码为:
SetDataAccessOption1,“Path\Filename”
第三步:编辑.INI文件可对不同种类的数据库进行设置,下面为一INI文件代 码:
[Options]
SystemDB=c: \MyPATH\SYSTEM.MDA
[ISAM]
PageTimeout=5
MaxBufferSize=128
LockRetry=20
CommitLockPetry=20
ReadAheadPages=16
[InstallableISAMs]
Paradox3.x=C:\VB\pdx110.DLL
FoxPro2.0=C:\VB\xbs110.DLL
FoxPro2.5=C:\VB\pdx110.DLL
dBASE=C:\VB\pdx110.DLL
dBASE=C:\VB\pdx110.DLL
Btrieve=C:\VB\btrv110.DLL
[ParadoxISAM]
PageTimeout=600
ParadoxUsername=BaiUser
ParadoxNetPath=P:\PDXDB\
CollatingSeguence=Ascii
[dBASE]
centry=off
Data=American
Mark=47
Deleted=on
这样通过访问新数据库MYDB.MDB和表“DBASEAU THORTABK”即可访问你所要 访问的外来数据库了。
使用这种方法访问外来数据库应该注意的是,附加表在所加到的数据库中只 是建立了一个链接关系,表的实际所在,仍然存在于原数据库中,该表在所附加 到的数据库中被删除时,只是删掉了链接关系,实际的表并没有被删除。
二、优化OLE的调用频率
在VB5.0中,OLE调用功能大大增强,程序员的调用次数也自然地随之增加, 显然,优化OLE的调用对提高系统效率有着不可低估的意义。下面提供三则优化O LE调用技巧供参考。
1.预先定义专用对象,减少OLE调用次数,提高程序效率
在VB中进行OLE功能调用时,一般需要重复使用“对象、属性”这类语句,有 时连接对象很多,语句较长。比如,要想获得某个数据库中数据表字段名称的OL E功能调用语句可能这样:
DBEngine,Workspaces(0).DataBases(0).RecordSet.Fields(0).Name
上面语句中的每个点(.)都需要进行一次OLE功能调用。如果我们想列出所有 的字段名称,一般情况下程序如下:
ForI%=0ToDBEngine.WorkSpaces(0).Database.RecordSet.Fields.Coun t-1
PrintDBEngine.WorkSpaces(0).Database.RecordSet.Fields(I%).Name
Next
上面这段程序用循环的方式将所有字段名称列出来,每一个循环需要有10次 OLE调用(10个点),假设有10个字段,则完成这个循环需要进行100次OLE调用。从 上面的程序中我们可以看到OLE调用语句的前面部分对象都是一样的,我们可以考 虑将其预先定义好,这样就可以减少OLE调用次数,提高效率,将程序改写如下:
DimDBAsDatabase
DimSAsFields
DimFAsField
SetDB=DBEngine.Workspaces(0).OpenDatabase("biblio.mdb")
SetX=DBEngine.Workspaces(0).Databases(0).TableDefs(0).Fields
ForEachFInX
PrintF.Name
Next
改写后的程序在完成定义对象时使用6次OLE调用,循环过程需要10次(10×1 ),完成整个任务只需要16次,和上面的程序比起来效率大大提高了。
2.利用WITH语句来减少OLE调用次数
比如,我们通过OLE功能定义某个字段的属性语句可能这样:
DBEngine.WorkSpaces(0).Database.RecordSet.Fields(0).Name="Book "
DBEngine.WorkSpaces(0).Database.RecordSet.Fields(0).Required=T rue
DBEngine.WorkSpaces(0).Database.RecordSet.Fields(0).Size=20
DBEngine.WorkSpaces(0).Database.RecordSet.Fields(0).Type=db Te xt
DBEngine.WorkSpaces(0).Database.RecordSet.Fields(0).Value="MSD OS"
上面的语句运行效率不高,且书写繁琐,利用WITH语句改写如下:
WithDBEngine.WorkSpaces(0)
.Database.RecordSet.Fields(0)
.Name="BOOK"
.Required=True
.Size=20
.Type=dbText
.Value="MSDOS"
EndWith
改写后的程序书写简单、效率也高(OLE调用次数少)。
3.利用服务方程序的宏来减少OLE功能调用次数
如果要从VB中通过OLE调用WORD中的某些功能来完成某项任务,首先在WORD中 将所要使用的功能用记录宏的方式记录成一个宏(根据实际情况可修改记录后的宏 代码),然后再用VB的OLE功能调用WORD来执行这个宏,这样可避免反复用VB的OL E功能调用WORD来完成任务,简化了程序,提高了效率。
b VB中APP对象及其应用
初学VB编程,很快就能编出些实用的程序了。我便将它们制成安装盘送给朋友, 但很快就发现一个问题,程序总是按编程时固定好的路径读写文件,但文件路径 改变,程序就找不到路径了,因此不能正常写文件。例如编程时设定:picture1 .picture=Load Picture("c:\HVB\HAN.BMP")但若安装使用时,工作目录变为E: \HVB\HAN.BMP或其它路径,程序就会出错,并提示:找不到文件路径。这个问题 看起来很复杂,但实际上很好解决,这只需用VB的App对象。
App对象有两种重要属性:(1)App.Path,它在VB编程状态下返回你的.MAK文件所 在目录;在以.EXE文件运行时,则返回你的.EXE文件所在目录。(2)App.EXE Nam e它返回你的程序名。下面举一个简单的例子,假如你有一个程序为DDC,其目录 为C:\HVB\DDC4(包括DDC.EXE)在VB编程环境下,在Debug窗口运行:Print App. Path,显示结果:C:HVB\DDC4,再运行Print App.EXEName显示结果:DDC。知道 了以上两种属性,前面所述问题就很好解决了,可以将其修改为:Dim Apath ,D im FilePath
Apath=App.Path
FilePath=Apath+"\HAN.BMP"
Picture1.Picture=LoadPicture(FilePath)
这样,这程序的工作目录无论改为什么,都能正常工作了。
(注:文件目录为根目录时,以上情况略有不同,App对象在VB2.0以上版本中均存 在。)
c VB中DRAGDROP事件与DRAGOVER事件的使用
在WINDOWS中,拖动意味着移动光标到对象上,按住鼠标,接着移动鼠标使对 象在屏幕内滑动以重新定位对象。当释放鼠标按钮时,在拖动对象所在控件边界 内放开鼠标会触发DragDrop事件。如果放开鼠标时对象不在一个控件的上面,那 么对象定位于窗体本身。
如果一个对象在一个控件(或窗体)上被放开,并且在后者的DragDrop事件 中没有放任何内容,那么“被放开”的对象将仍然在窗体上原先位置出现,不会 出现其他事情。因此,拖动对象的DragDrop事件不是用来存放有关放开对象时执 行某些指令的地方。而应将这些指令放到背景的DragDrop事件中或者拖动对象所 放开的目标控件中。
一个DragDrop事件提供三条信息--DragDrop(Source as Control,X as Single,Y as Single)Source,是已经放开的图片,图标或控件。X和Y值,是放 开事件所在目表对象的水平和垂直方向位置。如:
Sub pictrue1-DragDrop(Source as Control,X as Single,Y as Single)
Pictrue1.DrawWidth=6
picture1.pset(x,y),QBcolor(4)
End Sub
当一个控件拖动到另一个之上时,发生一个DragOver事件,以警告被入侵的 控件或窗体发生了拖动。一个DragOver事件提供四条信息:
DragOver(Source as conterol,X as Single,Y as Single,State as Integer)
“Source”为入侵者标志。入侵者在被入侵的控件或窗体内的当前位置由X, Y来确定入侵者的状态,如是否刚刚进入。仍在其内或将要离开等由State变量报 告。
通过允许用户拖动一个指针在屏幕上移动,接触窗口内的不同区域引起事情 发生。一种常用的编程技术是和一状态栏一同使用。状态栏随程序运行时的情况 而改变,报告光标的当前位置,变量如Font等的状态,提供一种有效的帮助功能 。
=============================================
问题征答(6.9)
您好!
如何在一个窗体FORM1上建立另一个窗体FORM2的快
捷方式图案?即在窗体FORM1上有个窗体FORM2的快捷方
式图案,当双击该图案时,调用FORM2的程序。我的意
思是:为FORM2创建快捷方式,以后可以通过鼠标拖动
到FORM1的界面上。
DAVID
1999年6月8日
=============================================
其它
====================================================================
欢迎订阅VB免费邮件:
订阅地址 http://server.com/WebApps/mail-list-subscribe.cgi?id=16852
====================================================================
如果您觉得这个邮件列表好的话,请告诉您的朋友。
====================================================================
欢迎投稿 [email protected]
====================================================================
网易上的主页地址:http://www4.netease.com/~aaaaaaaaa
本网站主页镜像地址:goodvbhome.yeah.net
====================================================================
-- 欢迎访问主页:goodvbhonme.yeah.net
或:http://www4.netease.com/~aaaaaaaaa
http://personal.gz168.gnet.gd.cn/vbok/
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.45.236]
|
|