编程104问
编程104问1,Q:用 DEBUG 读取硬盘的主引导记录:
A: C:\>DEBUG
-a100
mov ax,0201 ;02 代表“读”
mov bx,200 ;运行结果放在内存地址 0200 处
mov cx,1 ;
mov dx,80 ;80 代表第一硬盘
int 13 ;调用磁盘中断
int 20 ;结束程序
-g=100 ;从 100 处开始运行程序
-d200 ;显示主引导记录
-q
2,Q:用批处理给一系列文件循环改名:
A:假设有三个文件,名为F3.EXE,F2.EXE,F1.EXE,则以下批处理可以给他们循环改名:
AUTO.BAT:
ren F3.EXE X
ren F2.EXE F3.EXE
ren F1.exe F2.exe
ren X F1.EXE
3,Q:那些 Web server 支持 ASP?
A:一般情况下,只有 Windows 下的 Web server 支持 ASP, 如高版本的 IIS、PWS4.0 等。Windows98 和 Windows98se 上随盘附带的 PWS 可以支持 ASP。 WindowsNT4.0 安装 SP4 和 OP4 后,也可以支持 ASP。Windows2000 直接支持 ASP。一些在 UNIX 下运行的 Web Server,安装特定软件后,也可以支持 ASP。
4,Q:为何我将这句话(“Let's go now!”)插入到数据库中的时候会发生错误?
A:因为大多数的数据库(Access,MS SQL Server) 都把单引号当作分割符号使用的,所以不可以直接将单引号插入到数据库中,你必须在执行SQL语句之前, 分别将每一个单引号替换成两个单引号:
MyData=Replace(MyData," ' "," '' ",1)
然后,再保存到数据库中就行了。
5,Q:在 ASP 中使用 ADO 的 AddNew 方法和直接使用“Insert into...”语句有何不同?那种方式更好?
A: ADO 的 AddNew 方法只是将“Insert into ”语句封装了起来, 所以,当对大量数据进行操作的时候,直接使用SQL语句将会大大加快存取数据的速度,因为他减少了ADO的 “翻译”时间。虽然SQL语句不如 AddNew 等语句容易接受,但是学习一些常用的 SQL 语句在进行数据库编程中是非常重要的。
6,Q:经常看到联接数据库有两种方式 DSN 以及 DSN-LESS,两者是什么意思? 有什么不同吗?
A:DSN 是英文“Data Source Name”(数据源名)的缩写,DSN方式也就是采用数据源的联接方式,这个数据源可以在“控制面板”里面的“ODBC Data Sources”中进行设置,然后就这样使用: Conn.Open "DSN=Test;UID=Admin;PWD=;"其中的“Test”就是你自己设定的数据源的名称。注意,要同时使用 UID 以及 PWD,否则会出错。
同样的,DSN-LESS 就是非数据源方式的联接方法,使用方法是:
Conn.Open "Driver={Microsoft Access Driver (*.mdb)};Dbq=\somepath\mydb.mdb;Uid=Admin;Pwd=;"
在相同的硬件环境下,DSN-LESS 方式要比 DSN 方式的性能要高,但是一旦 ASP 源代码因为某些安全问题而被别人看到,将会泄漏数据库的账号以及密码,所以这两种方式是各有利弊的。
7,Q:为什么我使用“Window.open()”方法打开的新窗口的 ASP 页面中经常会出现 Session 丢失的现象?
A:微软的 IE4.x 会经常出现这种情况,但 IE5.x 中已经纠正了这个错误。 所以,为了兼容所有的浏览器,你可以使用诸如“test.asp?name=xxx”的方式来在窗口之间传递参数,这样的效果更好, 只是要注意,如果传递的参数很重要,请不要使用明文方式进行传递,否则很容易导致安全问题。
8,Q:好像 Redirect 方法只可以重新定向到同一帧里面,可不可以定向到其他帧呢?
A:可以,要加上这个:〈BASE Target="FrameName"〉。 然后,当你再使用 Redirect 方法的时候,就会重新定向到名字叫做 FrameName 的帧里面了。
9,Q:为什么我使用 Response.Redirect 的时候出现错误?
A:最常见的原因就是你在写入页面之后对 HTTP 标题进行了修改,解决的方法是在页面的开始写上
〈%Response.Buffer=True%〉
10,Q:最近随同 IIS5.0 一起出现的 ASP3.0 有何新的功能?
A:其实并没有什么新的变化,但是新增加了两个 Server 对象的方法:Server.Transfer 以及 Server.Excute,还有一个新的对象 ASPError。具体的使用方法请参考微软的网站:[url=http://www.microsoft.com/]www.microsoft.com[/url]。
11,Q:我有没有必要在每一个 ASP 文件中使用“Option Explicit”?
A:你最好这样,因为这样可以使得你的程序出错机会降到最少,并且会提升整体性能将近 9.8% 。
12,Q:我需不需要在每个 ASP 文件的开头使用 〈%@LANGUAGE=VBScript%〉?
A:如果你使用的脚本语言就是 VBScript 的话, 请尽量不要使用这个语句(VBScript是 ASP 的缺省脚本语言),否则程序整体性能将会下降将近 1.2%。 但是如果你使用的并不是 VBScript 语言的话,请使用这个语句。
13,Q:我在 ASP 脚本中写了很多的注释,这会不会影响服务器处理 ASP 文件的速度?
A:经国外技术人员测试,带有过多注释的 ASP 文件整体性能仅仅会下降 0.1%,也就是说基本上不会影响到服务器的性能下降。
14,Q:为什么我的记录集的 RecordCount 值总是返回 -1 ?
A:你应当使用这种模式来打开存取数据库的记录集:
rec.open strSQL,conn,1,1
其中的 strSQL 是操作数据库的 SQL 语句; conn 是联接数据库的 Connection 变量。
15,Q:什么是线程?
A:线程是指程序的一个指令执行序列,WIN32 平台支持多线程程序,允许程序中存在多个线程。 在单 CPU 系统中,系统把 CPU 的时间片按照调度算法分配给各个线程,因此各线程实际上是分时执行的,在多 CPU 的 Windows NT 系统中, 同一个程序的不同线程可以被分配到不同的 CPU 上去执行。由于一个程序的各线程是在相同的地址空间运行的,因此设及到了如何共享内存, 如何进行线程通信等问题,这样便需要处理各线程之间的同步问题,这是多线程编程中的一个难点。
16,Q:在 VB 中用 ADO 通过 ODBC 连接 ORACLE 数据库,读取有记录的表中的数据时为何返回结果的总是 NULL?
A:请使用微软的 ODBC for Oracle 驱动程序,在 ODBC 管理器中是 Microsoft ODBC for Oracle。不要使用 Oracle 自带的驱动程序。尽量使用新的 ODBC 驱动程序。
17,Q:VB 在打开窗口中,文件类型及文件名变为乱码,不知如何解释(重装后也不行)?
A:将 \windows\fonts 目录下的一个名为 mingliu.ttc 的文件删了试试。
18,Q:请问怎样在 VB 中设置系统热键?
A:代码如下:
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As Integer
Private Function MyHotKey(vKeyCode) As Boolean
MyHotKey = ((GetAsyncKeyState(vKeyCode) < 0))
End Function
然后,建立一个 timer 控件,输入以下代码:
Sub timer1_timer()
If myHotKey(vbkeyX) then … ' 这里的 vbkeyX 是指系统热键为 X
End Sub
19,Q:如何让一个窗口总是处于各窗口的最上层?
A:代码如下:
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Const HWND_TOPMOST = -1
Private Sub Form_Load()
SetWindowPos Me.hwnd,HWND_TOPMOST,Me.Left/Screen.TwipsPerPixelX, _
Me.Top\Screen.TwipsPerPixelY,Me.Width\Screen.TwipsPerPixelX, _
Form1.Height \ Screen.TwipsPerPixelY, 0
End Sub
20,Q:我想在 Delphi 程序中直接调用 Word 文档并使用 Word 的功能,这个程序该怎样编? 该用什么控件呢?
A:
方法一:
1) 从 WORD.EXE 中导入 WORD 的 Type Library
2) var wd : _Application;
wdt : Table;
dot1,FileName: OleVariant;
begin
dot1 := 'c:\abc.dot';
wd := coApplication_.Create;
wd.Documents.Add(dot1, EmptyParam);
wdt := wd.ActiveDocument.Tables.Item(1);
wdt.Cell(1,3).Range.Text := 'Hello!';
//以下是保存和关闭文档及 Word, 可以不关,下面两个例程略过此步。
//EmptyParam 用来代替不使用的参数。
FileName := 'c:\test.doc';
wd.ActiveDocument.SaveAs(FileName,EmptyParam,EmptyParam,
EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,
EmptyParam);
wd.ActiveDocument.Close(EmptyParam,EmptyParam,EmptyParam);
wd.Quit(EmptyParam,EmptyParam,EmptyParam);
end;
方法二:
var
Ole: Variant;
NewDoc: Variant;
DocTable: Variant;
begin
//方法二的参数可以直接使用 Delphi 的数据类型。其它方法只能使用 OleVariant 类型.
Ole := CreateOleObject('Word.Application');
Ole.Application.Visible := true;
NewDoc := Ole.Documents.Add('C:\abc.dot');
DocTable := NewDoc.Tables.Item(1);
DocTable.Cell(1,3).Range.Text := 'Hello!';
//设置Variant对象为UnAssigned来释放该对象的引用。
NewDoc := UnAssigned;
DocTable := UnAssigned;
Ole := UnAssigned;
end;
方法三:使用 Server 页的 TWordApplication 控件,同理,你可以用里头的所有控件。Ole 为TWordApplication控件名称。
var
NewDoc: Variant;
DocTable: Variant;
o: OleVariant;
begin
o := 'c:\abc.dot';
NewDoc := Ole.Documents.Add(o,EmptyParam);
DocTable := NewDoc.Tables.Item(1);
DocTable.Cell(1,3).Range.Text := 'Hello!';
NewDoc := UnAssigned;
DocTable := UnAssigned;
end;
推荐用方法一和方法三。因为方法二不提供类型参数检查,也因为方法二的接口调用效率低。程序中所使用的属性和方法资料可以在 Office 的 VBA 帮助中查到。需要者请在安装 Office 时选择安装 VBA 编程帮助。
21,Q:想用 Dephi4.0 实现这样的效果:在程序启动时在主窗口中同时放置几个 Dockable 的子窗口。子窗口的大小和 Dock 的位置都可以变化,也可以拖离主窗口成为独立的窗口。(如同Visual C++6.0 集成环境的界面一样),请问怎么实现?
A:在 Delphi5.0 的 Borland\Delphi5\Demos\Docking 文件夹下有完整的示例程序,请参看例程
22,Q:我的 VB6 总把全角符号和半角符号一样对待,而且它对字符串的长度也辨不清如len("中华人民共和国")的返回值为 7。而其 FileLen() 的返回值却又似乎正常,等于文件的长度(Bit),请问到底得如何解决?
A: VB4.0 以后,string 类型以 UNICODE 存放,以 ANSI 形式写入文件。所以,len 和 FileLen 结果不同。len 返回字数,每个中、英文均为 1;lenb 返回字节数,每个中、英文均为 2。
如果需要返回 ANSI 的字节数,可用如下函数:
Public Function LenANSI(strU as string) as long
LenANSI = LenB(StrConv(strU, vbFromUnicode))
End function
23,Q:能否在 VB 中作 DLL 文件?
A:VB 不能制作 Win32 DLL 文件,但它可创建 ActiveX DLL。
24,Q:如何在不使用 Windows 的打印对话框或打印设置框的情况下,在 VB 程序中设定打印机的自定义纸张尺寸?
A:可设置 Printer 对象的 Width 和 Height 属性。对于同一种打印机,Windows9X 往往可以成功设置自定义纸张大小,而 NT 不能。这主要取决于打印机驱动程序。另外,即使驱动程序接受这些设置,它也会根据情况作些微调。
25,Q:在 VB 中如何控制计算结果的整数位和小数位?
A:可用 Format 函数,或 VB 新增的 FormatNumber(可本地化)等函数。
26,Q:在 VB6.0 中如何区分汉字和半角西文字符?
A:用 LenB(StrConv(str, vbFromUnicode)),结果为 1 是半角,为 2 是全角。另外一个 undocumented 的方法是,ASC(str),结果>0是半角,<0是全角。
27,Q:微软VISUAL J++ 和 JAVA 有什么不同?
A:微软已经放弃了java,他发布了一个新产品叫 C# 与 sun 的 java 竞争。C# 与 C++ 类似却很容易开发COM/DCOM 程序,但目前北美没有人用 C#。而 sun 的 java 却很热,年薪在 6 万元以上。
28,Q:如何在 VB 中调用资源文件中的资源,如图片、光标等?
A:可用 LoadResPicture(index,format) 来调用。其中“index”是必需的,它是一个整数或字符串,用来指定资源文件中数据的标识符 (ID) ,“format”是必需的一个数值或常数,指定返回数据的格式,返回一个 Picture 对象,例如位图、图标或光标。
例如:Picture1.Picture=LoadResPicture(100, vbResBitmap),常量有vbResBitmap ,vbResCursor, vbResIcon 等。*.res 文件可以用 VC++ 来产生和编辑,在 VB 中调用。
29,Q:是否运行用 Delphi 开发的数据库应用程序时,一定要装 BDE? 能否可以将其包含在应用程序中,使不安装 BDE,就可运行?
A:不可以。BDE 是 Delphi 和 Inprise 公司其他一些产品的数据引擎!有它才可以和 ODBC 相连接。
30,Q:请问怎么样将用VFP5.0编写的小软件编绎成可以脱离VFP而独立运行的软件?
A:将 VFP5.0 的的两个支持文件放置在与可执行文件相同的目录中,或者在 MS-DOS 搜索路径中,即可独立运行。
31,Q: 如何在 VC++6.0 中使用 MSComm 控件与单片机通讯? 要求是 PC 机发一个字节的命令,单片机返回相应的1--3字节数据。
A:首先将端口串行化:
commh = CreateFile(tmpstr, GENERIC_READ,GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
然后设 DCB。读使用 ReadFile(hComm, lpBuf, READ_BUF_SIZE, &dwRead, &osReader); 写使用 WriteFile(hComm, lpBuf, dwToWrite, &dwWritten, &osWrite);
也可以使用 _inp, _outp 来直接写串口的端口。
32,Q:在 VB 网格中输入数据:
A:VISUAL BASIC 提供的网格控制(Grid)主要是用来直观地输出数据,但不能输入数据,使用起来很不方便。能不能向网格中输入数据呢?这里提供一种解决方法,供大家参考:
利用一文本框作为缓冲,实现编辑功能。当网格改变行列时,把网格当前行列的内容传递给文本框;当网格中有 ASCII 字符产生时,把输入焦点设置为文本框,并把输入的 ASCII 字符送给文本框;当编辑完文本框的内容时,按 Enter 键或 TAB 键,把文本框的内容送给网格的当前行列,并把输入焦点设置为网格。
如下程序所示(其中 Textl 为文本框,Labell 为标签,Gridl 为网格):
Option Explicit
Const EnterAsc=13
Const TabAsc=9
Private Sub Form_Load()
Labell.Caption=”请输入”
End Sub
Private Sub Gridl_KeyPress(KeyAscii As Integer)
Text1.StFocus
Textl.SelStart=0
If KeyAscii <> EnterAsc And KeyAscii <> TabAsc Then
SendKeys Chr(KeyAscii)
End IF
End Sub
Private Sub Gridl_RowColChange()
Textl.Text=Grid1.Text
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii=EnterAsc Then
Grid1.SetFocus
KeyAscii=0
End If
End Sub
Private Sub Text1_LostFocus()
Grid1.Text=Text1.Text
End Sub
33,Q:启动“控制面板”中的设置程序:
A:
'控制面板 Control Panel ( CONTROL.EXE )
'----------------------------------------
'Control Panel:
' rundll32.exe shell32.dll,Control_RunDLL
'
'辅助选项 Accessability Options ( ACCESS.CPL )
'-----------------------------------------------
'Accessability Properties (Keyboard):
' rundll32.exe shell32.dll,Control_RunDLL access.cpl,,1
'Accessability Properties (Sound):
' rundll32.exe shell32.dll,Control_RunDLL access.cpl,,2
'Accessability Properties (Display):
' rundll32.exe shell32.dll,Control_RunDLL access.cpl,,3
'Accessability Properties (Mouse):
' rundll32.exe shell32.dll,Control_RunDLL access.cpl,,4
'Accessability Properties (General):
' rundll32.exe shell32.dll,Control_RunDLL access.cpl,,5
'
'添加/删除程序 Add/Delete Programs ( APPWIZ.CPL )
'--------------------------------------------------
'Add/Remove Programs Properties (Install/Uninstall):
' rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,1
'Add/Remove Programs Properties (Windows Setup):
' rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,2
'Add/Remove Programs Properties (Startup Disk):
' rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,3
'
'显示设置 Display Options ( DESK.CPL )
'----------------------------------------
'Display Properties (Background):
' rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0
'Display Properties (Screen Saver):
' rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,1
'Display Properties (Appearance):
' rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,2
'Display Properties (Settings):
' rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,3
'
'区域设置 Regional Settings ( INTL.CPL )
'-------------------------------------------
'Regional Settings Properties (Regional Settings):
' rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,0
'Regional Settings Properties (Number):
' rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,1
'Regional Settings Properties (Currency):
' rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,2
'Regional Settings Properties (Time):
' rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,3
'Regional Settings Properties (Date):
' rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,4
'
'Joystick Options ( JOY.CPL )
'-------------------------------
'游戏控制器 Joystick Properties (Joystick):
' rundll32.exe shell32.dll,Control_RunDLL joy.cpl
'
'鼠标、键盘 Mouse/Keyboard/Printers/Fonts Options ( MAIN.CPL )
'----------------------------------------------------------------
'Mouse Properties:
' rundll32.exe shell32.dll,Control_RunDLL main.cpl @0
'Keyboard Properties:
' rundll32.exe shell32.dll,Control_RunDLL main.cpl @1
'Printers:
' rundll32.exe shell32.dll,Control_RunDLL main.cpl @2
'Fonts:
' rundll32.exe shell32.dll,Control_RunDLL main.cpl @3
'
'邮件和传真 Mail and Fax Options ( MLCFG32.CPL )
'--------------------------------------------------
'Microsoft Exchange Profiles (General):
' rundll32.exe shell32.dll,Control_RunDLL mlcfg32.cpl
'
'多媒体 Multimedia/Sounds Options ( MMSYS.CPL )
'-------------------------------------------------
'Multimedia Properties (Audio):
' rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,0
'Multimedia Properties (Viedo):
' rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,1
'Multimedia Properties (MIDI):
' rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,2
'Multimedia Properties (CD Music):
' rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,3
'Multimedia Properties (Advanced):
' rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,4
'
'声音属性 Sounds Properties:
' rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl @1
'
'安装调制解调器 Modem Options ( MODEM.CPL )
'----------------------------------------------
'Modem Properties (General):
' rundll32.exe shell32.dll,Control_RunDLL modem.cpl
'
'网络设置 Network Option ( NETCPL.CPL )
'-----------------------------------------
'Network (Configuration):
' rundll32.exe shell32.dll,Control_RunDLL netcpl.cpl
'
'口令设置 Password Option ( PASSWORD.CPL )
'---------------------------------------------
'Password Properties (Change Passwords):
' rundll32.exe shell32.dll,Control_RunDLL password.cpl
'
'系统/添加新硬件设置 System/Add new Hardware ( SYSDM.CPL )
'------------------------------------------------------------
'System Properties (General):
' rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,0
'System Properties (Device Manager):
' rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,1
'System Properties (Hardware Profiles):
' rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,2
'System Properties (Performance):
' rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,3
' = = = = = = = = = = = = = = = = = = = = = = = = = = =
'Add New Hardware Wizard:
' rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl @1
'
'日期和时间设置 Date and Time Options ( TIMEDATE.CPL )
'---------------------------------------------------------
'Date/Time Properties:
' rundll32.exe shell32.dll,Control_RunDLL timedate.cpl
'
'微软邮局设置 Microsoft Mail Postoffice Options ( WGPOCPL.CPL )
'-------------------------------------------------------------------
'Microsoft Workgroup Postoffice Admin:
' rundll32.exe shell32.dll,Control_RunDLL wgpocpl.cpl
34,Q:交换鼠标左、右键:
A:拉两个 Command 按钮,键入以下代码可也:
Option Explicit
Private Declare Function SwapMouseButton Lib "user32" (ByVal bSwap As Long) As Long
Private Sub Command1_Click()
SwapMouseButton False '左手
End Sub
Private Sub Command2_Click()
SwapMouseButton True '右手
End Sub
35,Q:程序控制光驱(开)关:
A:在工程中添加“Microsoft multimedia Control6.0”控件,再在窗体上加入该 MMControl 控件和 Command 控件,再键入以下代码(据说是可以开和关,但我没放光盘测试时只能关闭光驱):
Private Sub Command1_Click()
With MMControl1
.DeviceType = "CDAudio"
.Command = "Open"
.Command = "Play"
.Command = "Eject"
.Command = "Close"
End With
End Sub
Private Sub Form_Initialize()
MMControl1.Visible = False
End Sub
另外,有人介绍以下调用 API 的方法开、关光驱,我的机器上也不能实现,大家可以研究一下:
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
Dim retval As Long, retstr As String
Private Sub Command1_Click()
retval = mciSendString("Set CDAudio door open", retstr, 127, 0) '开
End Sub
Private Sub Command2_Click()
retval = mciSendString("Set CDAudio door closed", retstr, 127, 0) '关
End Sub
36,Q:用程序遥控计算器 - VB 的 SendKeys 语句范例:
A:本示例使用 Shell 函数来运行 Microsoft Windows 所附的计算器程序;然后使用 SendKeys 语句来按下计算器的某些数字键,最后退出计算器。(若要观察示例运行过程,可将示例粘贴到过程中,再运行过程即可。因为 AppActivate 会将焦点转移到计算器应用程序,故本示例不能以单步方式来运行。)
Dim Returnvalue, I
Returnvalue = Shell("CALC.EXE", 1) ' 运行计算器。
AppActivate Returnvalue ' 激活计算器。
For I = 1 To 100 ' 设置计数循环。
SendKeys I & "{+}", True ' 按下按键给计算器
Next I' 将所有 I 值相加。
SendKeys "=", True ' 取得总和
SendKeys "%{F4}", True ' 按 ALT+F4 关闭计算器。
37,Q:ASP 编程中参数传递的几种方法:
A:
(1)、<form action=do.asp method=post>
<input name=var1>
<input type=submit>
</form>
在 do.asp 中用 request.form("var1") 取参数的值;
(2)、在 <form></form> 中 action=do.asp?var=参数值,或 <a href=do.asp=do.asp?var=参数值></a>
然后在 do.asp 中用 request.querystring("var") 取参数的值(这是一种明文传递方式);
(3)、使用 Cookies。设置 <%response.cookies("var")="参数值"%>,取值 <%=request.cookies("var")%>;
(4)、用 session 变量传递参数。设置<%Session("var")="参数值"%>,取值 <%=Session("var")%>
(注意:一旦使用了<% %> 的 ASP“标志”符号,该语句就必须保存在 ASP 文件中。)
38,Q:一次性清空本窗口内所有文本框(TextBox):
A:
Dim txt As Control
For Each txt In Me.Controls
If TypeOf txt Is TextBox Then
txt.Text = ""
End If
Next txt
(想一下:如果窗口中有几十个文本框,用传统的编程法要写多少行代码?体会一下面向对象编程的巨大威力吧!)
39,Q:怎样在 VB 程序中播放 Flash 动画?
A:要用到一个播放 Flash 动画的控件 Shockwave Flash。该控件在 Flash4 安装盘的 Plugins 目录下,安装文件是 InstallAXFlash.exe,安装后在 VB 部件中选定即可使用。该控件的主要属性和方法如下:
属性:Movie 动画文件
Playing True/False 是否自动播放
Loop True/False 是否循环播放
方法:Play 播放
Stop 停止
Forward 快进
Back 快退
Rewind 回放
GotoFrame(n) 绕到指定的帧播放
SetZoomRect(left,top,right,bottom) 设置放大时的位置
40,Q:怎样在 VB 程序中实现图象扫描功能?
A:同样要借用第三方提供的函数。在网站 [url=http://www.twain.org/www/toolkit.html]http://www.twain.org/www/toolkit.html[/url] 可下载到 eztw32.dll 动态连接库文件,把它拷贝到 Windows 的 system 文件夹下就可以在 VB 中调用了。
41,Q:在 VB 编程中检测声卡是否存在?
A:
Option Explicit
Private Declare Function auxGetNumDevs Lib "winmm.dll" () As Long
Private Sub Form_Load()
Dim i As Integer
i = auxGetNumDevs()
If i > 0 Then 'There is at least one sound card on the system
MsgBox "A Sound Card has been detected."
Else 'auxGetNumDevs returns a 0 if there is no sound card
MsgBox "There is no Sound Card on this system."
End If
End Sub
42,Q:在 VB 中终止 Windows95 的运行:
A:在Visual Basic 程序中,可以使用 Windows API 的 ExitWindowsEx 函数来从程序中重新启动计算机系 统。 要使用该函数,需要将如下声明语句包含在窗体的通常声明部分中:
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
ExitWindowsEx 函数需要 2 个参数,可以使用一个或多个下面的标识的组合来告诉 ExitWindowsEx 函 数希望进行哪种关机过程。
EWX_FORCE 所有进程都被强制终止
EWX_LOGOFF 所有的进程被强制止,并且用户退出登录(logged off)
EWX_POWEROFF 计算机系统被关机,并且如果支持节电特性则计算机被物理关机
EWX_REBOOT 计算机系统被关机并重新启动
EWX_SHUTDOWN 计算机被物理地安全地关机
下面的样例程序中使用了上面的三个标识的组合。该标识组合(EWX_LOGOFF,EWX_FORCE,以及EWX_REBOOT) 告诉 Windows 退出所有正在执行的进程,使用户退出网络登录,使计算机系统处于准备状态以供 用户关机。
样例程序的使用:
1,在 VB 中开始一个新的项目,采用缺省的方法建立 Form1;
2,将如下常量和声明语句添加到 Form1 的通常声明部分中(注意该声明语句需要书写在一行内):
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Const EWX_LOGOFF = 0
Const EWX_SHUTDOWN = 1
Const EWX_REBOOT = 2
Const EWX_FORCE = 4
Const EWX_POWEROFF = 8
Const EWX_RESET = EWX_LOGOFF + EWX_FORCE + EWX_REBOOT
3,在 Form1 上添加一个命令按钮控件,采用缺省的方法建立 Comand1, 将它的 Caption 属性设置为“ 重 新启动计算机”;
4,将如下代码添加到 Command1 的单击事件中:
Private Sub Command1_Click()
Dim X As Long
X = ExitWindowsEx(EWX_RESET, dwReserved)
End Sub
按下 F5 来运行上述样例程序,单击命令按钮,即可重新启动计算机系统。
43,Q:给一大段 VB 程序一次性加上注释符号:
A:VB 注释程序代码的符号是 ',只要在某行程序前面加上该符号就可以注释该行程序。但如果程序代码语句很多的时候,一行一行地注释就非常不方便。其实 VB 本身提供了一次性注释多条语句的功能:在主菜单“视图”选项的“工具栏”下,选中“编辑”,VB 的界面会出现一排工具按钮,其中就有用于“设置注释块”和“解除注释块”功能的按钮。选中一块语句,按该按钮即可。
44,Q:VB 中在一个窗体中执行另一个窗体中的代码:
A:可以用“窗体.代码”的模式去执行别的窗体的代码。假设要在窗体 frm1 里执行窗体 frm2 的Form_Click 代码,程序如下:
Private Sub Form_Click()
frm2.Form_Click() '在frm1 里执行 frm2 的 From_Click 代码
End Sub
45,Q:Visual Basic 5.0 支持类吗?
A:支持。您可以在 Visual Basic 5.0/6.0 的内部创建自己的类。具体说,您可以为各种类型的应用程序创建标准的基础类库,以便为具体类型的程序提供特定的功能,然后将这些类编译进您的应用程序中。这样做可以节省大量您在某一应用程序中重新编写一系列标准功能所需花费的时间。
46,Q:在 VB 5.0 中文版中,表单上最多允许有多少个控件?
A: Visual Basic 5.0 允许在表单上最多可以有 255 个控件。
47,Q:Visual Basic 能用来创建在 Windows CE 环境下运行的应用程序吗?
A:不能。目前情况下,您必须使用 Visual C++ 或其他与 Windows 95 兼容的 C/C++ 编译工具。
48,Q:Visual Basic5.0/6.0 能用来创建 Windows NT 服务吗?
A:不能。Windows NT 中的服务必须是完全用机器代码编译的可执行文件。Visual Basic 目前不具备这一功能。您必须使用 Visual C++ 4.x 或其他与 Windows NT 兼容的 C/C++ 编译工具来创建服务。有关编写 Windows NT 服务的信息,请参阅微软 MSDN 的有关内容。
49,Q:Microsoft Visual Basic 5 除了支持本机编译的代码外,还支持 p 代码吗?
A:支持。VB5.0 是第一个在将应用程序编译成 p 代码或本机代码方面提供了灵活操作可能性的 RAD 工具。编译成 p 代码可使应用程序的大小优化为最小。p 代码凭借这一最小化特性成为了低带宽条件下创建 Internet 应用程序的首选方式。本机代码编译极大地提高了速度(最高快 20 倍),但生成的可执行文件较大。 Visual Basic 是唯一既能够支持 RAD 的解释方式、编辑与连续、以及开发等,又能够支持从本机编译的 .EXE 文件的 RAD 工具。
50,Q:Microsoft Visual Basic 可以在 Macintosh 上使用吗?
A:VB4.0 引入了可移植的 VBA (Visual Basic for Applications)语言引擎。Microsoft Excel 5.0 最近已在 Macintosh 上发行,其中随附了 Excel 的 VBA 组件,因此在它上面就有这个语言引擎。微软目前似乎对 Macintosh 上的 Visual Basic 版没有任何承诺。
51,Q:Visual Basic 5.0/6.0 支持 16 位开发吗?
A:不支持。Visual Basic 5.0/6.0 只能创建 32 位可执行文件。开发 16 位 Windows 应用程序需要 Visual Basic 4.0。
52,Q:Visual Basic 5.0 中文版内的 Text Box 能存储 64K 以上的数据吗?
A:不能。VB5.0 中文版没有突破文本框的 64K 限制,因为它是由操作系统指定的。如果您需要存储 64K 以上的数据,应使用 Visual Basic 内含的多信息文本框。多信息文本框类似于多行文本控件,不同的是增加了个别字符和段落的格式编排功能。多信息文本框能够保存 64K 以上的文本,提供内置的 OLE 2.0 客户支持,主要特性包括:使一个段落内的文本左、右、居中对齐,可定义左制表位、字体样式、简单的项目符号、查找/替换、上标、下标、加删除线等格式编排。
53,Q:在 ASP 编程中统计查询结果的记录数:
A:
<%
Set theConn=Sever.CreateObject("ADODB.Connection")
Set theRs=Sever.CreateObject("ADODB.RecordSet")
theConn.Open "FILEDSN=d:\Program Files\Common Files\ODBC\Data Sources\MyData.dsn"
theRs.Open "SELECT COUNT(*) as Mycount FROM theTable",theConn
%>
共有<% =theRs("MyCount")%>条记录
<%
theRs.Close
theConn.Close
%>
54,Q:为何无法编译成 dll 文件?
A:无论是用 VB 还是 VJ++,在编译 Active dll 文件时都会发现无法重新编译成 dll 文件的问题。原因是第一次编译后 dll 文件已经被自动注册了。这时关闭 Web server 后即可再次编译,待编译完毕后再打开 Web server。
55,Q:资源文件有什么用处?
A:最重要的有两个地方:
1、国际发行:如果我们将 Application 中所有的文字从 Resource 中读取,那么,只要更动 Resource 文件的内容,就可以用不同语言的方式来显示;
2、管理资源:例如,我们的软件中用了数百张的图片或声音,不用 Resource 文档的话,在发行出去的软件中,就必需有数百个图形、声音文档,那似乎不太好,使用 Resource 文件,便可以将这些图形、声音放进一个 .Res 文档中。
56,Q:如何在 DOS 程序结束执行时,自动将其关闭?
A:在 VB 程序中启动 DOS 程序(或指令)的方法是:
Shell "DOS可执行文件名", vbNormalFocus
例如:Shell "Xcopy c:\temp\*.* d:\temp\*.*", vbNormalFocus
但是当以上的 Xcopy 程序结束执行时, 却会残留着 DOS 窗口没有被关闭,如果想要让 DOS 程序结束执行时, DOS 窗口自动被关闭, 则应该使用以下方法来启动 DOS 程序:
Shell "Command.com /C DOS可执行文件名", vbNormalFocus
例如:Shell "Command.com /C Xcopy c:\temp\*.* d:\temp\*.*", vbNormalFocus
57,Q:VB 编程中打开默认网址和 Email 的更简单的方法:
A:打开网址:Call Shell("start [url=http://www.alchemydev.com/]http://www.alchemydev.com[/url]", vbHide)
打开 Email:Call Shell("start mailto:admin@alchemydev.com", vbHide)
58,Q:我用 VB6.0 的 ActiveX dll 工程开发了一个在 ASP 中调用的 dll 类型库,里面有好多封装的函数,我能不能在 VB 的 EXE 工程中利用它们?
A:当然可以! 这正是微软 COM 模型的具体应用之一。具体用法是:在 VB 的 EXE 工程的 IDE 界面中,引用你建立的类库文件,然后在“对象浏览器”里就可以看到你的所有类及其函数。比方你的类 myobj 中有函数 myfun(),则调用语句是:
dim theobj as new myobj
ret = theobj.myfun() 'ret 为函数返回值
当然如果你要在别的机器上使用你的组件,就必须先进行注册:regsvr32 <你的组件名>
59,Q:“我爱你”病毒传播的秘密:
A:千禧年五月分大面积流行的 "ILOVEYOU" 病毒至今让人记忆尤新。这种病毒是一种通过电子邮件流行的典型的蠕虫病毒。她是通过调用 Outlook 的应用程序对象的属性和方法进行信件发送的,其发送邮件的基本代码如下:
Set OlApp = CreateObject("outlook.application")
Set Oitem = OlApp.CreateItem(olMailItem)
With Oitem
.Subject = "邮件主题"
.To = "收件人"
.Body = "邮件正文"
.attachments.Add "path:附件" ' 添加附件
.Send ' 发送邮件
End With
60,Q:在 PowerBuilder 中使用 RichTextEdit 控件,属性中没用 Font,我想设置字体怎么办(如果不设字体,读入一个文本文件,缺省的字体对不齐)?
A:RichTextEdit 没有 Font 属性,在 Document 属性页中选择 Toolbar,使用的时候可以自行选择字体。
61,Q:在一个 PowerBuilder 程序中,我想用 RichTextEdit 控件从本地取文本文件显示,可是在我的机器上 RTE 只能显示出少量英文和乱码,程序并没有编错,因为相同的程序在其他人的机器上显示出的是正确的文本,不知是什么原因?
A:应该是默认的类型不正确,导入的时候指定类型为 FileTypeText 试试。
62,Q:如何在 PowerBuilder 的 BLOB 字段中写入大于 1M 的文件(数据库为MSSQL 7.0)?
A:源文件分块写。
63,Q:用程序控制电脑说英语?
A:现在,应用 Microsoft 提供的一套文字朗读引擎(Text-To-Speech Engine,简称 TTS),可以在程序中编写代码来使安装了声卡的电脑流畅的朗读英文。如果安装了“金山词霸2000”,那么 Windows 文件夹下会有一个 Speech 文件夹,里面的文件 vtxtauto.tlb 文件就包含了有关的类型库和函数,我们完全可以在我们的程序中调用它们,使电脑开口说话。TTS 包含在“金山词霸2000”的安装盘上,文件名为 mstts.exe 和 spchapi.exe。要在 VB 程序中调用 TTS,必须首先引用 vtxtauto.tlb 文件中的“VoiceText 1.0 Type Library”类型库,然后参考以下代码,电脑就可以说话了:
Option Explicit
Private Sub Form_Load()
Call VTxtAuto.VTxtAuto.Register(Space(1), Space(1))
VTxtAuto.VTxtAuto.Speed = 170 '设置语速(170 为正常语速,值越小语速越慢)
Dim strTxt
strTxt = "I love you very much.Do you love me? "
On Error GoTo ErrorHandler
Call VTxtAuto.VTxtAuto.Speak(strTxt, vtxtsp_VERYHIGH + vtxtst_READING)
MsgBox "OK!"
End
ErrorHandler:
' 错误处理语句
End
End Sub
至于语速、频率等的控制,大家可以在“对象浏览器”里参看相关的控制属性。
(站长话题:什么时候能够让电脑说一口流利的中国普通话甚至是方言呢?
但愿不会让我们等待太久!
但愿生产厂家能够像微软一样把技术公布给普通用户!)
64,Q:怎样判断、防止程序重复执行?
A:
Private Sub Form_load()
'判断程序是否已经运行
If App.PrevInstance Then
MsgBox "本程序已经运行!", vbInformation Or vbOKOnly, "提示信息"
Unload Me
Exit Sub
End If
'以下是主要程序
' ……
End Sub
附:另一个例子:
Option Explicit
Public Sub CheckExist(fm As Form) '防止程序重复执行
Dim title As String
If App.PrevInstance Then
title = App.title
Call MsgBox("这程序已执行", vbCritical)
App.title = "" '如此才不会 Avtivate 到自己
fm.Caption = ""
AppActivate title 'activate 先前就已运行的程序
End ' 结束
End If
End Sub
Private Sub Form_Load()
Call CheckExist(Me)
End Sub
65,Q:如何结束 Shell 所启动的程序?
A:如果被 Shell 所启动的程序还没有结束,我们就想主动结束它,该怎么做呢? 此时应调用的 Windows API 是 TerminateProcess, 细节如下:
1. API 的声明:
Const SYNCHRONIZE = &H100000
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" Alias "TerminateProcess" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
(注1:如果以上的声明放在「一般模块」底下,应将 Declare 之前的 Private 保留字去掉,并且在 Const 之前加上 Public 保留字。)
2. Shell 的程序范例:(以执行 MS-DOS 为例)
Dim pId As Long, pHnd As Long ' 分别声明 Process Id 及 Process Handle 变数
pId = Shell("Command.com", vbNormalFocus) ' Shell 传回 Process Id
pHnd = OpenProcess(SYNCHRONIZE, 0, pId) ' 取得 Process Handle
Call TerminateProcess( pHnd, 0 ) ' TerminateProcess 所传入的是 Process Handle
Call CloseHandle( pHnd )
(注2:以上的方案只适用于 Shell 所启动的程序,ShellExecute 则不适用,原因是 ShellExecute 函数是通过资源管理器来启动程序,而资源管理器启动程序之后,并没有将 Process ID 或 Process Handle 传回来。
注3:以上程序在 Windos98、VB6.0 下调试通过。)
66,Q:用 VB5.0 创建 Windows 程序组中的快捷方式:
A:
'API 函数声明:要在 VB5.0 中创建 Windows 的快捷方式,需要用到一个动态链接库 Vb5stkit.dll。在该动态链接库中提供了三个函数 OSfCreateShellGroup、OSfCreateShellLink、OSfRemoveShellLink,分别用于创建快捷方式程序组、快捷方式、删除快捷方式。这三个函数的声明形式分别如下:
Private Declare Function OSfCreateShellGroup Lib "Vb5stkit.dll" Alias "fCreateShellFolder" (ByVal lpstrDirName As String) As Long
Private Declare Function OSfCreateShellLink Lib "Vb5stkit.dll" Alias "fCreateShellLink" (ByVal lpstrFolderName As String, ByVal lpstrLinkName As String,ByVal lpstrLinkPath As String, ByVal lpstrLinkArguments As String) As Long
Private Declare Function OSfRemoveShellLink Lib "Vb5stkit.dll" Alias "fRemoveShellLink" (ByVal lpstrFolderName As String, ByVal lpstrLinkName As String) As Long
'实现的语句:
Dim lresult As Long
lresult = OSfCreateShellGroup("Test") '在程序菜单中添加一个名为 Test 的程序组
lresult = OSfCreateShellLink("test", "记事本", "c:\Windows\notepad.exe", "")
'在程序菜单的Test程序组下创建记事本的快捷方式
lresult = OSfRemoveShellLink("Test", "记事本") '删除 Test 程序组下的快捷方式
(注:在 Windows98/NT4.0、VB5.0 下可以正常运行。但创建桌面快捷方式和 Start Menu 快捷方式有些问题。在 VB6.0 中也有些问题(是否要安装 SP3?)。)
67,Q:VB 中使 TextBox 按 Mouse 右键时只出现自定 PopUp Menu?
A:一般我们可能在 TextBox 的 MouseDown Event 中 Check 是否按右键,若是,则设定出现 Popup Menu 程式如下:
Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then
PopupMenu MyMenu
End If
End Sub
可是出现的还是原先内定的 Popup Menu,之后再按一次右键,才出现我们自定的 menu。很奇怪吧?如果用 API 来解决,那便是要拦截 Mouse 的按键(使用 SubClassing 的技巧),但是有人发现了以下的方式便可以解决(也是一个十分实作性的经验):
Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then
Text1.Enabled = False : Text1.Enabled = True
PopupMenu MyMenu
End If
End Sub
68,Q:用 VB 实现拖放功能:
A:拖放是用鼠标拖动一个对象到其它对象的活动。在图形操作过程中,拖放是最常用的功能之一,下面我们来看看怎样用 VB 实现拖放功能。
首先介绍与拖放有关的控件:
1.属性:DragMode 决定拖动操作的初始化是人工方式还是自动方式,DragIcon 确定在拖动过程中显示的指针的图标形状;
2.方法:Drag 开始,结束或取消拖动控件;
3.事件:MouseDown 事件发生于用户按下鼠标按钮时,DragOver 事件发生于拖动操作完成时,DragDrop 事件发生于拖动操作正在进行时。
然后编写一个小程序,这个程序能实现在窗口中或窗口间拖动图标的功能。建立窗口 Form1 和 Form2,在窗口中都加入 Image1,为它们设置初始显示的图片。键入以下代码(本程序在 VB5.0/6.0,Window95/98/NT4.0 环境下通过):
' Form1 下程序代码为:
Option Explicit
Dim dragx As Single
Dim dragy As Single
Const BEGIN_DRAG=1
Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)
Image1.Picture=Source 'Sourse为被拖动的控件
Form2.Image1.Picture=LoadPicture("")
Image1.Move(X-dragx),(Y-dragy) ' X,Y为鼠标所在目标窗体或控件的当前坐标
End Sub
Private Sub Form_Load()
Load Form2
Form2.Show 0
End Sub
Private Sub Image1_MouseDown(Button As Integer,Shift As Integer,X As Single,Y As Single)
dragx=X
dragy=Y
Image1.Drag BEGIN_DRAG '开始拖动操作
Image1.DragIcon = LoadPicture("按下鼠标时想显示的光标")
End Sub
' Form2 下程序代码为:
Option Explicit
Dim dragx As Single
Dim dragy As Single
Const BEGIN_DRAG=1
Private Sub Form_DragDrop(Source As Control,X As Single,Y As Single)
Image1.Picture=Source
Form1.Image1.Picture=LoadPicture("")
Image1.Move(X-dragx),(Y-dragy)
End Sub
Private Sub Image1_MouseDown(Button As Integer,Shift As Integer,X As Single,Y As Single)
dragx=X
dragy=Y
Image1.Drag BEGIN_DRAG
Image1.DragIcon=LoadPicture("按下鼠标时想显示的光标")
End Sub
69,Q:用 VB 程序如何改变桌面的墙纸图片?
A:此一问题需调用 SystemParametersInfo API 函数,细节如下:
1. API 的声明:
Const SPI_SETDESKWALLPAPER = 20
Const SPIF_UPDATEINIFILE = &H1
Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByVal lpvParam As Any, ByVal fuWinIni As Long) As Long
注:如果以上的声明放在「一般模块」底下,应在 Const 之前加上 Public 保留字,并且将 Private 保留字去掉。
2. 程序范例:
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, BMP图档名称, SPIF_UPDATEINIFILE)
例如:
' 1. 将桌面图片设定成 c:\windows\setup.bmp:
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "c:\windows\setup.bmp", SPIF_UPDATEINIFILE)
' 2. 将桌面图片清掉:
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "", SPIF_UPDATEINIFILE)
程序如下:
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, BMP图档名称, SPIF_UPDATEINIFILE)
但以上程序设定图片之后,必须等到下次 Windows 重新启动时才生效,如果希望设定之后立刻生效,则程序须修改如下:
Const SPIF_UPDATEINIFILE = &H1
Const SPIF_SENDWININICHANGE = &H2
Const SPI_SETDESKWALLPAPER = 20
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "c:\windows\setup.bmp", SPIF_UPDATEINIFILE + SPIF_SENDWININICHANGE)
此外希望只有本次使用 Windows 时改变桌面图片(下次开机时还原原状),则程序如下:
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "c:\windows\setup.bmp", SPIF_SENDWININICHANGE) ' 去掉 SPIF_UPDATEINIFILE
70,Q:用 VB 程序捕捉屏幕图像:
A:在 Form1 上添加一个 Picture 和 Command 控件,代码如下(Windows98/NT、VB6.0):
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, lpInitData As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Sub ScrnCap(Lt, Top, Rt, Bot)
rWidth = Rt - Lt
rHeight = Bot - Top
SourceDC = CreateDC("DISPLAY", 0, 0, 0)
DestDC = CreateCompatibleDC(SourceDC)
BHandle = CreateCompatibleBitmap(SourceDC, rWidth, rHeight)
SelectObject DestDC, BHandle
BitBlt DestDC, 0, 0, rWidth, rHeight, SourceDC, Lt, Top, &HCC0020
Wnd = Screen.ActiveForm.hwnd
OpenClipboard Wnd
EmptyClipboard
SetClipboardData 2, BHandle
CloseClipboard
DeleteDC DestDC
ReleaseDC DHandle, SourceDC
End Sub
Sub Command1_Click()
Form1.Visible = False
ScrnCap 0, 0, 640, 480
Form1.Visible = True
Picture1 = Clipboard.GetData()
End Sub
71,Q:测试表中的记录总数又一法(笨而准确):
A:
Dim db As Database ' DAO
Dim rs As Recordset
Dim theRecordNum As Long
Set db = OpenDatabase(App.Path & "\mylib.mdb")
Set rs = db.OpenRecordset("test") '测试表 test 中记录数
theRecordNum = 0
rs.MoveFirst
Do While Not rs.EOF()
theRecordNum = theRecordNum + 1
rs.MoveNext
Loop
Debug.Print theRecordNum ' 在监视窗口中输出
72,Q:如何判断生成的记录集是“空集”(记录数为 0)?
A:如果记录集的 eof 为真,则记录集是“空集”:
if AdoRS.EOF=true then
' ……
EndIf
73,Q:VB 编程中如何使窗口右上角的关闭按钮(X)失效?
A:用以下两个过程中的一个即可:
1、Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Cancel = True
End Sub
2、Private Sub Form_Unload(Cancel As Integer)
Cancel = True
End Sub
74,Q:用 VB 实现超级链接功能:
A:声明 ShellExecute 函数;在 form 上建立 label、line 控件各一个(myHttp、Line1),再仿照以下代码,即可打开浏览器登录 [url=http://why100000.at.china.com/]http://why100000.at.china.com[/url] 网站。
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Private Sub myHttp_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Line1.Visible = False
End Sub
Private Sub myHttp_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Line1.Visible = True
End Sub
Private Sub Form_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
Line1.Visible = False
End Sub
Private Sub myHttp_Click()
Dim HttpJump
Dim MyUrl As String
MyUrl = "[url=http://why100000.at.china.com/]http://why100000.at.china.com[/url]"
HttpJump = ShellExecute(0&, vbNullString, MyUrl, vbNullString, vbNullString, vbNormalFocus)
End Sub
75,Q:在 VB 安装程序中加入“卸载”功能:
A:在制作安装盘的过程中,在建立程序项的时候,建立一个名为“卸载”的程序项,“目标”文本框中填入命令:
$(WinPath)\st6unst.exe -n "$(AppPath)\st6unst.log"
这样安装后的程序就会有卸载功能了。
76,Q:怎样在 VC++ 中产生闪烁的光标
A:先调用函数 CreateCaret(),然后再调用函数 ShowCaret()。例如:
if(CreateCaret(hWnd,NULL,2,20))
{
SetCaretPos(0,0);
ShowCaret(hWnd);
}
77,Q:VFP 程序编译成 .EXE 文件后运行,为在什么屏幕上一闪而过就结束了?
A:这是初学 VFP 的人易犯的一个错误,只要在主文件中加入 read events 语句,在退出程序中加入 clear events 即可。
78,Q:VB 中如何在保存并覆盖文件时让其出现对话框,询问是否替换
A:用 CommonDailog 控件,在 CommonDialog 控件 Flags 属性设定中添加 cdlOFNOverwritePrompt,如:
CommonDialog1.Flags=CommonDialog1.Flags Or cdlOFNOverwritePrompt
CommonDialog1.ShowSave
79,Q:VB6 中的字体出现乱码怎么办?
A:这是 VB 的 Bug。引起的原因是系统中安装了 Word2000 或 IE5.x 以及繁体支持,将繁体支持删除,或者安装 VB6 的 SP3 或 SP4 就可以解决问题。
80,Q:怎样用 VB 编写多线程程序
A:尽管 VB5.0 是单线程的,但用 addressof 加上一些 API 函数,就可以非常容易的做多线程程序。每一个线程约占用 20 毫秒的时间片。
VB5 有一个主线程,我们可以另外加一个工作线程。对于不清楚什么是单/多线程的程序员,我们用一个简单的列子来说明一下:
在 Form 里加上两个 timer 控件,把 interval 属性设成 5000(5秒),然后在两个 timer1_timer 事件中放一个大 Loop,如 for 10000 next, 运行。你会看到第二个 timer 控件不会在五秒后执行,除非 timer1 的for-next 结束。同样,如果你的程序中有大量的数据库读写,你的用户界面可能被“冻”。这时,我们就需要用多线程来改进程序了。(当然你可以用 DoEvents 来避免被冻,但用 DoEvents 有很多副作用-这里不提。)
我们用的第一个 API 是 CreateThread,VB 的格式是:
private declare function CreateThread Lib "kernel32" (byval pThreadAttributes as any, byval dwStackSize as long, byval lpStartAddress as long, lpParameter as any, byval dwCreationFlags as long, lpThreadID as long) as long
CreateThread 的参数指出你将要创立的线程是什么样子的,CreateThread 的返回值是一个线程的 handle。以下是
VB 的多线程初始化程序:
Public Sub Initialize(lpfnBasFunc as long)
dim dwStackSize as long
dim dwCreationFlags as long
dim lpThreadId as long
dim lpParameter as long
dim myNull as long
myNull = 0& 'create a null pointer
dwStackSize = 0 '0 表示用 exe stack size
dwCreationFlags = 4 '用 4 表示初始化后先不激活,让别人来激活
Me.Thread = CreateThread(myNull, dwStackSize, lpfnBasFunc, myNull, dwCreationFlags,lpThreadId)
If Me.Thread = myNull then
Msgbox "create thread failed"
End if
End Sub
下面是两个 API 用来激活/暂停该线程:
private declare function ResumeThread lib "kernel32"(byval hThread as long)as long
private declare function SuspendThread lib "kernel32"(byval hThread as long)as long
让我们来用一个变量表示当前线程的状态:
public ThreadStatus as boolean
在 VB 里,可用 property 来实现 ThreadStatus 的管理。
Public property Let Enabled(byval vNewvalue as boolean)
if vNewvalue = true and Me.ThreadStatus = false then
ResumeThread Me.Thread
Me.ThreadStatus = True
elseif Me.ThreadStatus = true then
SuspendThread Me.Thread
Me.ThreadStatus = False
end if
End Property
这个简单的类可以用 New Object 来引用:
'make new thread object
dim myThread as New clsThreads '创建县城 Foo
myThread.Initialize AddressOf Foo '激活县城
myThread.Enabled = True
执行后,你可以用 PVIEW95.EXE 看到你的线程。你还可以提高你的线程的优先级:
SetThreadPriority '设优先级
GetThreadPriority '查优先级
你把以上的程序加入 timer 例子,就会看到两个 timer 同时运行。
这里要提醒一下,VB5 的开发环境是单线程的,如果你的程序写错,或中断后试图恢复,往往会出错,有时是严重出错。总之,用 VB 的多线程可以写出和 VC++ 一样快的程序,而且开发容易的多,开发效率也快得多。
81,Q:加快 Delphi5.0 启动速度
A:Delphi5.0 的启动确实有点慢,既要显示快闪窗口,又要读注册表设置,对于配置低的机器简直是一种折磨,实际上我们可以通过启动参数来控制它:
建立一个快捷方式,目标为:C:\DELPHI5\Delphi5\Bin\delphi32.exe /ns /np (假设 delphi 装在C:\delphi5 目录下),ns 表示 no splash,即不显示快闪屏幕,np 表示 no project,即不加载工程。
82,Q:观察 Delphi5.0 内存堆分配情况:
A:建立一快捷方式,目标为:C:\DELPHI5\Delphi5\Bin\delphi32.exe /hm /hv
此后每启动此快捷方式就可看到 Delphi5.0 的标题栏上不停变化的堆分配字节数。
83,Q:Delphi 中如何在打印或打印预览前获取报表页数
A:有时需要在打印前获取报表的打印页数,比如我们需要在页眉或页脚中打印“共 xx 页 第 xx 页”,如何实现呢?QuickReport 生成 Report 之前,我们是无法得知报表页数的,而 QuickReport 是在打印或打印预览时才生成报表,换言之我们只有在打印或打印预览前先将报表生成一次才能获取打印页数。生成报表的方法是 Prepare,请参考以下的例子:
...
var nPageCount:integer;
begin
{...}
QuickRep1.Prepare;
nPageCount:=QuickRep1.QRPrinter.PageCount;
QuickRep1.QRPrinter.Free;
QuickRep1.QRPrinter:=nil;
{在此修改QuickRep1,实现在页眉或页脚中打印“共 xx 页 第 xx 页” ... }
QuickRep1.PreView;
{...}
End;
84,Q:如何在 Delphi 中实现普通文件的拷贝?
A:示例代码如下:
procedure TForm1.btnCopyClick(Sender: TObject);
var
sfile,dfile : String;
begin
sfile :='a.txt'; //被copy的文件
dfile :='b.txt'; //copy后的文件名
CopyFile(pchar(sfile),pchar(dfile),false);
第三个参数为 false,如果 b.txt 已经存在,则覆盖;如果为 true,则不进行操作。
85,Q:用 Delphi 编写支持多国语言的程序
A:使用 Delphi5.0 的 Integrated Translation Environment(ITE) 可以轻易完成这个工作。
创建一个示意性的工程 MultiLanguage,在 Form 上放一个 Label 和一个 Button,分别把 Caption 赋值为“English Label”和“English Button”。
选择菜单 Project|anguages|Add ...,Delphi 显示 Add Languages 对话框, 选择 Next。
从语言列表中选中“英语(美国)”和“中文(中国)”,选择 Next。
ITE 会根据所选的语言创建子目录,目录名称是语言的缩写,选择 Next。
第一次增加语言时,Update Mode 为 Create new, 选择 Next。选择 Finish。
Delphi 会自动创建支持不同语言的资源动态库。Delphi 还会自动创建一个工程组,其中包括原有的 MultiLanguages.EXE,还包括新建的两个资源动态库(MultiLanguages.enu,MultiLanguages.chs)。保存工程组。
Delphi 启动 Translation Manager,左边是需要翻译的语言,右边是完成百分比。选择“中文(中国)”|Forms|Unit1,在右边第 15 行和 20 行填写翻译后的中文。保存并关闭。
打开 Project Manager,编译 MultiLanguages.enu 和 MultiLanguages.chs,Delphi 会在相应的子目录生成资源动态库,但后缀不是 DLL 而是 ENU 和 CHS。
86,Q:在 SQL Server 中怎么样恢复数据的存储?
A:在 SQL Server 中提供了这种恢复方式的存储过程。
一个数据库包括两个文件,mdf 数据库文件和 ldf 日志文件
1.sp_attach_db [@dbname =] 'dbname',[@filename1 =] 'filename_n'
给系统添加一个数据库,在 dbname 指定数据库名称,filename_n 指定数据库的文件和日志文件。比如我有一个 ji 的库,停止SQL Server 服务备份 ji_data.mdf,ji_log.ldf,启动SQL server,删除掉这个库,然后再把这两个文件拷到 sql server DATA 目录中,在 Query Analyzer 中执行如下语句:
EXEC sp_attach_db @dbname = N'ji',
@filename1 = N'd:\mssql7\data\ji_data.mdf',
@filename2 = N'd:\mssql7\data\ji_log.ldf'
就会把这个库加入到 SQL Server Group 中。
87,Q:Asp 中无 DSN 法连接 SQL Server 数据库的方法及其注意问题
A:无 DSN 法连接 SQL Server 数据库的方法示例如下:
'Less-DSN 法连接 SQLServer 服务器
set conn=server.createObject("adodb.connection")
conn.Open "driver={SQL Server};server=mysqlserver; database=jspcs; uid=sa; pwd=sql"
其中服务器名为 mysqlserver(ip=192.168.0.1),数据库为 jspcs,用户名为 sa,口令为 sql。由于使用了 TCP/IP 协议,所以 server=mysqlserver 语句段还可以写成指向安装 SQL Server 的机器的 IP 地址,即 server=192.168.0.1,注意该 IP 地址必须是网卡的默认(基本) IP 地址。同时,如果在 Client 端设置 SQL Server ODBC,也可以把服务器名输成 SQL Server 的 IP 地址。
88,Q:Delphi 中判断系统是否已经安装了声卡
A:要判断系统是否安装了声卡,调用 Winmm.dll 中的 waveOutGetNumDevs 和 midiOutGetNumDevs 函数就可以了。这两个函数在 Var 部分的说明如下:
function waveOutGetNumDevs: longint; stdcall; external 'winmm.dll' name 'waveOutGetNumDevs';
function midiOutGetNumDevs: longint; stdcall; external 'winmm.dll' name 'midiOutGetNumDevs';
//判断声卡是否存在
Function IsSoundcardInstalled : Boolean;
Var
WaveOutPutDeviceCount : Integer;
MidiOutPutDeviceCount : Integer;
Begin
Result := False;
WaveOutPutDeviceCount := waveOutGetNumDevs;
MidiOutPutDeviceCount := midiOutGetNumDevs;
if (WaveOutPutDeviceCount>0) and (MidiOutPutDeviceCount>0) Then
Result := True
Else
Result := False;
End;
procedure TForm1.Button1Click(Sender: TObject);
Begin
if IsSoundcardInstalled Then
ShowMessage('系统已经安装了声卡.')
Else
ShowMessage('系统没有安装声卡.');
end;
89,Q:用 ASP 打开 Web 服务器上的应用程序
A:
<%
dim wsh
set wsh = createobject("WScript.Shell")
response.write wsh.run("command.com")
set wsh = nothing
%>
90,Q:一个用进度条表示的时钟
A:在 Form 上拖 3 个进度条,命名为 h、m、s,分别表示时、分、秒,再放一个 Timer 控件,然后键入以下代码:
Private Sub Form_Load()
h.Orientation = ccOrientationVertical
h.Scrolling = ccScrollingSmooth
h.Max = 24: h.Min = 0
m.Orientation = ccOrientationVertical
m.Scrolling = ccScrollingSmooth
m.Max = 60: m.Min = 0
s.Orientation = ccOrientationVertical
s.Scrolling = ccScrollingSmooth
s.Max = 60: s.Min = 0
End Sub
Private Sub Timer1_Timer()
h.value = Format$(Now, "hh")
m.value = Minute(Now)
s.value = Format$(Now, "ss")
End Sub
91,Q:Delphi 中实现对日期数据的有效性检验
A:函数如下:
function isdate(s:string):boolean;
begin
result:=false;
try
strtodate(s);
result:=true;
except
on econverterror do
result:=false;
end;
end;
92,Q:PHP4 的 CGI 版本和 ISAPI 版本有什么区别?
A:1、CGI 方式是以 php.exe 来解释 .PHP 文件的,ISAPI 方式是以 php4ts.dll 来解释 .PHP 文件的;
2、ISAPI 会快一些;
3、ISAPI 据说可以支持 HTTP 认证等功能;
4、ISAPI 方式没有 CGI 方式稳定,也不大好配置;
5、ISAPI 方式只有 WIN32 下才有,而且在 ISAPI 方式下和 CGI 方式下的一些全局变量的值会不一样。
93,Q:VFP6.0 一条语句有多长?
A:VFP6 的参考中说,每条语句中字符数的最大值是 8192个,但命令编辑器每行最多只能键入 255 个字符,对于超过 255 个字符的命令行,可以用分号将语句分成多行,每行都不长过 250 个字符即可。注意如果是字符串常量跨行,则后续行应以编辑器本行的第一个位置为基准,否则字符串中间会无端地加许多空格。
94,Q:Delphi 中调用 Windows API 函数 ShellExecute 实现打开 IE 和 Outlook 应用程序?
A:在 uses 单元加入 Shellapi 引用,然后应用以下语句(函数):
打开 IE:ShellExecute(Handle,'open','[url=http://www/]http://www[/url]……',nil,nil,SW_SHOWNORMAL);
打开 IE:ShellExecute(Handle,'open','mailto:who@mail.addr?subject=…&body=…',nil,nil,SW_SHOWNORMAL);
如果以上函数的返回值小于或等于 32,则表明发生网络错误。
95,Q:用一条 SQL 语句找出“相同的客户代码中序号最大”的那些数据:
A: Select * from meney_in_list WHERE 序号 IN (select MAX(序号) from meney_in_list Group by 客户代码)
96,Q:在 Delphi5.0 中怎么找不到 Html 组件?
A: Html 组件在 Delphi4.0 中有,在 Delphi5.0 中已经升级为 TWebBrowser 组件,且功能有所加强,比如支持图片。
97,Q:在 Delphi 中实现控件焦点转移?
A:要在 Delphi 中实现按回车后控件焦点的转移,可以调用 Windows API 消息发送函数 PostMessage,做法如下:
把 Form1 的 KeyPreview 属性设为 True,在 Edit 和 Memo 的 onKeyPress 事件中加入以下代码:
if Key=#13 then
if not (ActiveControl is TMemo) then
PostMessage(Handle,WM_KERYDOWN,VK_TAB,0);
98,Q:在 Delphi 中判断本程序是否已经运行?
A:要判断实例是否运行,必须在程序的消息循环之前,在 Delphi 中,是在 Application.Initialize 之前。实现本功能, Delphi 使用的主要函数是 CreateMutex。这个函数用来生成一个 Mutex 对象的句柄,这个句柄具有操作系统的全局命名空间。
Delphi 例子程序的部分代码如下:
const MB_MINE = MB_OK or MB_ICONINFORMATION or MB_TASKMODAL;
var
hMutex: DWORD;
begin
hMutex := CreateMutex(nil, TRUE, 'MyMutex'); //TRUE 标明该进程拥有此 Mutex 对象
if (GetLastError = ERROR_ALREADY_EXISTS) then //Mutex 对象是否存在
begin
ReleaseMutex(hMutex);
Exit; //退出程序
end
else
if hMutex = ERROR_INVALID_HANDLE then //检查"mymutex"这个名字是否被其他诸如文件映射、信号灯和事件等对象占用
MessageBox(0, 'The name matched with a existing object!', 'Information',MB_MINE)
else
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
ReleaseMutex(hMutex); //释放 Mutex 对象
end;
99,Q:Delphi 与 VB、ASP 带变量参数 SQL 语句的比较
A:在 SQL 语句的 where 条件表达式中要带字符串变量 s 和数值变量 v,在 Delphi 中为:
strSQL:='select * from a_table where a_f1='+''''+s+''''+' and a_f2='+'v';
在 VB 和 Asp 中为:
strSQL="select * from a_table where a_f1='" & s & "' and a_f2=" & v
100,Q:Delphi 实现渐变窗口背景
A:创建一个应用程序,在 Form1 的 OnPaint 事件里面添加如下一段代码:
procedure TForm1.FormPaint(Sender: TObject);
var
i:word;
dy,y:real;
begin
dy:=clientheight/256;
y:=0;
for i:=255 downto 0 do
begin
canvas.brush.color:=$00000000+i*$10000;
canvas.fillrect(rect(0,round(y),clientwidth,round(y+dy)));
y:=y+dy;
end;
end;
101,Q:用 Visual Basic 保存 BMP 文件:
A: 在用VB编制绘图程序时,有时需要将窗体或图片框上的绘图结果形成一个定制的图形文件保存起来,以便以后浏览或修改。这一功能可以用 VB 本身带有的 SavePicture 语句来完成。
SavePicture语句将窗体、图象控件或图片框中的图形图象保存到磁盘上的一个文件中,这些图象可以是使用画图方法(Line,Circle,Pset)产生出来的,也可以存储那些通过设置窗体或图片框的图片属性或者通过PaintPicture 方法或 Load Picture 函数载入的图象。这些载入的图象可以是 BMP、ICO 或 WMF 图形文件。
SavePicture 语句的语法格式如下:
SavePicture picture,stringexpression
参数 picture 为窗体或图片框的 picture 或 image 属性;参数 strngexpression 为保存的文件名。
下面举一个具体的程序来说明定制图象文件的过程:
1、创建一个新的项目文件,在 Forml 中加入一个图象控件 Picture1,将Picture1 的 AutoRedraw 属性设置为 True;
2、在Form_Load() 事件中,加入如下代码:
Private Sub Form-Load()
Dim CX As Integer
Dim CY As Integer
Dim Limit As Integer
Dim Radius As Integer
CX=1000
CY=1000
For Radius=0 To Limit
Picturel.Circle(CX,CY),Radius,RGB(Rnd*255,Rnd*255,Rnd*255)
Next Radius
SavePicture Picturel.Image,"c:\custom.bmp"
End Sub
执行此程序就会把图片框 Picture1 上的图象保存在 C: 盘根目录下 custom.bmp 图象文件中。
最后有两点需要指出:
1、在使用 SavePicture 语句之前,必须先将窗体或图片框的 AutoRedraw 属性设为 True,否则保留的将是一张空图;
2、使用 Image 属性保存的用画图命令(如 Line,Cirele,Pset 或 Print)画出来的图形总是以 BMP 文件格式保存。但在程序设计时如果使用窗体或图片框的 Picture 属性载入或在程序运行时通过 LoadPicture 函数载入的图象,使用 SavePicture 语句存储时,存储的文件格式同其载入前的文件格式一样(如 ICO 格式等)。
102,Q:在 Visual Basic 中如何拖动窗体或控件?
A:现在的许多 windows 下的应用程序,都采用了图形化的界面,但是在这样的界面下就不能使用 Windows 原来的标题条了,否则会影响界面的美观。那么在没有标题条的情况下如何用鼠标拖动窗体或者其它的控件呢?
其实,采用 API 函数调用很容易实现,下面我们以拖动窗体 Form1 为例来具体讲一下实现方法:
1、新建立一个项目,名称为 test.vbp;
2、填加一个模块,名称为 test.bas,并且在声明部分加入以下代码:
Declare Function ReleaseCapture Lib "user32" () As Long
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const WM_SYSCOMMAND = &H112
Public Const SC_MOVE = &HF012
其中 ReleaseCapture 函数是用来释放鼠标捕获的,SendMessage 函数是一个在 Windows API 中非常重要的函数,在这里的作用是用来向 Windows 发送移动窗体的消息。WM_SYSCOMMAND 是向 Windows 发送消息的常量。SC_MOVE 是控制移动窗体的常量。请注意:这里 SC_MOVE 的赋值是 &HF012,表示鼠标对象。
3、在窗体的 MouseDown 过程中加入以下代码:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture
SendMessage Me.hwnd, WM_SYSCOMMAND, SC_MOVE, 0
End Sub
其中 ReleaseCapture 函数用来释放鼠标捕获,SendMessage 函数向 Windows 发送移动窗体的消息。
4、保存并运行程序,按下鼠标,你会发现窗体会随着鼠标的移动而移动。
以上讲述了如何在 VB 中用鼠标拖动窗体,其实,控件的拖动的原理是一样的。例如以下代码可以实现图片框的拖动:
ReleaseCapture
SendMessage Picture1.hwnd, WM_SYSCOMMAND, SC_MOVE, 0
(注:以上程序在 Windows98、VB5.0/6.0 下调试通过。在 NT4.0、VB6.0 下不能运行。)
103,Q:用 Delphi5.0 编程实现 Windows 桌面的隐藏和显示
A:实现原理是调用 Windows 的 API 函数。程序代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var hDesktop:Thandle;
begin
hDesktop:=FindWindow('Progman',nil);
ShowWindow(hDesktop,SW_HIDE); //隐藏桌面
end;
procedure TForm1.Button2Click(Sender: TObject);
var hDesktop:Thandle;
begin
hDesktop:=FindWindow('Progman',nil);
ShowWindow(hDesktop,SW_SHOW); //显示桌面
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
close;
end
104,Q:应用 Microsoft TTS 语音引擎的 Delphi 语言实例
A:建立一个单窗体工程,添加一个 Edit 和 2 个 Button 控件,分别命名为 Edit1、btnSpeak、btnStop。然后安装引用 TTS 的 vtxtauto.tlb 类库文件,方法是点击菜单“工程-Import Type Library”,点“add”按钮,然后选中 Windows\speech 下的 Vtxtauto.tlb 文件,放入安装包后,再将其添加成 Delphi 的一个 Unit,自动产生的名字为“VTxtAuto_TLB”。然后,在主 Unit 的 Uses 里引用 VTxtAuto_TLB,即在 Uses 后添加字串“VTxtAuto_TLB”。最后参考以下代码:
……
procedure TfrmSpeech.FormCreate(Sender: TObject);
begin
vtxt:=CoVTxtAuto_.Create;
vtxt.Register('','Speech');
Edit1.Text:='I am a chinese, I love my homeland very much, and you?'
end;
procedure TfrmSpeech.btnSpeakClick(Sender: TObject);
begin
vtxt.Speed:=100;
vtxt.Speak(trim(Edit1.Text),10);
end;
procedure TfrmSpeech.btnStopClick(Sender: TObject);
begin
vtxt.StopSpeaking;
end;
页:
[1]