Huashan: VB中Form的Picture属性不能将图象自动平铺到整个表单中,只是以原大小显示(而VFP中好象可以),请问如何实现。
李海:1、你可以Form上放置一个PictureBox,将Visible属性设为False,AutoSize属性设为True。将PictureBox的Picture属性设置为你需要的图片。然后在Form_Paint事件中输入如下代码:
Private Sub Form_Paint()
Dim wid As Single
Dim hgt As Single
Dim x As Single
Dim y As Single
wid = Picture1.ScaleWidth
hgt = Picture1.ScaleHeight
y = 0
Do While y < ScaleHeight
x = 0
Do While x < ScaleWidth
PaintPicture Picture1.Picture, _
x, y, wid, hgt
x = x + wid
Loop
y = y + hgt
Loop
End Sub
回到开始Huashan: VB的Crystal Report中如何加入一个非数据库文本或程序中某个变量的值(如出报表的人名、单位等),我是在数据表中加一个字段来实现的,但太浪费。另外,怎样将多个报表连续输出而中间不换纸?
李海: Crystal Reports当然可以插入非数据库文本。从Insert菜单上选择Text Field就可以输入文本。插入文本的工具条按钮就在插入字段的按钮的右边。除了普通文本,你还可以插入公式、矩形、图片、OLE对象等。
如果你想插入程序中的变量,可以在Crystal Reports插入一个公式,在图1所示的对话框中输入以下公式@VarC:
NumberVar c;
c
图1 在Crystal Reports中插入公式
然后在VB程序中设置@VarC公式来显示变量,如下面的代码将VarC的植改为VB的nCount变量的值。
CrystalReport1.Formulas(0) = "VarC=" + CStr(nCount)
CrystalReport1.PrintReport
当然你还可以实现更复杂的公式,如:CrystalReport1.Formulas(0) = "VarC=" + CStr(nCount) "*{file.SALES}"。
至于将多个报表连续输出而中间不换纸,很遗憾,没有办法。这是由Windows打印方式决定的,它只能一页一页地打。
回到开始Huashan: 数据库教材中说嵌入式SQL可与宿主语言中的主变量通信,如:
SELECT AVG(FIELD1),SUM(FIELD1) INTO :AVG%,:SUM% FROM TABLE(至少PL/1中是这样),但VB中用DB.Execute "SELECT AVG(FIELD1),SUM(FIELD1) INTO :AVG%,:SUM% FROM TABLE"根本不识别,请问VB中如何用SQL实现象求平均值、合计之类的运算及VB能否与其嵌入式SQL进行变量通信。
李海:虽说SQL是标准化的查询语言,但不同的系统在实现的时候还是略有不同。VB的SQL语句SELECT … INTO只能将结果输出到表中,而不能输出到VB变量中。VB中求平均值、合计之类的运算采用另一种办法:即先建立一个Recordset,然后从Recordset的字段中得到结果
Dim Rst As Recordset
Set Rst = Db.OpenRecordset("SELECT AVG(FIELD1), SUM(FIELD1) FROM TABLE")
Rst(0)是AVG(FIELD1),而Rst(1)是SUM(FIELD1)。
回到开始Huashan: VB中有没有读取INI文件的函数,同样功能的API函数是什么?
李海:VB没有直接读写INI文件的语句,必须借助Windows API来操作INI文件。相应的Windows API函数有两类:一类是GetProfileInt、GetProfileString、WriteProfileInt和WriteProfileString,它们是读写Win.ini中的设置;另一类是GetPrivateProfileInt、GetPrivateProfileString、WritePrivateProfileInt和WritePrivateProfileString,它们可以读写如何一个.ini文件。这些函数的声明都在Win32api.txt中找到。先在VB中建立一个模块,输入以下代码:
Declare Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileStringA" (ByVal lpApplicationName _
As String, ByVal lpKeyName As Any, ByVal lpDefault As String, _
ByVal lpReturnedString As String, ByVal nSize As Long, _
ByVal lpFileName As String) As Long
Declare Function WritePrivateProfileString Lib "kernel32" _
Alias "WritePrivateProfileStringA" (ByVal lpApplicationName _
As String, ByVal lpKeyName As Any, ByVal lpString As Any, _
ByVal lpFileName As String) As Long
下面的例子将从njcom.ini中读取NJStar Communicator的目录。
Dim s As String * 256
GetPrivateProfileString "NJCOM Options", _
"Home Directory", "", s, 256, "njcom.ini"
Label1.Caption = s
下面的例子将利用WritePrivateProfileString删除掉njcom.ini中Home Directory设置。这里我们的第三个参数不是通常的字符串,而是0&,这里你可以看到我们在声明参数类型时使用As Any的好处。
WritePrivateProfileString "NJCOM Options", _
"Home Directory", 0&, "njcom.ini"
回到开始
chlitina01:我用VB连接ACCESS数据库编程,请问如将ACCESS数据库加一密码,用VB的OPENDA
TABASE打开数据库时,如何将密码加上才能打开?否则提示出错。谢谢!
李海:OpenDatabase的第4个参数是就是用来打开加密的数据库。这个参数是由两个部分组成的。第一个部分是数据库类型,如FoxPro 2.5等,对于Access数据库,这一部分为空。第二个部分是一些参数,如pwd=password表示密码是password。两个部分之间使用“;”号分割。下面的例子打开一个带有密码的数据库,密码为outlook:
Dim MyDatabase As Database
Set MyDatabase = Workspaces(0).OpenDatabase("CSMain.mdb", True, False, ";pwd=outlook") 如果是使用Data控件打开数据库,需要设置Connect属性,格式同OpenDatabase的第4个参数。
回到开始
马天:我是一个VC的新手,最近,我学习使用WIN32 API的方式写程序,遇到一些问题。 (现在我正在使用MS-VC++4.1.)
第一:是否每一个程序都要*.def文件和*.mak文件。第二:我从书上抄的一个程序
不能运行,结果和程序如下:
Linking.....
Creating library Debug/"file name".lib and object Debug/"file name"..exp
"file name".obj:error LNK2001:unresolveed external symbol_imp_sndPlaySoundA@8
Debug /"file name".exe:fatal error LNK1120: 1 unresolve externals error executing link.exe.
ect.
CHIMES.CPP
1://porgram CHIES.CPP
2:#define STRICT
3:#include <windows.h>
4:#include <mmsystem.h>
5:
6:int WINAPI WinMain(HINSTANCE hInst,
HINSTANCE hPrevinstance,
LPSTR IpszCmdparam,
int nCmdshow)
{
sndPlaySound("CHIMES.WAv",SND_SYNC);
return 0;
}
我查询HELP文件,HELP文件说问题是由于sndPlaySound函数在头文件中是一个INLINE类型不能和*.CPP文件分开使用,但经多次修改仍无法运行,请编辑帮助解答。
李海:1、不是每个程序都需要*.def文件的,如果没有找到*.def文件,VC会采用默认的设置。但如果你的程序用到一些设置,如EXPORTS、SECTIONS等,则需要在*.def中定义。*.mak也不是必须的,但通常VC会根据需要自动生成,这时,你不要直接修改生成的*.mak文件。
2、象这种错误一般都是由于需要某些.LIB文件。你可以在工程设置的Link部分加上所需的.LIB文件(图1)。如果你不知道哪个文件是你要的,可以使用Windows 95的搜索工具在VC的Lib目录中查找指定的符号,例如,sndPlaySound在winmm.lib中。
图3 在工程设置的Link部分加上所需的.LIB文件
回到开始Xu Zhenming:我需要在计算机中输入英语音标,但在Word97的特殊符号中不能找到全部的音标,而且又很繁琐,另外我在Windows98的软键盘中只能找到中文拼音。希望你能帮助我找到快速输入英语音标的方法或软件,拜托!
李海:你需要的是一种能够显示和打印的音标符号字体。许多百科全书和多媒体英文字典都会安装象Phonetic这样的音标符号字体,所以如果你的系统中找到这样的字体就可以方便地使用音标符号字体了。如果没有也不要紧,可以从网上免费下载这样的字体。你可以访问国际音标协会(IPA)的主页:http://www.arts.gla.ac.uk/IPA/ipa.html,在那里你可以找到多种国际音标字体和丰富的有关国际音标的知识。我推荐其中的两个字体软件:SIL Encore IPA Fonts(http://www.sil.org/computing/fonts/encore-ipa.html)和IPAPhon(http://www.chass.utoronto.ca:8080/~rogers/fonts.html)。前者下载后直接运行EXE程序就会自动安装字体。后者下载IPAPHON.ZIP文件后,将其中包括的四个文件释放到Win95\Fonts目录中就可以了。这两个软件的字体都是True Type的,所以可以在所有Windows软件中打印和显示。在Word中,你可以在特殊符号中找到各种音标符号(图4)。SIL Encore IPA Fonts字体将常用的音标符号定义在字母键区,输入更方便。IPA所定义的特殊符号参见图5(实际许多国际音标字体的字符都多于IPA的规定)。我学过英语和德语,但这些符号中的仍有一些是未曾见过的,对于大多数外语教学、研究人员来说,应当是够用的了。如果你想快速输入这些符号,也可以在图1所示的对话框中定义快捷键。
图4 安装SIL Encore IPA Fonts字体后,你可以在插入符号时输入国际音标符号
图5 IPA规定的国际音标符号
回到开始Bug Chen:最近我安装了VC++6.0,VB6.0,从此我每次启动Windows98(英文版)的时候会不定期的出现RPCSS.EXE错误.而删除了该文件后就没有问题了,我想问一下这个RPCSS.EXE是什么东东!删除了以后会不会有什么后遗症?
李海:这是Windows 98的一个Bug。这种情况只有在下面四个条件都满足时会发生:
RPCSS.EXE是RPC Server,如果你打算编写Win98的DCOM应用程序会因此失败。
回到开始北京 李中未: 请问:在Delphi编程中,如何实现用回车键在若干个编辑窗口中切换?比如,姓名和密码两个输入窗口,输入姓名后,只能用Tab键或用鼠标定位光标到密码输入窗口,我想用回车键切换窗口。
李海:1、先将窗体的KeyPreview属性设为True。然后在FormKeyPress事件中加入以下代码:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then { 如果按下了回车键 }
begin
Key := #0; { 吃掉回车键 }
Perform(WM_NEXTDLGCTL, 0, 0); { 移动到下一个控制 }
end;
end;
这个方法对于大多数控件都适用,但不适用于TButton控件,因为对于按钮,回车键等于按下了按钮,不触发FormKeyPress事件。
回到开始北京 李中未: 在Delphi编程中,如何调用其他应用程序?比如,在程序菜单中调用Windows的画笔或写字版。
李海:如果运行一个程序之后不等待程序的结束,可以使用Win32 API中的WinExec或ShellExecute函数。如:
WinExec('Notepad', SW_SHOWNORMAL);
如果运行一个程序之后等待程序运行结束后再进行其他工作,可以使用下面的代码:
var
sCommandLine: string;
bCreateProcess: boolean;
lpStartupInfo: TStartupInfo;
lpProcessInformation: TProcessInformation;
begin
bCreateProcess := CreateProcessA(nil, 'Notepad',
nil, nil, True, NORMAL_PRIORITY_CLASS, nil, nil,
lpStartupInfo, lpProcessInformation);
if bCreateProcess then
WaitForSingleObject(lpProcessInformation.hProcess, INFINITE);
end;
如果您有任何建议,请给我发电子邮件:
。
版权所有 李海,热情软件屋 1997-2006