⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9918.txt

📁 关于编程技术技巧的文章
💻 TXT
📖 第 1 页 / 共 4 页
字号:
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 + -