已经比较熟悉DELPHI,但还不会分布式,JAVA也已入门,如何用JAVA和DELPHI一起做多层呢?请给范例,网站具体链接也行

blueshrimp 2002-11-03 02:42:26
已经比较熟悉DELPHI,但还不会分布式,JAVA也已入门,如何用JAVA和DELPHI一起做多层呢?请给范例,网站具体链接也行


用了DELPHI有一段时间了,从四年前从D2、D3开始学,但真正是从去年才开始用D6直到现在,仅对DELPHI和JAVA较有兴趣,会用JAVA写简单的BEAN,也会用DELPHI改写控件,但没有深入到DELPHI的分布式开发

想知道如何用JAVA写服务器端运行的程序,用DELPHI在客户端检验数据和显示数据,希望各位能提供方法以参考,最好是XML格式的数据交换

可能概念有点乱,这也正是我当前最急的

帮我UP也有分

提供有效帮助,另外再送分,要多少给多少,倾家荡产都行,来这个世界时,我本赤裸,只求有个归宿

本人很少提问,但经常帮别人UP,赚得的积分根本用不完

希望这次大伙能帮我

...全文
91 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
blueshrimp 2002-11-03
  • 打赏
  • 举报
回复
TO  del_c_sharp(摩托还需骆拉)

很抱歉,只能给您100分

完整的配图文章在这里

http://www-900.ibm.com/developerWorks/cn/webservices/ws-ejbacess/index.shtml

我下午找到的

收藏了,还没看。吃饭过来一看,您也找到了,不过您未贴图,所以只给您100分,希望不要介意
studysuneck 2002-11-03
  • 打赏
  • 举报
回复
up
up
studysuneck 2002-11-03
  • 打赏
  • 举报
回复
up
UP
xiamang 2002-11-03
  • 打赏
  • 举报
回复
为什么要用JAVA 和 DELPHI ...
up一下。
signboy 2002-11-03
  • 打赏
  • 举报
回复
说说应用,到底要敢吗,然后给你个方案
ketao_78 2002-11-03
  • 打赏
  • 举报
回复
对,同意楼上的
zhang21cnboy 2002-11-03
  • 打赏
  • 举报
回复
跨语言的,跨工具的开发,本来就是一个比较麻烦的问题,而你现在需要还是在两种没有一点关系的工具之间的协调开发,不是说不能开发,而是这样的话,可能你就浪费工具本上给你提供的功能了!使用CORBA完全可以开发达到你说的这个的要求,至于说RMI我认为不可能,SOCKET的话,那就麻烦的简直可以去自杀,WEB SERVICE的话,建议你还是不要采用,D版的不好用,Z搬的很难买起,再说了,人家WEB SERVICE并不是为了支持跨语言开发的!

如果你采用XML的话,倒是个不错的主义!如果是我,我绝对不会选择delphi 跟java配合!
wes109 2002-11-03
  • 打赏
  • 举报
回复
强烈建议使用SOAP
tomxutomxu 2002-11-03
  • 打赏
  • 举报
回复
COROB
RMI
Web Service
Socket(自己开发协议,或者定义XML)
del_c_sharp 2002-11-03
  • 打赏
  • 举报
回复

图十四


关闭弹出窗口,输入EJB JNDI name 为HelloWorldHome,如图十五所示。


图十五


选择Next进入下一个向导窗口,向导将要求输入Web service URI的名称和多个描述文件的文件名,如图十六、十七所示。Web service URI是符合uniform resource Naming convention标准(http://www.ietf.org/rfc/rfc2141.txt)web service的标识符,应用程序访问Web service的时候需要指定这个参数。

ISD文件是Apache SOAP内部使用的web service的发布描述文件。/wsdl/HelloWorld-service.wsdl文件描述了相关的web service port信息,应用程序可以通过该文件获得服务器上各种web service的信息。
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="HelloWorldService"
targetNamespace="http://localhost:8080/HelloWorldWeb/wsdl/HelloWorld-service.wsdl"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://localhost:8080/HelloWorldWeb/wsdl/HelloWorld-service.wsdl"
xmlns:binding="http://www.helloworld.com/definitions/HelloWorldRemoteInterface"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<import namespace="http://www.helloworld.com/definitions/HelloWorldRemoteInterface"
location="http://localhost:8080/HelloWorldWeb/wsdl/HelloWorld-binding.wsdl"/>
<service name="HelloWorldService">
<port name="HelloWorldPort" binding="binding:HelloWorldBinding">
<soap:address location="http://localhost:8080/HelloWorldWeb/servlet/rpcrouter"/>
</port>
</service>
</definitions>
/wsdl/HelloWorld-bind.wsdl则具体定义了具体一个portType的操作和消息的消息格式和协议。
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="HelloWorldRemoteInterface"
targetNamespace="http://www.helloworld.com/definitions/HelloWorldRemoteInterface"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://www.helloworld.com/definitions/HelloWorldRemoteInterface"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<message name="sayHelloRequest">
<part name="theName" type="xsd:string"/>
</message>
<message name="sayHelloResponse">
<part name="result" type="xsd:string"/>
</message>
<portType name="HelloWorldJavaPortType">
<operation name="sayHello">
<input name="sayHelloRequest" message="tns:sayHelloRequest"/>
<output name="sayHelloResponse" message="tns:sayHelloResponse"/>
</operation>
</portType>
<binding name="HelloWorldBinding" type="tns:HelloWorldJavaPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="sayHello">
<soap:operation soapAction="" style="rpc"/>
<input name="sayHelloRequest">
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://tempuri.org/ejbs.HelloWorld"/>
</input>
<output name="sayHelloResponse">
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://tempuri.org/ejbs.HelloWorld"/>
</output>
</operation>
</binding>
</definitions>





图十六



图十七


3)WSAD可以生成访问刚才发布的Web service的Java类,如图十八、十九所示。该类的方法 public synchronized java.lang.String sayHello(java.lang.String theName) throws Exception包装了发布为Web service的EJB HelloWorld的方法sayHello(java.lang.String theName)。在发布EJB为Web service的向导中可以生成这个Java类(web service binding proxy),同时还可以生成使用这个类访问web service的jsp页面。


图十八



图十九


最后,你可以选择将Web Service发布为到UDDI服务器(比如免费的IBM的UDDI4J)上。

第三步,在Delphi中调用Web Service

使用Delphi Web Services importer将定义Web Service的WSDL文件(可以是从Web服务器上下载下来的本地wsdl文件,也可以是一个指向该文件的HTTP URL,比如http://localhost:8080/HelloWorldWeb/wsdl/HelloWorld-service.wsdl)导入,这将自动生成定义和注册interfaces and types的pascal代码。

选择菜单File > New > Other… > 出现New Iterms窗口,选择WebServices,选择Web Services importer。如图二十、二十一所示:


图二十



图二十一


生成的代码如下:
Unit Unit_2;
interface
uses Types, XSBuiltIns;
type

HelloWorldJavaPortType = interface(IInvokable)
['{521A5B71-4CB9-4FAA-82AD-0F9CCF423FB9}']
//为方便使用,我们把Delphi声明的过程 sayHello改为方法
//procedure sayHello(const theName: WideString; out result: WideString); stdcall;
function sayHello(const theName: WideString): WideString; stdcall;
end;
implementation
uses InvokeRegistry;
initialization
InvRegistry.RegisterInterface(TypeInfo(HelloWorldJavaPortType), '', 'UTF-8');
end.




现在,我们可以利用THTTPRio对象来调用Web Service。THTTPRio是Delphi提供的支持SOAP over HTTP的有源代码的SOAP支持类库。部分代码如下:

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, SoapHTTPClient, Unit2, StdCtrls;

procedure TForm_main.Button_callClick(Sender: TObject);
var
//使用Delphi的Unit SoapHTTPClient,Delphi
X :THTTPRio;
//使用Unit_2中定义的HelloWorld Interface
InterfaceVariable: HelloWorld;
para1, para2: WideString;
begin
X := THTTPRio.Create(nil);
//设置Delphi在提出HTTP请求的时候设置Content-Type为text/xml; charset= UTF-8
X.HTTPWebNode.UseUTF8InHeader := true ;

//WSDLLocation也可以是在本地文件系统中的wsdl文件。
X.WSDLLocation := 'http://localhost:8080/HelloWorldWeb/wsdl/HelloWorld-service.wsdl';

// THTTPRio 的Service参数和Port参数对应HelloWorld-service.wsdl文件中的定义。
// <service name="HelloWorldService">
// <port name="HelloWorldPort" binding="binding:HelloWorldBinding">
// <soap:address location="http://localhost:8080/HelloWorldWeb/servlet/rpcrouter"/>
// </port>
//</service>
X.Service := 'HelloWorldService';
X.Port := 'HelloWorldPort';

InterfaceVariable := X as HelloWorld;
para1 := '中文';
//从输入文本框中获得输入参数
para1 := Edit_para1.Text;
para2 := InterfaceVariable.sayHello(para1);
//显示调用web service返回的结果
Label_return_value.Caption := 'Return Value: ' + para2;
X.free;
end;


del_c_sharp 2002-11-03
  • 打赏
  • 举报
回复
摩托 ^_^(连接找不到了)没有图

EJB是使用Java语言编写分布式的、面向对象的、商业应用的标准组件架构(参见EJB 1.1规范)。一些企业正在将他们以前的基于COM+组件的应用移植到EJB组件技术,或者采用EJB构建新的应用,同时为保护以前的IT投入还要保留以前的采用Delphi或者Visual Basic等编程语言编写的客户端应用。这就提出了Delphi/Visual Basic访问EJB的需求。

本篇文章将首先介绍Delphi/Visual Basic访问EJB的两种方法,然后介绍Delphi/Visual Basic如何通过Web Service访问EJB:

将EJB封装为Web Service并发布到应用服务器上
Delphi访问Web Service
Visual Basic访问Web Service

最后文章中讨论了在Delphi和Visual Basic中调用Web service时遇到的中文问题。

Delphi/Visual Basic访问EJB的两种方法


Delphi通过CORBA ORB访问EJB
Delphi企业版中含有CORBA Visibroker server,可以在Borland App Server服务器端将EJB封装为CORBA服务,然后在客户端用SIDL (Simple IDL)的来描述封装EJB的CORBA服务,最后用Delphi工具idl2pas将描述文件翻译成pascal程序。这个方案在部署的时候需要在客户端安装Visibroker server。
Visual Basic通过ActiveX to EJB Bridge访问EJB
IBM WebSphere Application Server Enterprise Edition 4.x中的Enterprise Service当中包含ActiveX to EJB bridge,它为VB、VBScript以及ASP提供了一个ActiveX组件来方便地访问EJB。

客户端程序首先初始化一个ActiveX控件,该控件初始化一个Java虚拟机,ActiveX控件和Java虚拟机通过JNI(Java Native Interface)的方式交互。Java虚拟机通过Java ORB和运行在应用服务器上的EJB进行交互。Active Bridge支持使用J2EE Client Container或者直接通过JNDI的方式访问EJB。



图一:ActiveX to EJB Bridge系统结构


通过Web Service让Delphi/Visual Basic访问EJB
采用Web Service的方式封装EJB,我们理论上可以让支持Web Service的任何编程语言来访问该EJB,比如Java, Visual Basic, Visual C++,Delphi,perl,PHP等。

将EJB封装为web service的工具有很多种,这里我们以开放源码的Apache SOAP为例来说明这个开发流程,开发工具采用WSAD(IBM WebSphere Studio Application Developer)。这是一个以Java语言编写的,可以运行在Windows和Linux平台上的J2EE开发工具,支持servlet、jsp、ejb、web service和xml的开发和调试,可以在http://www-3.ibm.com/software/ad/studioappdev/免费下载试用版。我们将以一个程序员都非常熟悉的例子-HelloWorld来展示开发流程。下面,是我们动手开始做的时间了!

第一步,编写一个EJB,名字叫做HelloWorld。

1)建立一个EJB项目(EJB project):在J2EE perspective选择菜单File > New > EJB Project,输入Project Name为HelloWorldEJB,Enterprise Application project name为HelloWorldEAR,选择Finish建立该EJB项目,如图二所示:


图二:建立EJB项目


2)建立EJB:在J2EE perspective中的J2EE View中选择EJB Modules > HelloWorldEJB,然后选择菜单File > New > Enterprise Bean,输入Bean Name为HelloWorld,Bean class为ejbs.HelloWorld(这里使用package名为ejbs)。选择Finish建立该EJB。如图三所示:


图三 建立EJB


3)给HelloWorldBean添加一个方法:在J2EE perspective中的J2EE View中选择EJB Modules > HelloWorldEJB > HelloWorld > HelloWorldBean,鼠标双击打开并编辑该EJB。在该EJB后面加入方法sayHelloWorld
/** sayHello
* @return "Hello someone"
* @param theName the name of someone
*/
public String sayHello(String theName) {
return "Hello " + theName;
}





图四 给HelloWorldBean增加一个方法sayHello


4)将新添加的方法sayHello加入到EJB remote interface中:鼠标选中WSAD左下角处Java的Outline窗口中的方法sayHelloWorld,选择鼠标右键菜单Enterprise Bean > Promote to Remote Interface。WSAD将在HelloWorld EJB的remote Interface HelloWorld中加入一行: public String sayHello(String theName) throws java.rmi.RemoteException;




远程接口HelloWorld.java的完整的代码:
package ejbs;
/**
* Remote interface for Enterprise Bean: HelloWorld
*/
public interface HelloWorld extends javax.ejb.EJBObject {
/** sayHello
* @return "Hello someone"
* @param theName the name of someone
*/
public String sayHello(String theName) throws java.rmi.RemoteException;
}





图五 将新添加的方法sayHello加入到EJB remote interface中


5)让WSAD生成EJB的部署代码(Deploy code)。如图六操作即可。


图六 生成EJB的部署代码


6)现在我们可以部署并测试HelloWorld EJB了! 如图七所示,运行HelloWorld EJB。


图七 选择在服务器上运行EJB


我们将看到WSAD将这个EJB项目发布到一个WebSphere v4.0 Test Environment中,启动该WebSphere测试环境。在控制台中可以看到
02.04.14 11:56:59:171 CST] 55e67dfe EJBEngine I WSVR0037I:正在启动 EJB jar:HelloWorldEJB
[02.04.14 11:56:59:661 CST] 55e67dfe EJBEngine I WSVR0038I:未找到 HelloWorld 的 JNDI 名,绑定起始对象名为 HelloWorldHome

[02.04.14 11:57:05:830 CST] 55e67dfe Server A WSVR0023I:服务器 Default Server 为电子商务开放




最后WSAD将打开一个EJB Test Client窗口。选择EJB References > HelloWorld > HelloWorldHome > HelloWorld create()方法,EJB Test Client获得一个HelloWorld EJB Home Stub。如图八所示:


图八 使用EJB Test Client测试EJB(1)


7)调用HelloWorld EJB Home Stub对象的方法sayHello测试EJB。


图九 使用EJB Test Client测试EJB(2)


第二步,使用WSAD中的 Web Service生成向导生成包装该EJB的Web Service、测试该Web Service的java proxy(一个Java Bean)和JSP测试程序,最后运行生成的程序来测试这个Web Service。

1)建立一个名叫HelloWorldWeb的Web Project:选择菜单File > New > Web Project,输入project name为HelloWorldWeb,选择Enterprise Application project name为HelloWorldEAR,如图十所示。选择next命令按钮,选中available dependent JARs HelloWorldEJB.jar,如图十一所示。


图十
图十一



选择HelloWorldWeb > source,选择菜单File > New > Web Service,如图十二所示:


图十二


在"Web Service"窗口中选择部署该Web Service的Web project为HelloWorldWeb,如图十三所示:


图十三


选择Next进入下一个向导窗口,选择Web service type为EJB Web service。

选择Next进入下一个向导窗口,选择命令按钮"Browse EJB Bean…",在弹出窗口中选择EAR Project为HelloWorldEAR,EJB bean为HelloWorld(如图十四所示)

liujuntao 2002-11-03
  • 打赏
  • 举报
回复
SORRY!
我在java看到你的提问,谁知道,是关于delphi和java的结合使用问题!
我不会delphi,不好意思!
blueshrimp 2002-11-03
  • 打赏
  • 举报
回复
To monkely()

一起学习

to Iforgot(清风雨)
 很抱歉,一点也看不懂

to 摩托
 能不能给个示例呢?或是网址联连,或是书本链接(仅电子版,穷啊),多谢:-)。




del_c_sharp 2002-11-03
  • 打赏
  • 举报
回复
摩托给点建议:

java和其他语言直接整合一般配置很繁杂。我觉得的用webservice
比较方便。你用java写ejb组件,用java的做成webservice(其实用
delphi也可以做服务来引用beans),客户端用delphi很容易实现。
Iforgot 2002-11-03
  • 打赏
  • 举报
回复
过来了,可是我也不懂。只知道最最最皮毛的东西。
*******************************************************************
java.lang.Process

abstract void destroy()
Kills the subprocess.
abstract int exitValue()
Returns the exit value for the subprocess.
abstract InputStream getErrorStream()
Gets the error stream of the subprocess.
abstract InputStream getInputStream()
Gets the input stream of the subprocess.
abstract OutputStream getOutputStream()
Gets the output stream of the subprocess.
abstract int waitFor()
causes the current thread to wait, if necessary, until the process represented by this Process object has terminated.
*******************************************************************
java.lang.Runtime

Process exec(String command)
Executes the specified string command in a separate process.
Process exec(String[] cmdarray)
Executes the specified command and arguments in a separate process.
Process exec(String[] cmdarray, String[] envp)
Executes the specified command and arguments in a separate process with the specified environment.
Process exec(String[] cmdarray, String[] envp, File dir)
Executes the specified command and arguments in a separate process with the specified environment and working directory.
Process exec(String cmd, String[] envp)
Executes the specified string command in a separate process with the specified environment.
Process exec(String command, String[] envp, File dir)
Executes the specified string command in a separate process with the specified environment and working directory.
static Runtime getRuntime()
Returns the runtime object associated with the current Java application.
*******************************************************************


Dephi我不清楚,不过VB有个API声明:

Public 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
monkely 2002-11-03
  • 打赏
  • 举报
回复
靠,我也是和你差不多,现在正在用delphi在一家公司写程序,以前用的是VB,现在这两种都还可以了,但就是不会做多层的应用,可又急需找到学习的入口,一起UP。
blueshrimp 2002-11-03
  • 打赏
  • 举报
回复
To:gmc007(江西的佬表)

Up当然有分,但只按人头算,不按次数算

我是江西宜春市,兄台是哪的呀?:-)
yxknet 2002-11-03
  • 打赏
  • 举报
回复
JAVA不会,帮不了你
qiqi97 2002-11-03
  • 打赏
  • 举报
回复
JAVA?JAVA不会,帮不了你,不好意思
gmc007 2002-11-03
  • 打赏
  • 举报
回复
如果UP真的有分的话,那么我将UP一万次!嘿嘿
UP
经典中的经典! 目 录 译者序 序 前言 第一部分 快速开发的基础 第1章 Delphi 5下的Windows编程 1 1.1 Delphi产品家族 1 1.2 Delphi是什么 3 1.2.1 可视化开发环境 3 1.2.2 编译器的速度和已编译代码的效 率 4 1.2.3 编程语言的功能及其复杂性 4 1.2.4 数据库结构的灵活性和可扩展性 5 1.2.5 框架对设计和使用模式的扩充 5 1.3 历史回顾 5 1.3.1 Delphi 1 5 1.3.2 Delphi 2 6 1.3.3 Delphi 3 6 1.3.4 Delphi 4 7 1.3.5 Delphi 5 7 1.3.6 未来 7 1.4 Delphi 5的IDE 7 1.4.1 主窗口 8 1.4.2 窗体设计器 9 1.4.3 Object Inspector 9 1.4.4 代码编辑器 9 1.4.5 代码浏览器 10 1.4.6 源代码生成器 10 1.5 创建一个简单的应用程序 11 1.6 事件机制的优势在哪里 12 1.7 加速原型化 13 1.8 可扩展的组件和环境 13 1.9 IDE最重要的十点功能 13 1.10 总结 15 第2章 Object Pascal语言 16 2.1 注解 16 2.2 新的过程和函数特征 17 2.2.1 圆括号 17 2.2.2 重载 17 2.2.3 缺省值参数 17 2.3 变量 18 2.4 常量 19 2.5 运算符 20 2.5.1 赋值运算符 20 2.5.2 比较运算符 20 2.5.3 逻辑表达式 21 2.5.4 算术运算符 21 2.5.5 按位运算符 22 2.5.6 加减运算过程 22 2.6 Object Pascal类型 23 2.6.1 类型的比较 23 2.6.2 字符 24 2.6.3 字符串 24 2.6.4 变体类型 32 2.6.5 Currency 39 2.7 用户自定义类型 39 2.7.1 数组 39 2.7.2 动态数组 40 2.7.3 记录 41 2.7.4 集合 42 2.7.5 对象 43 2.7.6 指针 44 2.7.7 类型别名 46 2.8 强制类型转换和类型约定 46 2.9 字符串资源 47 2.10 测试条件 47 2.10.1 if语句 47 2.10.2 case语句 48 2.11 循环 49 2.11.1 for循环 49 2.11.2 while循环 49 2.11.3 repeat...until 50 2.11.4 Break()过程 50 2.11.5 Continue()过程 50 2.12 过程和函数 50 2.13 作用域 50 2.14 单元 55 2.14.1 uses子句 55 2.14.2 循环单元引用 56 2.15 包 56 2.15.1 使用Delphi的包 56 2.15.2 包的语法 56 2.16 面向对象编程 57 2.17 使用Delphi对象 58 2.17.1 声明和实例化 58 2.17.2 析构 59 2.18 方法 59 2.18.1 方法的类型 60 2.18.2 属性 61 2.18.3 可见性表示符 62 2.18.4 友类 62 2.18.5 对象的秘密 63 2.18.6 TObject:所有对象的祖先 63 2.18.7 接口 63 2.19 结构化异常处理 66 2.19.1 异常类 68 2.19.2 执的流程 70 2.19.3 重新触发异常 71 2.20 运期类型信息 72 2.21 总结 72 第3章 Win32 API 73 3.1 对象:以前和现在 73 3.1.1 内核对象 73 3.1.2 GDI和用户对象 75 3.2 多任务和多线程 75 3.3 Win32内存管理 76 3.3.1 什么是线性内存模式 76 3.3.2 Win32系统是怎样管理内存的 76 3.4 Win32的错误处理 78 3.5 总结 78 第4章 应用程序框架和设计 79 4.1 理解Delphi环境和项目的体系结构 79 4.2 构成Delphi 5项目的文件 79 4.2.1 项目文件 80 4.2.2 单元文件 80 4.2.3 窗体文件 80 4.2.4 资源文件 81 4.2.5 项目选项及桌面设置文件 81 4.2.6 备份文件 81 4.2.7 包文件 82 4.3 项目管理提示 82 4.3.1 一个项目一个目录 82 4.3.2 共享代码的单元 82 4.3.3 多项目管理 84 4.4 Delphi 5项目的框架类 84 4.4.1 TForm类 84 4.4.2 TApplication类 89 4.4.3 TApplication的方法 91 4.4.4 TApplication的事件 92 4.4.5 TScreen类 93 4.5 定义公共体系结构:使用对象库 93 4.5.1 考虑应用程序的体系结构 93 4.5.2 Delphi固有的体系结构 94 4.5.3 体系结构的例子 94 4.5.4 子窗体TChildForm 94 4.5.5 数据库基础模式窗体TDBMode- Form 96 4.5.6 数据库导航/状态窗体TDBNavstat- Form 97 4.5.7 使用框架进应用程序结构 设计 102 4.6 一些项目管理的功能 103 4.6.1 在项目中添加资源 103 4.6.2 改变屏幕光标 105 4.6.3 避免创建一个窗体的多个实例 106 4.6.4 在DPR文件中增加代码 107 4.6.5 覆盖应用程序的异常处理 107 4.6.6 显示一个封面 109 4.6.7 使窗体尺寸最小 110 4.6.8 运没有窗体的项目 111 4.6.9 退出Windows 112 4.6.10 防止关闭Windows 113 4.7 总结 113 第5章 理解Windows消息 114 5.1 什么是消息 114 5.2 消息的类型 115 5.3 Windows消息系统是如何工作的 115 5.4 Delphi的消息系统 116 5.5 消息处理 117 5.5.1 消息处理:不是无约定的 118 5.5.2 对Result域赋值 119 5.5.3 TApplication的OnMessage事件 119 5.6 发送自己的消息 120 5.6.1 Perform() 120 5.6.2 sendMessage()和PostMessage() 120 5.7 非标准的消息 121 5.7.1 通知消息 121 5.7.2 VCL内部的消息 122 5.7.3 用户自定义的消息 122 5.8 一个消息系统的剖析:VCL 123 5.9 消息与事件之间的关系 128 5.10 总结 129 第6章 代码标准文档 130 6.1 一般的源代码格式规则 130 6.1.1 缩进 130 6.1.2 边距 130 6.1.3 begin...end 130 6.2 Object Pascal 131 6.2.1 括号 131 6.2.2 保留字和关键字 131 6.2.3 过程和函数 131 6.2.4 变量 132 6.2.5 类型 133 6.2.6 构造类型 133 6.2.7 语句 134 6.2.8 结构化异常处理 134 6.2.9 类 135 6.3 文件 136 6.3.1 项目文件 136 6.3.2 窗体文件 136 6.3.3 数据模块文件 137 6.3.4 远程数据模块文件 137 6.3.5 单元文件 137 6.3.6 文件头 138 6.4 窗体与数据模块 138 6.4.1 窗体 138 6.4.2 数据模块 139 6.5 包 139 6.5.1 运期包与设计期包 139 6.5.2 文件命名标准 140 6.6 组件 140 6.6.1 自定义组件 140 6.6.2 组件实例的命名规则 140 6.7 代码标准文档升级 141 第7章 使用ActiveX控件 142 7.1 什么是ActiveX控件 142 7.2 何时使用ActiveX控件 142 7.3 把ActiveX控件加到组件面板上 143 7.4 Delphi组件外套 144 7.4.1 外套文件是从哪来的 152 7.4.2 枚举 152 7.4.3 控件接口 152 7.4.4 TOleControl的派生类 152 7.4.5 方法 152 7.4.6 属性 153 7.5 在应用程序中使用ActiveX控件 153 7.6 发布带有ActiveX控件的应用程序 154 7.7 注册ActiveX控件 155 7.8 BlackJack:一个OCX示范程序 155 7.8.1 纸牌 155 7.8.2 游戏 157 7.8.3 调用ActiveX控件的方法 165 7.9 总结 166 第二部分 高级技术 第8章 使用GDI和字体的图像编程 167 8.1 TImage:Delphi的图像显示 167 8.2 存储图像 168 8.3 使用TCanvas的属性 169 8.3.1 画笔 170 8.3.2 使用TCanvas.Pixels属性 175 8.3.3 使用刷子 175 8.3.4 使用字体 180 8.3.5 使用CopyMode属性 181 8.3.6 其他属性 184 8.4 使用TCanvas的方法 184 8.4.1 用TCanvas画线 184 8.4.2 用TCanvas画几何形状 185 8.4.3 画图的示范程序 185 8.4.4 用TCanvas输出文字 189 8.5 坐标系统和映射模式 193 8.5.1 设备坐标系 193 8.5.2 逻辑坐标系 194 8.5.3 屏幕坐标系 194 8.5.4 窗体坐标系 194 8.5.5 坐标映射 195 8.5.6 设置映射模式 196 8.5.7 设置窗口/视区范围 196 8.5.8 关于映射模式的示范程序 197 8.6 创建一个绘画程序 202 8.7 编写动画程序 215 8.8 高级字体 221 8.8.1 Win32字体类型 222 8.8.2 基本字体元素 222 8.8.3 GDI字体分类 223 8.8.4 显示不同字体 223 8.9 实际创建一种字体 224 8.9.1 这个程序是如何工作的 224 8.9.2 显示字体的有关信息 230 8.10 总结 233 第9章 动态链接库 234 9.1 究竟什么是DLL 234 9.2 静态链接与动态链接 235 9.3 为什么要使用DLL 236 9.3.1 共享代码、资源和数据 236 9.3.2 隐藏实现的细节 237 9.3.3 自定义控件 237 9.4 创建和使用DLL 237 9.4.1 数美分:一个简单的DLL 237 9.4.2 显示DLL中的模式窗体 239 9.5 显示DLL中的无模式窗体 241 9.6 在Delphi应用程序中使用DLL 242 9.7 DLL的入口函数和出口函数 246 9.7.1 进程/线程初始化和终止例程 246 9.7.2 DLL入口/出口示例 246 9.8 DLL中的异常 250 9.8.1 在16位Delphi中捕捉异常 250 9.8.2 异常和Safecall指示符 250 9.9 回调函数 250 9.9.1 使用回调函数 253 9.9.2 拥有者绘制的列表框 253 9.10 从DLL中调用回调函数 253 9.11 在不同的进程间共享DLL数据 256 9.11.1 一个可以被共享数据的DLL 256 9.11.2 访问DLL中的共享数据 259 9.12 引出DLL中的对象 261 9.13 总结 265 第10章 Delphi 5的打印 266 10.1 TPrinter对象 266 10.2 TPrinter.Canvas 267 10.3 简单打印 267 10.3.1 打印TMemo组件中的内容 267 10.3.2 打印位图 268 10.3.3 打印RTF格式的文本 269 10.4 打印窗体 269 10.5 高级打印 270 10.5.1 打印分栏报表 270 10.5.2 放弃打印进程 275 10.5.3 打印信封 275 10.5.4 抽象打印 276 10.5.5 一个简单的打印预览程序 285 10.6 其他打印任务 286 10.6.1 TDeviceMode结构 286 10.6.2 设置打印份数 288 10.6.3 设置打印方向 288 10.6.4 设置纸张尺寸 288 10.6.5 设置纸张的长度 289 10.6.6 设置页的宽度 289 10.6.7 设置打印比例 289 10.6.8 设置打印颜色 289 10.6.9 设置打印质量 289 10.6.10 设置双面打印 290 10.6.11 指定默认打印机 290 10.7 获取打印机信息 291 10.7.1 GetDeviceCaps()和DeviceCapa- bilities() 292 10.7.2 获取打印机信息的示范程序 292 10.8 总结 303 第11章 编写多线程应用程序 304 11.1 对线程的解释 304 11.1.1 一种新型的多任务 304 11.1.2 在Delphi程序中使用多线程 304 11.1.3 关于线程的滥用 305 11.2 TThread对象 305 11.2.1 TThread基础 305 11.2.2 TThread实例 307 11.2.3 线程的终止 307 11.2.4 与VCL同步 308 11.2.5 一个演示程序 310 11.2.6 优先级和时序安排 311 11.2.7 挂起和唤醒线程 313 11.2.8 测试线程的时间 313 11.3 管理多线程 314 11.3.1 线程局部存储 314 11.3.2 线程同步 317 11.4 一个多线程的示范程序 325 11.4.1 用户界面 326 11.4.2 搜索线程 330 11.4.3 调整优先级 334 11.5 多线程与数据库 335 11.6 多线程与图形处理 340 11.7 总结 343 第12章 文件处理 344 12.1 处理文件的输入/输出 344 12.1.1 文本文件的处理 344 12.1.2 类型文件的处理 348 12.1.3 无类型文件的处理 356 12.2 TTextRec 和TFileRec结构 359 12.3 内存映射文件 360 12.3.1 内存映射文件的应用 360 12.3.2 使用映射文件 361 12.3.3 内存映射文件的一致性 366 12.3.4 文本搜索实用程序 366 12.4 目录和驱动器 373 12.4.1 获得有效驱动器和驱动器类型列 表 373 12.4.2 获取驱动器信息 374 12.4.3 获取Windows目录位置 376 12.4.4 获取系统目录的位置 376 12.4.5 获取当前目录 377 12.4.6 在目录中查找文件 377 12.4.7 复制和删除目录树 380 12.4.8 获取文件的版本信息 382 12.4.9 获取版本号 387 12.4.10 获得操作系统信息 388 12.4.11 使用TVerInfoRes类 388 12.5 使用SHFileOperation()函数 390 12.6 总结 391 第13章 核心技术 392 13.1 高级消息处理 392 13.1.1 子类化 392 13.1.2 HookMainWindow() 396 13.2 防止同时出现多个应用程序实例 397 13.3 使用Delphi的BASM 401 13.3.1 BASM是如何工作的 401 13.3.2 简易的参数访问 402 13.3.3 var声明的参数 402 13.3.4 Register调用约定 403 13.3.5 全汇编过程 403 13.3.6 记录 403 13.4 使用挂钩 404 13.4.1 设置挂钩 404 13.4.2 使用挂钩函数 405 13.4.3 使用脱钩函数 405 13.4.4 使用SendKeys:一个JournalPlay- back类型的挂钩 405 13.5 使用C/C++的OBJ文件 416 13.5.1 调用一个函数 416 13.5.2 命名问题 417 13.5.3 共享数据 417 13.5.4 使用Delphi RTL 418 13.6 使用C++类 422 13.7 替换 426 13.7.1 generic替换 426 13.7.2 WM_COPYDATA 435 13.8 获取包的信息 440 13.9 总结 443 第14章 获取系统信息 444 14.1 InfoForm:获取一般信息 444 14.1.1 格式化字符串 444 14.1.2 获取内存状态 445 14.1.3 获取操作系统版本信息 446 14.1.4 获取目录信息 447 14.1.5 获取系统信息 448 14.1.6 检查环境 450 14.2 平台无关性 455 14.3 Windows 95/98: 使用ToolHelp32 455 14.3.1 快照 456 14.3.2 列举进程 457 14.3.3 列举线程 460 14.3.4 列举模块 461 14.3.5 列举堆 462 14.3.6 堆的视图 465 14.3.7 程序源码 466 14.4 Windows NT/2000: PSAPI 474 14.5 总结 485 第15章 移植到Delphi 5 486 15.1 Delphi 5的新功能 486 15.1.1 哪个版本 486 15.1.2 单元、组件和包 487 15.2 从Delphi 4移植到Delphi 5 487 15.2.1 IDE问题 488 15.2.2 RTL问题 488 15.2.3 VCL问题 488 15.2.4 Internet开发问题 488 15.2.5 数据库问题 488 15.3 从Delphi 3移植到Delphi 5 489 15.3.1 无符号的32位整数 489 15.3.2 64位整数 490 15.3.3 Real类型 490 15.4 从Delphi 2移植到Delphi 5 490 15.4.1 改变为Boolean类型 490 15.4.2 ResourceString 490 15.4.3 RTL的改变 491 15.4.4 TCustomForm 491 15.4.5 GetChildren() 491 15.4.6 自动化服务器 491 15.5 从Delphi 1移植到Delphi 5 491 15.5.1 字符串和字符 492 15.5.2 变量长度和范围 497 15.5.3 记录的排列 497 15.5.4 32位的数学运算 498 15.5.5 TDateTime类 498 15.5.6 单元结束代码 498 15.5.7 汇编语言 499 15.5.8 调用约定 499 15.5.9 动态链接库 500 15.5.10 Windows操作系统的变化 501 15.5.11 32位的地址空间 501 15.5.12 32位资源 501 15.5.13 VBX控件 502 15.5.14 Windows API函数的变化 502 15.5.15 16位和32位并存 504 15.6 总结 504 第16章 MDI应用程序 505 16.1 创建MDI应用程序 505 16.1.1 理解MDI基础 505 16.1.2 子窗体 506 16.1.3 主窗体 522 16.2 菜单 528 16.2.1 用MDI程序合并菜单 528 16.2.2 在菜单中列出打开的文档 528 16.3 杂类MDI技术 529 16.3.1 在MDI客户区输出一幅位图 529 16.3.2 创建一个隐藏的子窗体 534 16.3.3 最小化、最大化、还原所有MDI 子窗体 536 16.4 总结 538 第17章 用剪贴板共享信息 539 17.1 剪贴板基础 539 17.1.1 剪贴板对文本操作 540 17.1.2 剪贴板对位图操作 540 17.2 创建你自己的剪贴板格式 541 17.2.1 创建一个感知剪贴板的对象 541 17.2.2 使用自定义的剪贴板格式 545 17.3 总结 547 第18章 多媒体编程 548 18.1 创建一个简单的媒体播放器 548 18.2 播放WAV文件 549 18.3 播放视频 550 18.3.1 显示第一帧 550 18.3.2 使用Display属性 551 18.3.3 使用DisplayRect属性 551 18.3.4 理解TMediaPlayer事件 552 18.3.5 DDGMPlay的源代码 552 18.4 设备支持 553 18.5 创建音频CD播放器 554 18.5.1 显示闪屏 555 18.5.2 开始编写CD播放器 555 18.5.3 更新CD播放器的信息 557 18.5.4 刷新CD播放器的方法 558 18.5.5 CD播放器的源代码 559 18.6 总结 565 第19章 测试与调试 566 19.1 常见的编程错误 567 19.1.1 在类的实例创建之前使用了它 567 19.1.2 确保类的实例被释放 567 19.1.3 掌握指针 568 19.1.4 使用未初始化的PChar类变量 568 19.1.5 释放空指针 569 19.2 使用内部集成调试器 569 19.2.1 使用命令参数 569 19.2.2 断点 569 19.2.3 逐代码 571 19.2.4 使用Watch窗口 572 19.2.5 Debug Inspector 572 19.2.6 计算和修改 572 19.2.7 访问调用栈 572 19.2.8 查看线程 573 19.2.9 事件日志 573 19.2.10 模块视图 574 19.2.11 调试DLL 574 19.2.12 CPU视图 575 19.3 总结 575 第三部分 基于组件的开发 第20章 VCL元素和运期类型信息 577 20.1 什么是组件 577 20.2 组件的类型 578 20.2.1 标准控件 578 20.2.2 自定义控件 578 20.2.3 图形控件 578 20.2.4 非可视组件 579 20.3 组件的结构 579 20.3.1 属性 579 20.3.2 属性的类型 580 20.3.3 方法 580 20.3.4 事件 581 20.3.5 流属性 582 20.3.6 拥有关系 582 20.3.7 父子关系 583 20.4 可视组件的层次关系 583 20.4.1 TPersistent类 584 20.4.2 TComponent类 584 20.4.3 TControl类 585 20.4.4 TWinControl类 585 20.4.5 TGraphicControl类 586 20.4.6 TCustomControl类 586 20.4.7 其他类 587 20.5 运期类型信息 589 20.5.1 TypInfo.pas单元:定义运类型 信息 589 20.5.2 获取类型信息 591 20.5.3 获取方法指针的类型信息 596 20.5.4 获取有序类型的类型信息 600 20.5.5 通过RTTI给属性赋值 604 20.6 总结 606 第21章 编写自定义组件 607 21.1 组件设计基础 607 21.1.1 确定是否需要编写组件 607 21.1.2 编写组件的一般步骤 607 21.1.3 确定一个祖先类 608 21.1.4 创建一个组件单元 609 21.1.5 添加属性 609 21.1.6 加入事件 615 21.1.7 创建自定义的方法 619 21.1.8 构造器和析构器 619 21.1.9 注册组件 620 21.1.10 测试组件 621 21.1.11 提供组件图标 623 21.2 一个组件的示例 623 21.2.1 扩展Win32组件外套功能 624 21.2.2 TddgRunButton: 创建属性 631 21.3 TddgButtonEdit:一个容器组件 636 21.3.1 设计 636 21.3.2 显现属性 637 21.3.3 显现事件 637 21.3.4 TddgDigitalClock:创建组件事 件 639 21.3.5 把窗体加到组件面板上 642 21.4 组件包 644 21.4.1 为什么使用包 644 21.4.2 什么情况下不使用包 645 21.4.3 包的类型 645 21.4.4 包文件 645 21.4.5 在Delphi 5应用程序中使用包 645 21.4.6 把包安装到IDE中 645 21.4.7 设计自己的包 646 21.4.8 包的版本 649 21.4.9 包的编译指令 649 21.4.10 关于{$WEAKPACKAGEUNIT} 指令 649 21.4.11 包的命名约定 650 21.5 附加包 650 21.6 总结 655 第22章 高级组件技术 656 22.1 伪可视组件 656 22.1.1 扩展提示功能 656 22.1.2 创建一个THintWindow的派生 类 656 22.1.3 椭圆型的窗口 658 22.1.4 使派生的提示窗口有效 659 22.1.5 放置TDDGHintWindow 659 22.2 动态组件 659 22.2.1 走马灯组件 659 22.2.2 编写这个组件 659 22.2.3 在内存中的位图上输出 659 22.2.4 输出组件 661 22.2.5 使组件动起来 661 22.2.6 测试TddgMarquee组件 668 22.3 编写属性编辑器 670 22.3.1 派生出一个属性编辑器对象 670 22.3.2 把属性当作文本来编辑 671 22.3.3 注册新的属性编辑器 674 22.3.4 用对话框来编辑属性 675 22.4 组件编辑器 677 22.4.1 TComponentEditor 677 22.4.2 一个简单的组件 678 22.4.3 一个简单的组件编辑器 679 22.4.4 注册组件编辑器 679 22.5 对非公开的组件数据进流操作 681 22.5.1 声明属性 681 22.5.2 DefineProperty()的例子 682 22.5.3 TddgWaveFile:调用Define- BinaryProperty()的例子 684 22.6 属性类别 690 22.6.1 类别的类 690 22.6.2 自定义类别 691 22.7 组件列表:TCollection和 TCollectionItem 694 22.7.1 声明TCollectionItem类: TRunBtnItem 695 22.7.2 声明TCollection类: TRunButtons 696 22.7.3 实现TddgLaunchPad、TRun- BtnItem和TRunButtons 696 22.7.4 用对话框属性编辑器编辑 TCollectionItem组件的列表 702 22.8 总结 711 第23章 COM和ActiveX 712 23.1 COM基础 712 23.1.1 COM:组件对象模型 712 23.1.2 COM、ActiveX、OLE的异同 713 23.1.3 术语 713 23.1.4 ActiveX的伟大之处 713 23.1.5 OLE 1和OLE 2 713 23.1.6 结构化存储 714 23.1.7 统一数据传输 714 23.1.8 线程模式 714 23.1.9 COM+ 714 23.2 COM与Object Pascal 714 23.2.1 接口 715 23.2.2 使用接口 716 23.2.3 HResult返回类型 719 23.3 COM对象和类工厂 720 23.3.1 TComObject和TComObject- Factory 720 23.3.2 in-process COM服务器 721 23.3.3 创建一个in-proc COM服务器实 例 722 23.3.4 out-of-process COM服务器 723 23.4 聚合 723 23.5 分布式COM 723 23.6 自动化 724 23.6.1 IDispatch接口 724 23.6.2 类型信息 725 23.6.3 后期捆绑与前期捆绑 725 23.6.4 注册 725 23.6.5 创建自动化服务器 725 23.6.6 创建自动化控制器 740 23.7 高级自动化技术 745 23.7.1 自动化事件 745 23.7.2 自动化集合 754 23.7.3 类型库中新的接口类型 760 23.7.4 交换二进制数据 761 23.7.5 COM的语言支持 763 23.8 MTS 766 23.8.1 为什么会出现MTS 767 23.8.2 什么是MTS 767 23.8.3 Delphi中的MTS 770 23.9 TOleContainer 785 23.9.1 一个简单的范例程序 785 23.9.2 一个稍复杂的范例程序 787 23.10 总结 794 第24章 扩展Windows外壳 795 24.1 托盘图标组件 795 24.1.1 API 795 24.1.2 处理消息 797 24.1.3 图标及提示 797 24.1.4 鼠标点击 798 24.1.5 隐藏应用程序 799 24.1.6 托盘图标应用程序举例 805 24.2 应用程序桌面工具栏 807 24.2.1 API 807 24.2.2 TAppBar:AppBar的窗体 808 24.2.3 使用TAppBar 815 24.3 外壳链接 817 24.3.1 获取一个IShellLink实例 818 24.3.2 使用IShellLink 819 24.3.3 创建一个外壳链接 820 24.3.4 获取及设置链接信息 821 24.3.5 一个例子程序 824 24.4 外壳扩展 831 24.4.1 COM对象向导 832 24.4.2 复制钩子处理器 832 24.4.3 上下文菜单处理器 836 24.4.4 图标处理器 844 24.5 总结 850 第25章 创建ActiveX控件 851 25.1 为什么要创建ActiveX控件 851 25.2 创建一个ActiveX控件 851 25.2.1 ActiveX控件向导 852 25.2.2 ActiveX框架 875 25.2.3 属性页 877 25.3 ActiveForm 886 25.4 在Web上的ActiveX 892 25.4.1 与Web浏览器通信 892 25.4.2 Web发布 901 25.5 总结 903 第26章 使用Delphi Open Tools API 904 26.1 Open Tools API接口 904 26.2 使用Open Tools API 905 26.2.1 Dumb向导 905 26.2.2 Wizard向导 908 26.2.3 DDG Search 916 26.3 窗体向导 925 26.4 总结 931 第27章 使用Delphi开发CORBA 932 27.1 ORB 932 27.2 接口 932 27.3 Stub和Skeleton 933 27.4 VisiBroker的ORB 933 27.4.1 VisiBroker的运时支持服务 933 27.4.2 VisiBroker管理工具 934 27.5 Delphi的CORBA支持 934 27.5.1 CORBA的类支持 935 27.5.2 CORBA对象向导 936 27.5.3 Delphi的类型库编辑器 941 27.6 在Delphi 5中创建CORBA解决方案 942 27.6.1 建立一个CORBA服务器 942 27.6.2 实现IQueryServer的方法 943 27.6.3 编译一个静态绑定的CORBA 客户 956 27.6.4 编译一个动态绑定的CORBA 客户 958 27.6.5 跨语言的CORBA 960 27.7 使用VisiBroker ORB 967 27.8 总结 967 第四部分 开发数据库 第28章 编写桌面数据库应用程序 969 28.1 使用数据集 969 28.1.1 VCL的数据库体系结构 970 28.1.2 BDE数据访问组件 970 28.1.3 打开一个数据集 971 28.1.4 浏览数据集 971 28.1.5 对字段操作 975 28.1.6 刷新数据集 985 28.1.7 变化的状态 986 28.1.8 过滤器 986 28.2 使用TTable组件 988 28.2.1 查找记录 988 28.2.2 主/细表 990 28.2.3 TTable的事件 990 28.2.4 通过代码创建一个数据库表 991 28.3 数据模块 992 28.4 搜索、设置范围和过滤的示例 992 28.4.1 数据模块 992 28.4.2 主窗体 993 28.4.3 Range窗体 995 28.4.4 Key Search窗体 996 28.4.5 Filter窗体 998 28.5 TQuery和TStoredProc:其他数据 集 1000 28.6 文本文件数据库表 1001 28.6.1 概要文件 1001 28.6.2 数据文件 1002 28.6.3 使用文本数据库表 1002 28.6.4 限制 1003 28.6.5 从文本数据库表中引入数据 1003 28.7 用ODBC连接 1004 28.7.1 到哪儿找ODBC驱动程序 1004 28.7.2 ODBC实例:连接MS Access 1004 28.8 ActiveX Data Object 1007 28.8.1 Microsoft 数据访问简介 1007 28.8.2 ADOExpress组件 1008 28.8.3 连接一个ADO数据存储 1008 28.8.4 示例:通过ADO连接 1010 28.8.5 ADO开发 1011 28.9 总结 1011 第29章 开发客户/服务器应用程序 1012 29.1 为什么要采用客户/服务器结构 1012 29.2 客户/服务器体系结构 1013 29.2.1 客户 1013 29.2.2 服务器 1013 29.2.3 业务规则 1014 29.2.4 胖客户、胖服务器、中间层:业 务规则属于哪一端 1014 29.3 客户/服务器模型 1015 29.3.1 两层模型 1015 29.3.2 三层模型 1016 29.4 客户/服务器与桌面数据库开发的比 较 1017 29.4.1 面向集合与面向记录 1017 29.4.2 数据安全 1017 29.4.3 记录锁定方法 1017 29.4.4 数据完整性 1018 29.4.5 面向事务 1018 29.5 SQL在客户/服务器开发中的角色 1018 29.6 Delphi客户/服务器开发 1019 29.7 服务器:后端设计 1019 29.7.1 数据库对象 1019 29.7.2 定义数据库表 1020 29.7.3 使用域 1021 29.7.4 用视图、存储过程和触发器定义 业务规则 1022 29.7.5 数据库对象的访问权限 1027 29.8 客户:前端开发 1028 29.8.1 使用TDatabase组件 1028 29.8.2 TTable还是TQuery 1034 29.8.3 使用TQuery组件 1036 29.8.4 执存储过程 1041 29.9 总结 1043 第30章 扩展数据库VCL 1044 30.1 使用BDE 1044 30.1.1 BDE单元 1044 30.1.2 Check() 1044 30.1.3 指针和句柄 1045 30.1.4 使指针同步 1045 30.2 dBASE表 1045 30.2.1 物理记录编号 1046 30.2.2 显示被删除的记录 1047 30.2.3 测试被软删除的记录 1047 30.2.4 恢复被软删除的记录 1048 30.2.5 紧缩表 1048 30.3 Paradox表 1049 30.3.1 记录序号 1049 30.3.2 紧缩 1049 30.3.3 限制查询结果 1055 30.3.4 BDE杂项 1056 30.3.5 编写数据感知VCL控件 1059 30.4 扩展TDataSet 1063 30.4.1 过去 1063 30.4.2 现在 1063 30.4.3 创建一个TDataSet派生类 1064 30.5 总结 1083 第31章 用WebBroker使应用程序具有 Internet功能 1084 31.1 ISAPI、NSAPI和CGI—Web服务 器扩展 1085 31.1.1 公共网关接口 1085 31.1.2 ISAPI和NSAPI 1085 31.2 用Delphi创建Web应用程序 1086 31.2.1 TWebModule和TWeb- Dispatcher 1086 31.2.2 TWebRequest和TWeb- Response 1088 31.3 用HTML内容生成器建立动态网 页 1091 31.3.1 TPageProducer 1091 31.3.2 TDatasetTableProducer和 TQueryTableProducer 1092 31.4 使用cookie保存状态 1097 31.5 重定向到另一个Web站点 1099 31.6 从HTML表单中获取信息 1099 31.7 数据流 1101 31.8 总结 1104 第32章 MIDAS开发 1105 32.1 多层应用程序的结构 1105 32.2 多层体系结构的优点 1106 32.3 典型的MIDAS体系结构 1107 32.3.1 服务器 1107 32.3.2 客户 1109 32.4 用MIDAS建立应用程序 1110 32.4.1 设置服务器 1110 32.4.2 创建客户 1111 32.5 增强应用程序的更多选择 1115 32.5.1 客户优化技巧 1115 32.5.2 服务器端的技巧 1116 32.6 几个实例 1117 32.6.1 连接 1117 32.6.2 MIDAS的Web功能 1119 32.7 客户数据集的更多功能 1125 32.7.1 嵌套的数据集 1125 32.7.2 客户主/细连接 1125 32.7.3 两层应用程序 1130 32.8 部署MIDAS应用程序 1131 32.9 总结 1134 第五部分 快速开发数据库应用程序 第33章 货物管理程序:客户/服务器 开发 1135 33.1 设计后端 1135 33.1.1 定义域 1136 33.1.2 定义表 1137 33.1.3 定义生成器 1138 33.1.4 定义触发器 1138 33.1.5 定义存储过程 1139 33.1.6 授权 1141 33.2 集中数据库访问:业务规则 1141 33.2.1 登录和退出方法 1150 33.2.2 Customer表的方法 1151 33.2.3 Part表的方法 1152 33.2.4 Sales表的方法 1152 33.2.5 临时表的方法 1153 33.2.6 TDataModule操纵数据访问 组件的事件 1153 33.3 设计用户界面 1153 33.3.1 TMainForm:应用程序的主窗 体 1154 33.3.2 TCustomerForm:客户输入 1158 33.3.3 TPartsForm: 货物输入 1161 33.3.4 TSalesForm: 销售浏览 1165 33.3.5 TNewSalesForm: 销售输入 1165 33.3.6 CustomerSearch对话框 1169 33.4 总结 1173 第34章 客户跟踪系统:MIDAS开发 1174 34.1 设计服务器应用程序 1174 34.2 设计客户应用程序 1176 34.2.1 客户数据模块 1176 34.2.2 客户主窗体 1184 34.3 总结 1190 第35章 错误报告工具:桌面数据库 开发 1191 35.1 通用应用程序的需求 1191 35.1.1 为WWW准备 1191 35.1.2 用户的数据输入和登录 1191 35.1.3 错误处理、浏览和过滤 1191 35.1.4 错误注解 1191 35.1.5 用户界面的功能 1192 35.2 数据模型 1192 35.3 开发数据模块 1192 35.3.1 应用程序初始化和登录 1201 35.3.2 生成Paradox关键值 1202 35.3.3 错误处理例程 1202 35.3.4 浏览/过滤错误 1202 35.3.5 增加用户 1202 35.3.6 加入注解 1204 35.4 开发用户界面 1205 35.4.1 主窗体 1205 35.4.2 用户界面的其他问题 1211 35.5 使应用程序具有Web功能 1211 35.6 总结 1211 第36章 错误报告工具:使用 WebBroker 1212 36.1 网页布局 1212 36.2 修改数据模块 1213 36.3 配置TDataSetTableProducer组件: dstpBugs 1213 36.4 配置TWebDispatcher组件: wbdpBugs 1213 36.5 配置TPageProducer组件: pprdBugs 1214 36.6 编写DDGWebBugs ISAPI服务器: 增加TActionItem实例 1214 36.6.1 辅助例程 1214 36.6.2 介绍网页 1215 36.6.3 获取并校验用户登录名字 1216 36.7 浏览错误信息 1219 36.7.1 浏览所有错误信息 1219 36.7.2 浏览用户自己的错误信息 1221 36.7.3 格式化表格单元并显示错误细 节 1222 36.8 增加新的错误信息 1223 36.8.1 获取错误信息 1223 36.8.2 校验插入的错误信息 1225 36.9 总结 1228 第六部分 附 录 附录A 错误信息与异常 1229 附录B BDE错误代码 1247 附录C 参考文献 1264
最近在学习数据编程,这本书相当不错,共享一下,有需要的朋友就下载吧~第1章 ADO/MTS/COM十和分布式多层架构 1-1 认识ADO 1-2 使用原生ADO对象 1-3 ADO和分布式多层架构 1-4 Delphi的数据存取技术 1-5 原生ADO对象和ADOExpress组件 1-6 结论第2章 撰写使用ADO技术的应用系统(一) 2-1 ADOExpress组件 2-2 数据库应用程序 2-3 Master/Detall应用程序 2-4 事务管理 2-5 BatchUpdate模式 2-6 搜寻数据 2-7 过滤数据 2-8 排序数据 2-9 结论第3章 撰写使用ADO技术的应用系统(二) 3-l 处理多个数据表Join的数据 3-2 使用ADO处理BLOB信息 3-3 调用存储过程 3-4 使用ADO的异步执能力 3-5 处理错误 3-6 使用ADO存取Excel 3-7 使用ADOx 3-8 RDS 3-9 使用ADO开发分布式多层应用系统 3-10 ADO和WebBroker应用程序 3-11 结论 第4章 深入了解ADO 4-l AD0的Cursor Engine 4-2 ADO修改数据的流程 4-3 ADOExpress和AD0 4-4 ADO和BDE/IDA贝 4-5 ADO的执效率 4-6 优化ADO的执效率 4-7 结论 第5章 MTS/COM+和分布式多层应用系统 5-1 什么是MTS 5-2 COM+COM的基本概念 5-3 MTS的系统架构 5-4 COM+的系统架构 5-5 状态对象和无状态对象 5-6 结论 第6章 MTS/COM+的核心技术事务管理 6-1 数据库事务管理 6-2 MTS/COM+事务对象 6-3 资源管理 6-4 MTS/COM+的事务生命周期 6-5 以程序代码自控制事务管理 6-6 结论 第7章 MTS/COM+的安全机制 7-1 安全机制 7-2 MTS/COM+的角色 7-3 实现宣告式安全机制 7-4 资源鉴定控制 7-5 安全机制检查的时机 7-6 实际的范例 7-7 结论 第8章 设计MTS/COM+对象和MTS/COM+应用系统 8-1 开发MTS/COM+组件 8-2 开发存取数据的MTS/CoM+组件 8-3 较为复杂和实际的MTS/COM+应用系统 8-4 MT3/COM+的共享信息机制 8-5 管理和分发MTS/COM+应用系统 8-6 如何调试MTS/COM+应用系统 8-7 结论第9章 以DeIphi技术开发MTS/COM+应用系统 9-l 一个典型的场景 9-2 使用TDCoMConnection建立MTS/COM+对象 9-3 维护事务管理的正确性 9-4 MTS/COM+应用系统架构的实现 9-5 第二种思考方式 9-6 结论第10章 撰写高效率的MTS/COM+组件和MTS/COM+应用系统 10-1 你应该牢记的事情 10-2 快速建立和调用远程MTS/COM+对象 10-3 MTS/COM+对象和数据的传送 10-4 状态信息 10-5 结论
第1章 ADO/MTS/COM十和分布式多层架构 1-1 认识ADO 1-2 使用原生ADO对象 1-3 ADO和分布式多层架构 1-4 Delphi的数据存取技术 1-5 原生ADO对象和ADOExpress组件 1-6 结论 第2章 撰写使用ADO技术的应用系统(一) 2-1 ADOExpress组件 2-2 数据库应用程序 2-3 Master/Detall应用程序 2-4 事务管理 2-5 BatchUpdate模式 2-6 搜寻数据 2-7 过滤数据 2-8 排序数据 2-9 结论 第3章 撰写使用ADO技术的应用系统(二) 3-l 处理多个数据表Join的数据 3-2 使用ADO处理BLOB信息 3-3 调用存储过程 3-4 使用ADO的异步执能力 3-5 处理错误 3-6 使用ADO存取Excel 3-7 使用ADOx 3-8 RDS 3-9 使用ADO开发分布式多层应用系统 3-10 ADO和WebBroker应用程序 3-11 结论 第4章 深入了解ADO 4-l AD0的Cursor Engine 4-2 ADO修改数据的流程 4-3 ADOExpress和AD0 4-4 ADO和BDE/IDA贝 4-5 ADO的执效率 4-6 优化ADO的执效率 4-7 结论 第5章 MTS/COM+和分布式多层应用系统 5-1 什么是MTS 5-2 COM+COM的基本概念 5-3 MTS的系统架构 5-4 COM+的系统架构 5-5 状态对象和无状态对象 5-6 结论 第6章 MTS/COM+的核心技术事务管理 6-1 数据库事务管理 6-2 MTS/COM+事务对象 6-3 资源管理 6-4 MTS/COM+的事务生命周期 6-5 以程序代码自控制事务管理 6-6 结论 第7章 MTS/COM+的安全机制 7-1 安全机制 7-2 MTS/COM+的角色 7-3 实现宣告式安全机制 7-4 资源鉴定控制 7-5 安全机制检查的时机 7-6 实际的范例 7-7 结论 第8章 设计MTS/COM+对象和MTS/COM+应用系统 8-1 开发MTS/COM+组件 8-2 开发存取数据的MTS/CoM+组件 8-3 较为复杂和实际的MTS/COM+应用系统 8-4 MT3/COM+的共享信息机制 8-5 管理和分发MTS/COM+应用系统 8-6 如何调试MTS/COM+应用系统 8-7 结论 第9章 以DeIphi技术开发MTS/COM+应用系统 9-l 一个典型的场景 9-2 使用TDCoMConnection建立MTS/COM+对象 9-3 维护事务管理的正确性 9-4 MTS/COM+应用系统架构的实现 9-5 第二种思考方式 9-6 结论 第10章 撰写高效率的MTS/COM+组件和MTS/COM+应用系统 10-1 你应该牢记的事情 10-2 快速建立和调用远程MTS/COM+对象 10-3 MTS/COM+对象和数据的传送 10-4 状态信息 10-5 结论
学习单1 Splash窗口的制作 学习单2 制作不可移动的窗体 学习单3 制作非矩形的窗体 学习单4 制作不可见的窗体 学习单5 移动无标题栏窗口 学习单6 制作始终位于最上层的窗体 学习单7 在系统菜单中添加自定义菜单项 学习单8 将窗体大小限定在一定范围内学习单9 使窗体标题栏闪烁 学习单10 使窗体始终最大(小)化 学习单11 使窗口背景颜色渐变 学习单12 动态创建主菜单和菜单项 学习单13 在窗体上动态地设置背景画面 学习单14 获取窗口标题栏中的文字 学习单15 隐藏和显示桌面上的图标 学习单16 文字动画 学习单17 旋转、倾斜文本 学习单18 获取操作系统的版本信息 学习单19 获取CPU信息 学习单20 获取内存信息 学习单21 使程序开机后自动执 学习单22 一个程序只运一次 学习单23 在程序中打开和关闭IE窗口 学习单24 操作INI文件 学习单25 获取文件的日期信息 学习单26 格式化磁盘 学习单27 检测磁盘容量 学习单28 获得安装程序列表 学习单29 程序中实现关机和重启 学习单30 在应用程序窗体中实现超级链接 学习单31 帮助文件的制作 学习单32 安装程序的制作 学习单33 文本搜索程序 学习单34 文件复制程序 学习单35 实现JPG与BMP的互相转换 学习单36 实现BMP到ICON的转换 学习单37 实现图像的飘动效果 学习单38 图像的翻转 学习单39 装入、保存、复制图像 学习单40 制作图像浏览器ACDSee 学习单41 图像的柔化处理效果实现 学习单42 图像的锐化处理效果实现 学习单43 图像的浮雕处理效果实现 学习单44 图像闪烁 学习单45 图像拉伸 学习单46 图像移动 学习单47 图像的交错显示 学习单48 窗体颜色的渐变效果实现 学习单49 按钮的阴影、投影效果实现 学习单50 彩色图变为灰度图 学习单51 实现TColor值到RGB值的变换 学习单52 检测声卡是否安装 学习单53 编写网络浏览器 学习单54 获取主机的IP地址 学习单55 简单邮件发送软件 学习单56 获取本机的MAC地址 学习单57 实现PING链接 学习单58 域名与IP互换 学习单59 远程控制的实现 学习单60 在网络中复制文件 学习单61 获取整个局域网中的可用资源 学习单62 局域网查询主机 学习单63 实现网络驱动器的映射与断开 学习单64 主机端口扫描 学习单65 CGI应用开发 学习单66 ISAPI应用开发 学习单67 数据的录入与修改 学习单68 常规报表的实现 学习单69 基于TTable的Filter属性的查询 学习单70 基于TQuery的Params属性的查询 学习单71 SQL语言的使用 学习单72 一个DBGrid中显示多个数据表数据 学习单73 动态创建数据表 学习单74 在程序中设置ODBC数据源 学习单75 自动检测、建立数据库别名和数据表 任 务 篇任务单76 绘制图形 任务单77 图像编辑器 任务单78 制作mp3播放器 任务单79 多媒体播放器 任务单80 动态报表的实现 任务单81 DLL的制作与调用 任务单82 ADO客户/服务器程序的开发 任务单83 用CORBA数据模块实现多层数据库 任务单84 用DCOM数据模块实现多层数据库 任务单85 可视组件的开发 任务单86 组件包的建立、发布和安装 任务单87 使用Internet Express来创建分布式Web应用 任务单88 COM+分布式应用的实现 任务单89 导出数据到Excel系统 任务单90 简单聊天工具的实现 充 电 篇充电单91 操作剪贴板 充电单92 限制鼠标的位置 充电单93 图形背景变换 充电单94 网上收发消息的实现 充电单95 屏幕保护程序的制作 充电单96 按键的接收及处理 充电单97 文本编辑器 充电单98 制作桌面时钟 充电单99 抓取屏幕 充电单100 扳球小游戏 充电单101 提取应用程序的图标

5,934

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧