📄 9918.txt
字号:
cbURL- >Items- >Add(htBrowser- >URL);
//检查TComboBox
保持的URL是否
cbURL- >Text=htBrowser- >URL; //包含要浏览的
地址 < file://包含要浏览的地址 > ,如没有则
cbURL- >SelectALL( ); //将其加入到
TComboBox和
tcURL- >Tabs- >Add(htBrowser->URL);
//TTabControl中
tcURL- >TabIndex=tcURL- >Tabs- >Count-1;
bbGo- >Click( );
}
---- 为THTML的OnEndRetrieve实践编写代码;
Cursor=(TCursor)crDefault;
---- 3.为go按钮的OnClick事件编写代码:
htBrowser- >equestDoc(cbURL- >est)
//打开任何在 < file://打开
任何在 > TComboBox中指定的URL
//(cbUCL)
---- 4.为按钮home的OnClick编写事件
htBrowser- >equestDoc- >(HomePage)
// HomePage 为常数,须在程序首定义,如
// String HomePage="http://www.sohoo.com"
]
---- 现在你就编好了你自己的浏览器.快!试一试吧!
***********************************************************
怎样在C++Builder中创建使用DLL
(上海 施江杰)
自从C++Builder从去年浪漫情人节上市以来,吸引了大量的Delphi、VC、
Vb的程序员到它的怀抱,大量的C、C++程序员感叹道:总算有了C的可视化开发
工具,对我也是一样,从BC、Delphi到C++Builder。
动态链接库(DLL)是Windows编程常遇到的编程方法,下面我就介绍一下在
BCB (C++Builder下简称BCB) 中如何创建使用DLL和一些技巧。
一、创建:
使用BCB File|NEW建立一个新的DLL工程,并保存好文件BCB,生成一个DLL
的程序框架。
1.DllEntryPoint函数为一个入口方法,如果使用者在DLL被系统初始化或
者注销时被调用,用来写入对DLL的初始化程序和卸载程序;参数:hinst用来
指示DLL的基地址;reason用来指示DLL的调用方式,用于区别多线程单线程对
DLL的调用、创建、卸载DLL;
2.在程序中加入自己所要创建的DLL过程、函数;
3.用dllimport描述出口;
例程序如下:
#include
#pragma hdrstop
extern “C” __declspec(dllexport) int test();
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
return 1;
}
int test()
{
return 3;
}
注意:动态链接库中调用过程、函数时有不同的CALL方式 __cdecl、
__pascal, __fastcall、__stdcall,BCB中默认的方式为__cdecl(可不写),
如果考虑兼容性可用时__stdcall声明方法为:
extern “C” __declspec(dllexport) int __stdcall test();
对于其中过程、函数也改为:
int __stdcall test()
二、使用DLL
在BCB中使用DLL有两种方法:
1.用静态调用法
首先需要在BCB的项目中加入输入接口库(import library),打开工程
项目,使用BCB View|Project Manager打开项目列表,向项目中加入接口
库(*.lib)。
其次在头文件中加入接口声明。
例程序如下:
//define in include file
extern “C” __declspec(dllimport) int __cdecl test();
//use function in main program
int I;
I=test();
注意:
(1)动态链接库调用过程、函数时CALL方式 与创建时方式一样不写为
__cdecl,其它需要声明。
(2)BCB创建的DLL有对应的输入接口库(import library),如只有DLL
而无库时,可用BCB的implib工具产生:implib xxx.lib xxx.dll;另外可
用:tlib xxx.lib,xxx.lst 产生DLL的内部函数列表,许多Windows的未公
开技术就是用这种方法发现的。
2.动态调用法
动态调用法要用Windows API 中的LoadLibrary()和GetProcAddress()
来调入DLL库,指出库中函数位置,这种方法较常见。
例程序如下:
HINSTANCE dd;
int _stdcall (*ddd)(void);
dd=LoadLibrary(“xxx.dll”);
ddd=GetProcAddress(dd,“test”);
Caption=IntToStr(ddd());
FreeLibrary(dd);
三、注意:
创建DLL时编译链接时注意设置Project Options。
Packages标签:去除Builder with runtime packages检查框。
Linker标签:去除Use dynamic RTL检查框。
否则创建的DLL需要Runtime packages or Runtime library。
***********************************************************
用DELPHI编写TAPI应用程序
(南京 方舟)
TAPI(Telphony Application Programming Interface)可以称作电话编程
接口,它是微软提供的计算机和电话网相联系的编程接口,使程序员可以利用这
个接口通过电话线使用多种计算机复杂的通讯工作。TAPI能提供的功能主要有:
自动拨号;以文件、传真、电子邮件的方式传送文件;访问Internet或其他形式
信息服务、组织会议呼叫、使用主叫识别处理入呼叫、计算机间通过电话线的互
相协作。这里提到的有的功能很早就已经广泛应用了,还有一些由于我国交换设
备不提供此类功能很少问津。这里笔者不想对TAPI能实现什么功能多加讨论,只
就编程谈一点体会。
促使笔者利用TAPI编写程序主要是由于工作中经常需要发传真,而每个传真
都需要确认,如果电话是功能最少的那种,每次都要花大量的时间在上面。如果
确认时再没人应答,之后再来一次,效率就更低了。因此,笔者想到利用TAPI编
写一个程序能用MODEM自动拨号,通话结束后记录一下内容,省了每次辛苦地看
着号码拨号。下面将程序与读者共享。
笔者利用delphi作为开发工具,原因主要是delphi开发程序方便快捷,同时
数据库的使用比较简单。使用过Visual C++的朋友都知道它的帮助是十分详细
的,笔者开发的许多程序都参考了其中的WIN32 SDK帮助,尤其是在编写TAPI程
序时,仔细地研究了其中的TAPI部分。使用VC编写TAPI程序可以利用现成的
“tapi.h”头文件,但使用delphi就需要将C++版本的头文件翻译成Object
Pascal的格式,再将“tapi32.dll”中的函数引用到头文件中来。幸好这项工作
不用我们去做,从Inprise公司的站点可以获得delphi 关于TAPI编程的头文件,
省了不少事,笔者的头文件tapi.pas是Davide Moretti编写的,如果需要的朋友
可以通过报社和笔者联系。
首先介绍程序中用到的几个函数:lineInitialize、lineNegotiateAPIVersion、
lineOpen、lineMakeCall、lineHandOff、lineShutDown、lineConfigDialog、
lineCallBackProc、lineGetIcon。函数的使用过程依次是:lineInitialize初
始化线路、lineNegotiateAPIVersion确定TAPI版本号、lineOpen 打开线路、
lineConfigDialog显示线路设备属性、lineMakeCall自动拨出电话号码、
lineGetIcon获得线路设备图标的句柄、lineHandOff将MODEM控制线路权转到用
户、lineShutDown关闭线路。这里所用的函数名和tapi32.dll中输出的函数名
相同。
由于delphi和VC中类型定义的区别,笔者有必要举例说明函数定义在VC和
delphi中的区别。以lineInitialize为例,在VC中定义为
LONG lineInitialize(LPHLINEAPP lphLineApp,HINSTANCE hInstance,
LINECALLBACK lpfnCallback,LPCSTR lpszAppName,LPDWORD lpdwNumDevs)。
lphLineApp是线路TAPI应用的句柄指针,hInstance是实例指针,lpfnCallback
指向呼叫返回处理函数,lpszAppName指向用户提供的应用程序名字符串,
lpdwNumDevs指向可供使用的线路设备个数。在delphi文件tapi.pas中对此函数
的定义如下:
function lineInitialize(var lphLineApp: THLineApp;hInstance: HInst;
lpfnCallback: TLineCallback;
lpszAppName: PChar;var lpdwNumDevs: Longint): Longint;
其中我们定义THLineApp、TLineCallback为指向Longint的指针(^LongInt)。
其他函数的定义类推,分别用delphi中的相应类型代替,如果是长指针如句柄指
针可以用“^LongInt”来定义。
下面介绍程序的代码部分,在此笔者假定读者具备delphi数据库和一般编程
基础。首先用Database Desktop建立两个Paradox7表,分别为“workphone.db”
和“friendphone.db”。在主form上放置TTable、TDataSource、TDBGrid、
TPopupMenu控件。程序定义sAppDir:string保存应用程序所在目录,设置
sAppDir:=GetCurrentDir。在弹出式菜单中定义两个过程分别在TDBGrid中载入
两个数据库表。
procedure TMainForm.friendphoneClick(Sender: TObject);
begin
MainForm.Table1.Active:=False;
MainForm.Table1.TableName:=sAppDir+‘friendphone.db’;
MainForm.Caption:=‘自动拨号——朋友电话’;
MainForm.Table1.Active:=True;
end;
procedure TMainForm.selectclassmateClick(Sender: TObject);
begin
MainForm.Table1.Active:=False;
MainForm.Table1.TableName:=sAppDir+‘workphone.db’;
MainForm.Caption:=‘自动拨号——工作电话’;
MainForm.Table1.Active:=True;
end;
将TDBGrid的Options属性中的dgEditing设为True,允许用户直接修改表中
的内容。在弹出菜单中定义DialPhone和DeleteRecord分别用于拨打电话号码和
删除当前记录。下面主要介绍拨打电话的TAPI应用部分。电话号码是通过 MainForm.Table1.Fields.Fields[0].AsString作为字符串来传递的。
实现的代码部分如下,其中为了文章不会太长笔者省去了不必要的错误提示
和部分代码。
变量定义
lineApp:THLineApp;//TAPI应用句柄
line:THLine;//线路句柄
call:THCall;//呼叫句柄
CallParams:TLineCallParams;//呼叫参数
nDevs,tapiVersion,errorcode:Longint;//线路设备数、TAPI版本号、错误代码
extid:TLineExtensionID;//TAPI扩展版本号
lineIcon:HICON;//线路设备图标
过程定义
procedure lineCallback(hDevice, dwMsg, dwCallbackInstance,
dwParam1, dwParam2, dwParam3: LongInt);//异步呼叫返回处理函数
{$IFDEF WIN32}
stdcall;
{$ELSE}
export;
{$ENDIF}
var
hCall: THCall;
begin
if dwMsg = LINE_REPLY then { LineMakeCall的响应结果}
if dwParam2 < 0 then {呼叫响应错误处理};
else if dwMsg = LINE_CALLSTATE then { 呼叫状态信息 }
begin
hCall := THCall(hDevice); //类型转换 THCall为LongInt类型
case dwParam1 of
LINECALLSTATE_IDLE: {呼叫无效处理}
if hcall <> 0 then
begin
lineDeallocateCall(hCall);
end;
LINECALLSTATE_PROCEEDING:{呼叫正常处理}
LINECALLSTATE_DIALTONE:{检测到拨号音}
LINECALLSTATE_DIALING: {正在拨号}
LINECALLSTATE_DISCONNECTED:{连接已断开}
begin{断开原因}
if dwParam2=LINEDISCONNECTMODE_NORMAL then{正常断开}
else if dwParam2=LINEDISCONNECTMODE_BUSY then {线路忙}
LINECALLSTATE_BUSY:{线路忙处理}
end;
end;
procedure TDialForm.(dialnumber:string);//dialnumber为电话号码字符串
begin
with CallParams do {CallParams的类型参考VC中的定义,将DWORD改为LongInt}
begin
dwTotalSize := sizeof(CallParams);
dwBearerMode := LINEBEARERMODE_VOICE;//承载模式为语音
dwMediaMode:=LINEMEDIAMODE_INTERACTIV
EVOICE;//媒体模式为交互式语音
end;
if lineInitialize(lineApp,HInstance,lineCallBack,nil,nDevs)<0
then //线路不能初始化处理
else
if nDevs=0 then //无TAPI线路设备
begin
lineShutDown(lineApp);
lineApp:=0;
end
else
if lineNegotiateAPIVersion(lineApp,0,$00010004,$00020000,
tapiVersion,extid)<0 //协商TAPI版本号 TAPI1.4~TAPI2.0
then begin {TAPI版本不兼容}
lineShutDown(lineApp);
lineApp:=0;
end
else
errorcode:=lineOpen(lineApp,LINEMAPPER,line,tapiVersion,0,0,
LINECALLPRIVILEGE_NONE,LINEMEDIAMODE_
INTERACTIVEVOICE,@CallParams);//打开线路
if errorcode<0 then {线路不能打开}
else
begin{线路打开成功}
lineConfigDialog(0,Self.Handle,nil); //显示线路设备属性
lineGetIcon(0,`tapi/line',lineIcon);
//lineIcon为线路设备图标句柄,可以赋值给TICON.Handle
if lineMakeCall(line,call,PChar(dialnumber),0,@CallParams)<0 then{呼叫失败处理}
else
lineHandOff(call,`电话拨号程序',LINEMEDIAMODE_INTERACTIVEVOICE);
//在程序中应当以按钮来触发lineHandOff,从TAPI控制转为人工控制电话
end;
end;
以上代码由于脱离了实际的程序显得有些凌乱,相信对delphi编程稍有了解
的朋友很容易看懂。本程序运行后的效果是,首先出现一个数据库表格,用右键
打开一个通讯录库文件,右键选择拨号弹出对话框显示线路处理的状态,在拨完
号之后提示用户是否拿起听筒进行对话。整个过程类似系统自带的电话拨号程序,
不过笔者介绍的TAPI方法可以让我们编写更多的功能和更友好的界面。今后笔者
将针对TAPI编程进行深入的介绍,希望能对不太了解TAPI的朋友在开发程序时起
到帮助。
***********************************************************
利用Delphi编程发送E-mail
(上海 钱可栋)
接发E-mail是许多“网虫”必修的功课,E-mail工具软件也很多,国外
的有Microsoft的Outlook Express、The Bat等,国内则有FoxMail这样的精品。
其实,利用可视化编程工具Delphi4.0也能够制作出自己的E-mail软件。
Delphi4.0有关E-mail的组件有两个:NmPOP3和NmSTMP,它们都位于Internet
选项卡上,其中,NmPOP3组件封装并实现POP3协议,用来从Internet POP3服务
器上读取电子邮件;NmSTMP封装并实现STMP协议,可用来向Internet的STMP服
务器发送电子邮件。限于篇幅,我们不能两者都介绍,这里只用NmSTMP编写一
个发送E-mail的程序,至于NmPOP3,以后有机会再谈,或者在看完本文后你有
兴趣,也可以借助于Delphi的帮助文档尝试用NmPOP3编程。
我们先来看一下程序运行界面。图1是程序主窗体,上面有一个字符串网格
(StringGrid)和三个按钮,它们的容器是仅有一个标签的PageControl。单击
“Clear”钮清除网格内容,单击“Send”钮发送E-mail,单击“New Mail”
钮弹出图2所示的对话框,此对话框用来设置STMP服务器名称、发件人地址、收
件人地址、发件人名称和邮件主题,其中前三项必须填写,“Select File”按
钮用来打开Open对话框,以便选取要发送的附件。
NmSTMP的属性和方法不多,关键的属性是Host(STMP服务器名称)和PostMessage
(包含邮件信息),正确设置了Host属性和PostMessage属性后,就可以用Connect
方法(连接服务器)和SendMail方法发送E-mail了。
编写代码之前先要改变StringGrid1的一些缺省属性:ColCount属性为6,
FixedCols属性为0,RowCount属性为2,另外,将PageControl1的Align属性置
为alClient。
以下是Unit1(主窗体)代码清单:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, Grids, ComCtrls, StdCtrls, Psock, NMsmtp;
type
TForm1 = class(TForm)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -