Web3 技术栈开发人员指南 ( part 1)

Consensys管理小助手 2023-04-14 11:43:20

 

本指南提供了 web3 技术栈的概述,旨在帮助开发人员了解构建全栈、去中心化区块链应用程序的基本技术和工具。在 Infura,我们认为实现去中心化的最佳方式是为开发人员提供构建它的工具、技术和知识。定义 web3 技术栈需要深入研究和深入了解 web3 生态系统。Web3 技术栈开发人员指南详细介绍了开始构建全栈、去中心化应用程序所需的一切。第一部分,“什么是 Web3?” 定义 web3 并将其与之前的网络演化进行比较。第二部分,“什么是 Web3 技术栈?” 在传统技术栈的背景中定义 web3 技术栈。第三部分“web3 技术栈的组件”详细讨论了支持创建 web3 应用程序的工具和技术。在第四部分“开始构建”中,我们将向您展示如何开始。什么是 Web3?要完全理解 web3,我们需要背景。互联网自诞生以来就一直在不断发展,所以让我们先来看看以前的迭代。

Web1

互联网的第一个主流版本出现于 20 世纪 90 年代中期,主要由通过自托管网站和个人网页分发的内容组成。虽然用户可以将内容传播给比以前更广泛的受众,但在线内容仍然是静态的和只读的。

这意味着网站所有者无法更新已发布的内容,网站访问者也无法以任何方式与内容进行交互。此外,在线发布内容需要高水平的技能和努力,这使得Web1的使用仅限于技术熟练的个人。

Web1

互联网的第一个主流版本出现于 20 世纪 90 年代中期,主要由通过自托管网站和个人网页分发的内容组成。虽然用户可以将内容传播给比以前更广泛的受众,但在线内容仍然是静态的和只读的。

这意味着网站所有者无法更新已发布的内容,网站访问者也无法以任何方式与内容进行交互。此外,在线发布内容需要高水平的技能和努力,这使得Web1的使用仅限于技术熟练的个人。

Web1网站示例(个人主页)

Web2下一个版本的网络在 2000 年代初期发展起来。在此阶段,Twitter 和 Facebook 等网站使互联网具有交互性——例如,网站访问者可以点赞、评论和分享帖子。为此,这个互联网时代常被描述为读写阶段。

Web2 还使普通用户无需大量技能即可更轻松地在线创造和分发内容。这模糊了内容消费者和内容创造者之间的界限,开启了至今仍在延续的用户生成内容时代。维基百科和 YouTube 是 web2 如何使用户能够与内容交互和上传内容,同时抽象出底层技术的复杂细节的示例。

Facebook 是 web2 进化的早期产物

Web3

尽管 web2 创造了许多不可或缺的服务,如电子商务、数字银行、社交网络,但它也充斥着各种问题。例如,如今很大一部分网络流量和用户数据由少数几家大型科技公司拥有和控制。

这种对互联网基础设施的集中控制会产生包括审查制度、安全漏洞和用户数据盗窃、供应商锁定以及专利软件增加等问题。更何况,web2 平台从用户生成的内容和数据中榨取了更高的利润,却选择只把收入的一小部分留给用户。

Web2 的问题正是互联网的下一次迭代(web3)的必要性。通常被描述为互联网的可读、可写、可拥有的时代,web3 的目标是成为一个去中心化的、去信任的、开放的互联网演变——用户创造、拥有并从他们的内容中获利。

与 web2 不同,去中心化和可组合性是web3的核心。数字基础设施的去中心化控制可以防止审查,最大限度地减少对中央机构的信任,并防止腐败和不平等。此外,可组合性确保任何人都可以以无需许可的方式在他人的技术基础上进行构建。

这些特性——再加上其他改进,如提供原生支付层和自主身份——使 web3 在许多情况下都很有用。从去中心化金融 (DeFi)、去中心化自治组织 (DAO) 和不可替代代币 (NFT) 到去中心化身份和去中心化社交网络,web3 可以通过多种方式使用户受益。

 

什么是 Web3 技术栈?

技术栈是用于构建和管理应用程序或项目的技术和服务的集合。Web2 开发人员可能熟悉 LAMP 和 MEAN——这些术语指的是用于构建特定类别应用程序的软件栈。例如,使用 LAMP(Linux、Apache、MySQL 和 PHP)技术栈的开发人员通常会在构建应用程序时使用这些技术:

Linux 作为操作系统 (OS),用于管理应用程序中的内存和进程。

Apache 作为 Web 服务器,用于向不同的客户端提供数据(例如,提供一组 HTML 页面以响应来自用户浏览器的 URL 请求)。

MySQL 作为数据库管理系统,用于存储和查询应用程序的实时和历史数据。

PHP 作为编写服务器端功能脚本的编程语言,包括与 Web 服务器和数据库通信的组件。

Web2 技术栈的其他组件包括用于管理 UI/UX 的前端框架(例如 React 和 jQuery)、用于身份和访问管理的身份验证框架(例如 OAuth 和 Auth0)以及用于连接到技术栈中其他组件的 API 服务。这个列表并不详尽,但在我们着手定义 Web3 技术栈时提供了足够的背景。

定义 Web3 开发栈

对于 web3 来说,技术栈的概念没有明确定义(证明了该技术的新生特性)。此外,由于去中心化是 web3 的核心精神,因此技术栈中的组件充分去中心化非常重要——这使得 web3 技术栈与传统编程中的技术栈相比更加复杂。

尽管如此,web3 多年的持续发展和创新已经产生了一系列用于开发 web3 应用程序的不同工具。虽然 web3 开发栈与 web2 栈有一些相似之处(尤其是前端开发),但它与传统开发人员所熟悉的有很大不同。

所谓 “web3 开发栈”,我们指的是支持去中心化、可组合和去信任(或信任最小化)应用程序的技术组合。与其他编程栈一样,web3 栈包括编程语言、后端工具、前端框架、数据库基础设施和用于应用程序与其他系统通信的 API。

下一节将深入探讨 web3 栈的不同部分。在那里,您将了解 web3 栈的每个组件如何运作以及它们如何协同工作。

Web3 开发栈的组件

 

区块链

区块链可以被描述为一个分布式的数字账本,它将信息存储在加密链接的区块中。区块链是 web3 栈的基础组件,在使功能性 dapp 得以实现方面发挥着关键作用。

区块链作为状态机

区块链维护 web3 应用程序的状态,并将用户帐户和余额等信息存储在键值存储中。虽然类似于传统的数据库和服务器,但区块链有一些与众不同的特质:

1.没有实体控制读写操作。区块链是一种公共数据库——任何人都可以写入或读取。当人们将区块链描述为“去中心化”和“抗审查”时,通常意味着没有个人或团体来控制谁或是什么条件下可以与区块链交互。

虽然没有人控制读写操作,但确保只有有效信息写入该公共数据库仍然很重要——否则应用程序将执行无效信息。因此,区块链具有共识算法,允许点对点网络的参与者集体验证和确认区块链的状态。

2. 存储在区块链中的信息是可公开验证和可审计的。信息通过交易写入区块链。这些交易被分批写入区块(为了提高效率),每个区块的副本存储在一个大型节点网络(点对点网络中的参与者拥有的计算机)中。

该系统确保任何人都可以轻松访问区块链并验证信息,而无需相信区块链数据是有效的。这就是人们说区块链“去信任”或“信任最小化”时的意思。

3. 区块链数据不可篡改。除了由一组交易和时间戳组成外,每个区块还包含前一个区块的加密哈希(形成“链”)。随着时间的推移,更多的区块被创建和链接起来,旧区块中的数据变得非常难以修改。

要更改过去的数据,您还需要更改每个后续块的数据。但这很难实现,因为每个块都在数千台计算机(节点)之间复制。因此,我们认为区块链中的数据是不可变的并且可以抵抗修改。

区块链作为操作系统除了存储应用程序状态外,区块链还提供了一个执行层(通常是虚拟机)来运行嵌入在智能合约中的应用程序逻辑(稍后会详细介绍)。该执行层相当于 web2 开发栈中的操作系统 (OS)。

以太坊虚拟机 (EVM) 是 web3 应用程序运行时环境的一个示例。EVM 存储账户、余额、交易数据,以及最重要的智能合约代码。对于涉及特定 dapp 的每笔交易,应用程序的智能合约代码由以太坊节点执行——导致 EVM 全局状态发生变化。

基于区块链的虚拟机消除了开发人员管理后端基础设施(例如数据库或网络服务器)的需要。该任务由存储应用程序状态和代码的节点处理,并合作执行由应用程序用户触发的操作。这就是为什么区块链也被描述为“分布式计算平台”。

EVM 兼容 vs 非 EVM 区块链

虽然 EVM 是第一个引入可编程链上逻辑的,但它有几个限制——尤其是可扩展性和成本效益。一些区块链试图通过实施 EVM 的自定义变体来解决这个问题,同时优化架构以实现高速和低计算成本。这些被描述为与 EVM 兼容的区块链,具有与 EVM 工具和基础设施无缝集成的优势。因此,学习如何构建针对 EVM 的应用程序,可以让您将这些技能转移到除以太坊之外的其他生态系统中来构建 dapps。

 

除了执行层的差异,所有区块链都有一个原生代币(代币是代表资产或实现某种形式效用的价值单位)。需要这些代币来补偿节点的计算资源。区块链的代币也可以用作参与者保护和维护区块链基础设施的经济激励。

下表列出了当今使用的一些流行的(EVM 和非 EVM)区块链,包括:

 

智能合约

智能合约是在区块链执行层上运行的软件程序(任意代码块)。“智能合约”一词源于这些程序的不同性质。例如,智能合约对协议规则进行编码,并在满足预定义条件后执行这些规则。假设爱丽丝和鲍勃想在不依赖防止作弊的中介的情况下打赌。在这种情况下,获胜条件将被写入智能合约的规则中,只有在满足条件时才会将资金发放给获胜者。

 

因为智能合约存在于区块链上,所以合约条款(用代码行编写)是不可变的,并且结果是公开的——所有这些都不需要依赖中介来执行规则。此外,智能合约几乎可以自动执行,并显着降低人为错误或腐败的风险。

在 web3 技术栈中,智能合约可以被视为区块链应用程序的后端。传统应用程序由公司控制的后端服务器(物理或基于云)管理,而存储在区块链上的智能合约决定了 web3 应用程序的业务逻辑。但智能合约不仅仅是普通后端,它们是开放的、可组合的和公共的后端:

公共:智能合约存储在区块链中的特定位置(通过部署)。与存储在链上的其他信息一样,任何有权访问区块链节点的人都可以检查智能合约代码。没有隐藏的算法——可以检查每一行代码以确认 dapp 开发人员打算让应用程序做什么。

开放:一旦部署在网络上,任何能够向区块链提交交易的人都可以触发智能合约的逻辑。这使得 web3 不同于 web2,软件公司控制后端并决定谁可以或不能与应用程序交互。

可组合性:可组合性描述了修改、重用和组合现有软件组件以创建新应用程序的能力。作为在共享计算平台上的程序,智能合约默认是可组合的。智能合约可以在执行时触发其他合约中的特定逻辑,从而减少从头开始构建应用程序逻辑的每一部分的需要。

此外,智能合约代码通常是开源的。开源代码减少了对应用程序开发人员的信任,但更重要的是,它使开发人员能够相互借鉴彼此的成果。今天,您可以通过分叉流行的 web3 协议的代码库并为您的特定应用程序调整业务逻辑来快速创建 dapp。

智能合约编程语言

如果智能合约是代码块,web3 开发人员将需要学习编程语言来编写智能合约。幸运的是,有许多智能合约编程语言可供选择。
每种智能合约编程语言在工具的可用性、文档、生态系统支持、开发人员社区的规模、易用性和功能程度方面各不相同。您对智能合约编程语言的选择将取决于个别因素,例如您想要构建的区块链生态系统。

举个简单的例子,学习 Solidity 可以让您在为多个区块链构建 dapps 时处于有利地位。Solidity 是为 EVM 创建的。因此,其他 EVM 兼容的区块链支持使用它来编写智能合约。

下面是一个用 Solidity 编写的简单的“HelloWorld!” 智能合约:

 

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

contract HelloWorld {
    function sayHello() publicpure returns (string memory) {
        return"Hello World!";
    }
}

 

您还可以考虑其他因素,例如语言的流行度和易用性。例如,一些区块链允许用 Rust 编写智能合约,因为后者对 web2 开发人员来说更熟悉也更容易使用。程序示例:

下面是一个用 Rust 为 Solana VM 编写的简单的“HelloWorld!” 智能合约:

 

usesolana_program::{
    account_info::AccountInfo,
    entrypoint,
    entrypoint::ProgramResult,
    msg,
    pubkey::Pubkey,
};


entrypoint!(process_instruction);


fnprocess_instruction(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    instruction_data: &[u8],
) -> ProgramResult {
 
    msg!("Hello Solana! (From Rust!)");
    Ok(())
}

 

 

前端库

在软件开发中,前端架构控制着用户与应用程序的交互。因此,您会经常看到在应用程序的用户界面 (UI) 或 UX(用户体验)的上下文中描述的前端。

在大多数情况下,前端技术从 web2 到 web3 保持不变,开发人员依赖于众所周知的框架,如 HTML、CSS 和 JavaScript。React(一个 JavaScript 库)在为 web3 应用程序构建用户界面的开发人员中特别受欢迎。这种熟悉使得具有 web2 前端开发经验的开发人员更容易构建 dapp 前端。

然而,发生变化的是前端(客户端)与后端(基于区块链的智能合约)的通信方式。在常规的 web2 应用程序中,前端(例如 Web 应用程序 UI)使用请求-响应机制(通常是 HTTP)将用户请求传达给后端服务器。服务器接收请求,根据请求数据进行一些处理,然后将响应发送回客户端(通过前端)。

 


注意:虽然在 web2 中 web 应用程序的后端通常指的是服务器,但它也可以包括服务器可能与之通信以处理请求的所有底层组件——数据库(例如 MySQL 或 PostgreSQL)、键值存储 (例如,Redis),或持久文件存储(例如,MongoDB)。

在 web3 中,用户仍然(主要)通过使用 HTML、CSS 和 JavaScript 创建的前端与应用程序交互。但是,客户端在向 dapp 的后端(即基于区块链的智能合约)发送请求之前必须连接到一个节点(稍后会详细介绍)。此外,web3 应用程序中前端和后端之间的通信是通过自定义 JavaScript 库处理的,特别是 ethers.js 和 web3.js(用于与 EVM 兼容的区块链)。

Ethers.js 和 web3.js 提供用于处理 dapps 前端逻辑的实用程序,包括签署交易、获取用户余额、检索帐户信息、管理 web3 钱包等。这两个库还支持对区块链节点进行 RPC(远程过程调用)——使开发人员更容易读取和写入区块链。

 

 

下图描述了用户(客户端)尝试与 Web3 应用程序交互的典型工作流程。客户端将连接到一个节点,通常是通过像 Infura 这样的节点提供商,并提交一个请求(通过交易)触发特定的智能合约逻辑。该操作的结果可以通过区块链节点或区块浏览器获得。

 
除了 ethers.js 和 web3.js,您还会发现其他自定义 JavaScript 库,用于管理客户端与区块链的交互。以下是一些前端库,可用于为其他区块链上的 dapps 构建 UI 组件:

Blockchain

Frontend libraries

Solana 

Anchor, solana-web3.js

Polkadot (Substrate-based chains)

polkadot.js

NEAR

near-api-js

Cosmos

cosm.js

注意:web3 应用程序的前端存储在链下,不像智能合约那样存在于链上。由于链上计算非常昂贵,执行复杂的前端逻辑在经济上是不可行的。一些去中心化的 web3 原生解决方案越来越受欢迎,例如 Skynet Labs 的 Homescreen,但还没有行业标准。初始化 web3.js 并使用它来获取帐户列表:

 

const Web3 = require('web3');
const web3 = new Web3(Web3.givenProvider || 'ws//some.local-or-remote.node:8546');

web3.eth.getAccounts(console.log);
> ["0xd8da6bf26964af9d7eed9e03e53415d37aa96045","0x64ae4fD3E9906ee4A0189e3A393d19b3e35cdb67"]

 

节点和节点提供商

区块链架构中节点的定义有很多,但总的来说,节点是一台连接到区块链网络的计算机。例如,比特币节点通常会挖掘、存储和验证区块。在以太坊中,节点为 EVM 提供处理能力;它们还存储和执行智能合约代码、跟踪 EVM 状态、创建和验证新块等等。

RPC 端点

节点在区块链交互层运行,并提供对链上数据的访问。与任何区块链交互都需要连接到一个节点,您通常会使用 RPC 端点来实现。

根据定义,RPC 端点使开发人员能够使用远程过程调用与区块链进行通信。这基本上意味着有一些规则或特定的数据结构来促进通信。例如,您可以使用 JSON-RPC 规范发送交易、读取区块链数据以及执行其他有用的功能。这通常是通过在此规范之上构建的库从开发人员那里抽象出来的,例如 web3.js(我们之前讨论过)。

 

运行节点与使用节点提供商

因为大多数区块链基本上都是去中心化的,任何人(包括开发人员)都可以根据硬件要求运行一个节点。从理论上讲,网络中的节点越多,网络就越安全。拥有更多节点可以分散运营能力,提供更多参与者来帮助达成共识,并提高网络弹性。

然而,并不是每个人都有硬件或时间来致力于运行和维护自己的节点。特别是,开发人员可能会发现管理内部节点基础设施的成本太高或不可扩展。这就是我们随后讨论的节点提供商发挥作用的地方。

节点提供商区块链节点提供商通过为 web3 项目提供 API 和专用 RPC 端点,使开发人员可以轻松地与区块链进行交互。开发团队可以将此任务外包给节点提供商,并专注于为用户构建和改进产品,而不是将宝贵的资源浪费在维护节点硬件上。

节点提供商通常构建为基础设施即服务 (IaaS) 模型,并可根据需求轻松扩展。一些节点提供商还可能提供其他工具,例如软件开发工具包 (SDK) 和有用的 API,以简化团队的 web3 开发工作流程。

使用 Infura 获取地址余额:

const Web3 = require('web3');
const infuraURL = 'YOUR_INFURA_URL_HERE';
const web3 = new Web3(new Web3.providers.HttpProvider(infuraURL));

// Get current balance of address
const balance = await web3.eth.getBalance(address);

 

下面的列表重点介绍了一些流行的区块链节点提供商,以及有关支持的区块链和开发人员可用工具的更多信息:

 

API(索引和查询)

在传统的技术栈中,数据库以使应用程序能够有效使用数据的格式构建和组织数据。区块链以不同方式存储数据,更适合为基本读取操作返回信息。要执行复杂的排序/查询操作(例如构建索引和关系数据库),您需要管理昂贵的后端基础设施来缓存和同步数据。

这就是 The Graph、HAL 和 Moralis 等索引协议在构建 web3 应用程序中变得有用的地方。区块链索引器通过充当区块链和 dapp 之间的中间人,使数据查询变得简单高效。本质上,它们从区块链中提取信息,并允许您在应用程序中高效地查询/索引数据。

The Graph 在这种情况下非常流行,它允许任何人创建自定义和可公开访问的 API(subgraphs)来索引区块链数据。HAL 和 Moralis 还提供用于跟踪链上事件和过滤链上数据以查找特定 dapp 特定信息的实用程序。

从应用程序查询 Graph:

 

咨询我们的区块链专家

我们的全球解决方案团队提供区块链培训、战略咨询、实现服务和合作机会。

请与我们联系,了解更多资讯:wechat@consensys.net

 

 

...全文
1561 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
经典中的经典! 目 录 译者序 序 前言 第一部分 快速开发的基础 第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
这是2个压缩包中的第一个,请与第二个一并下载,然后随便解压其中一个即可。如果只想下载其中一部分,可下载pdf: http://download.csdn.net/detail/oqqsun12345678/5215337 这个pdf是665页中的前404页,后面200多页在: http://download.csdn.net/detail/oqqsun12345678/5215345 资料内容简介 出版日期: 2012年1月1日 《JavaServer Faces 2.0完全参考手册》针对javaserver faces(jsf)2.0中的变化进行了全面的修订与更新,涵盖了javeee的官方标准web开发架构的每个方面。在这本权威著作中,sun microsystems公司中的jsf合作规范领导者展示了如何创建动态的、跨浏览器的web应用程序,由于保留了较高质量的代码和可扩展性,这些应用程序可以给用户带来极为优秀的体验。 《JavaServer Faces 2.0完全参考手册》提供了一个综合的示例应用程序,可以将其用作您自己的jsf应用程序的模型。该示例应用程序的代码可以从网上下载。《JavaServer Faces 2.0完全参考手册》对所有jsf功能都进行了解释,包括请求处理生命周期、托管bean、页面导航、组件开发、ajax、验证器、国际化和安全。贯穿全书的专家组意见提供了关于jsf设计的内部信息。 推荐编辑 《JavaServer Faces 2.0完全参考手册》主要内容:搭建开发环境并构建JSF应用程序。理解JSF请求处理生命周期。使用Facelets视图声明语言、托管bean和JSF表达式语言(EL)。按照JSF导航模型声明一个页面,包括新的“隐式导航”功能。使用用户界面组件模型和JSF事件模型,包括支持可添加书签的页面以及POST、REDIRECT、GET模式。使用为模型数据验证设立的新的JSR-303bean验证标准。创建可以使用Ajax的定制用户界面组件。使用定制的非用户界面组件来扩展JSF。管理安全、可访问性、国际化和本地化。学会使用Liferay的JSF团队领导开发的JSF和Portlet,Liferay是处于领导地位的JavaPortal开发商。 全面介绍JSF2.0、详述如何使用Ajax,以及按照JSF2.0、的方式构建组件、快速理解众多可以直接运行的代码示例。 作者 作者:(美国)伯恩斯 (Ed Burns) (美国)沙尔克 (Chris Schalk) (美国)格里芬 (Neil Griffin) 译者:陶克 熊淑华 伯恩斯,Ed Burns是Sun Microsystems公司的高级主管工程师,此外还是JavaServer Faces共同规范的领导者。他与其他人合著了JavaServer Faces:The Complete Reference一书,并且是Secrets of the Rock Star Programmers一书的作者。 沙尔克,Chris Schalk是developer advocate,致力于提升Google的API和技术。他当前在国际化Web开发社区工作,主要研究新的Google App Engine和Open Social API。 格里芬,Neil Griffin是Liferay Portal的委员以及JSF开发团队领导者,并且是Portlet Faces项目的合作创始人。 目录 第I部分 javaserver faces框架 第1章 javaserver faces简介 1.1 什么是javaserver faces 1.2 javaserver faces的历史 1.2.1 公共网关接口 1.2.2 servletapi 1.2.3 java服务器页面 1.2.4 apachestruts 1.2.5 spring框架和springmvc 1.2.6 javaserverfaces的诞生 1.3 javaserver faces设计目标 1.4 jsf应用程序架构 1.4.1 jsf请求处理生命周期 1.4.2 jsf导航模型 第2章 构建一个简单的javaserver faces应用程序 2.1 应用程序概述 2.1.1 jsfreg应用程序文件 2.1.2 jsf软件栈 2.1.3 装配jsfreg应用程序 2.1.4 配置文件 2.1.5 facelets页面 2.2 构建和运行应用程序 2.3 应用程序关键部分 回顾 第3章 javaserver faces请求处理生命周期 3.1 jsf请求处理生命周期概述 3.1.1 请求处理生命周期的功能 3.1.2 与其他web技术的区别 3.1.3 服务器端视图的自动管理与同步 3.1.4 请求

725

社区成员

发帖
与我相关
我的任务
社区描述
ConsenSys是一家领先的以太坊和去中心化协议软件公司,我们的产品套件由Infura、Quorum、Codefi、MetaMask、Truffle、Diligence 和我们的NFT 平台组成。
区块链 企业社区
社区管理员
  • csdnsqst0035
  • Ashley0001
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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