值得指出的是在绝大多数数据库应用中 一般都是使用数据集部件TTable TQuery或TStoredProc与磁盘上的数据库进行连接 用TDataSource部件连接数据控制部件和数据集部件 当然用户也可以自定义数据集部件 用于数据库应用当中 TTable TQuery 和TStoredProc部件中都包含一个不可见的TField类型的对象Fields Fields是一个串列表 它对应于数据库表或一个查询结果的列或字段 Fields对象是伴随着TTable TQuery 和TStoredproc部件的活动状态动态地建立的 当数据库表被关闭时 Fields 对象也随之消失 它在程序设计和程序运行过程中都是不可见的
当然也可以利用Fields Editor建立永久性的Fields对象供Delphi应用程序使用 我们将在后面的内容中详细阐述
TTable部件
利用TTable部件程序设计人员甚至可以不需要编写任何程序便可对数据库进行访问 在一个应用程序窗体中放置一个TTable部件的过程如下
在部件选择板上选择Data Access页
单击Table图标
在窗体内单击鼠标 获得一个TTable部件
为TTable部件设置有关的属性
DatabaseName属性指定要访问的数据库所在的路径名 路径名可以用别名来表示
TableName属性指定要访问数据库中具体的数据库表
Active属性设置为True时 表示打开要访问的数据库表 设置为False时 暂时不打开要访问的数据库表
缺省情况下 TTtable部件中包含了要访问的数据库表中所有的字段和记录 用鼠标双击TTable图标时 会出现一个字段编辑器(Fields Editor) 使用Fields Editor可以对TTable部件中包含的数据库表中的字段的显示格式等属性进行编辑 具体可以控制
● 建立一个永久性的字段列表 包括字段的顺序 字段的类型等 即使磁盘上实际的数据库表的表结构发生了改变 我们建立的这个永久性的字段列表也不会发生改变
● 为每个字段指定一个便于阅读和使用的名字
● 指定字段显示的顺序
● 为每个字段指定一个用于显示的字符串
● 为字段增加合法性检验
● 为了显示的需要还可以建立新的字段(如可计算的字段)具体的使用方法见后面的内容
TQuery部件
TQuery部件是我们使用SQL语言开发数据库应用程序的有力工具 因为使用SQL语言 我们可以非常方便灵活地对一个或多个数据库表中的记录进行访问 所以利用TQuery我们可以查询本地的数据库如Pà?aradox和dBASE数据库系统中的数据 我们还可以使用TQuery部件对一个远地的数据库SQL服务器进行访问 建立Client/Server模式的应用程序
在一个应用程序窗体中放置一个TQuery部件的过程如下
在部件选择板上选择Data Access页
单击Query图标
在窗体内单击鼠标 获得一个TQuery部件
为TQuery部件设置有关的属性
DatabaseName属性指定将要访问的数据库的路径名
SQL属性指定对数据库表进行访问SQL语句 它可以是一条查询语句也可以是一条修改语句或插入语句等 在对象浏览器上 单击SQL属性时 会打开一个字符串编辑器供程序设计者输入SQL语句
在这里要注意在TQuery部件中 不是用TableName 属性来指定要访问的数据库中的数据库表 而是在SQL属性中 通过SQL语句来指定将要访问的数据库表
TDataSouece部件
TDataSource部件是连接数据集部件TTable TQuery TStoredProc 和数据控制部件TDBGrid TDBEdit等的桥梁 TTable TQuery TStoredProc部件通过BDE可以实现与磁盘上的数据库连接即访问 但它们本身不能显示数据库中的数据信息 而数据控制部件如TDBGrid TDBEdit等能够提供可视化的界面 显示数据库中的数据信息 但它们不具备访问磁盘数据库的能力 正是TDataSource将这两者有机地结合起来 使得用户才能交互地对数据库中的数据信息进行查询 修改 插入 删除等 *** 作
在应用程序窗体中放置TDataSource部件的过程如下
在部件选择板上选择Data Access页
单击DataSource图标
在窗体内单击鼠标 获得一个TDataSource部件
为TDataSource部件设置有关的属性
Dataset属性指定一个数据集部件 可以是TTable TQuery或TStoredProc部件的名字
返回目录 DELPHI基础教程
编辑推荐
Java程序设计培训视频教程
J EE高级框架实战培训视频教程
Visual C++音频/视频技术开发与实战
Oracle索引技术
ORACLE G数据库开发优化指南
Java程序性能优化 让你的Java程序更快 更稳定
C嵌入式编程设计模式
Android游戏开发实践指南
lishixinzhi/Article/program/Delphi/201311/25181
由于分布式系统所涉及到的领域众多,知识庞杂,很多新人在最初往往找不到头绪,不知道从何处下手来一步步学习分布式架构。
本文试图通过一个最简单的、常用的分布式系统,来阐述分布式系统中的一些基本问题。
负载均衡
分布式缓存
分布式文件系统/CDN
分布式RPC
分布式数据库/Nosql
分布式消息中间件
分布式session问题
-总结
下图为一个中大型网站/App的基本架构:
在这个架构中,涉及到以上所列的基本问题:
负载均衡
负载均衡是分布式系统中的一个最最基本的问题。在上图中:
网关需要把请求分发给不同的Tomcat;
Tomcat需要把收到的请求,分发给不同的Service;
这都需要负载均衡。一句话:凡是请求从一个入口进来,需要分发给后端不同的机器时,就需要负载均衡。
局域网负载均衡
在上图中,负载均衡发生在局域网内部。在这里,常用的网关软件有Nginx/HAProxy/F5/LVS/各种云上的SLB等。
广域网负载均衡
在上图之外,还有广域网负载均衡。这通常发生在域名服务器上,而不是局域网内部。
同1个域名,映射到不同的局域网集群。
负载均衡算法
常用的负载均衡算法:随机,轮询(Round Robin),最小资源数,hash。
分布式缓存
在上图中,当DB负载过高,我需要为Service机器加缓存时,就遇到一个基本问题:
如果使用local的内存做缓存,则其他Service机器就没办法共用此缓存。
因次,我需要一个可以让所有Service机器共享的缓存,这就是分布式缓存。
常用的分布式缓存组件:Memcached/Redis/Tair等
分布式文件系统
在上图中,当我要存储客户端上传的文件时,就会遇到另一个基本问题:我不能把存在每个Tomcat的本地文件系统里面,这样的话,其他机器就没办法访问了。我需要一个让所有机器可以共享的文件系统,这就是分布式文件系统。
常用的分布式文件系统:MogileFS/TFS/HDFS/Amazon S3/OpenStack Swift等
当使用了分布式文件系统,对外提供url访问服务时,就会遇到另一个基本问题:如果每次文件的访问,都要到分布式文件系统里面去取,效率和负载就可能成为问题。
为此,就需要引入CDN。
常用的CDN厂商,比如ChinCache。当然,现在的各种云存储,比如七牛云,阿里云,腾讯云,已经自带了CDN。
分布式RPC
分布式系统的一个基本问题就是:机器与机器之间如何通信? 我们都知道底层原理是TCP/IP,Socket。
但一般很少有人会去裸写Socket,实现机器之间的通信。这里,最常用的组件就是RPC。
最简单的实现RPC的方式就是使用>
在RPC内部,一般都自己实现了负载均衡。还有更复杂的,如多版本,服务降级等。
补充一句:虽然底层原理都是Socket,但使用不同框架/组件时,通常都有其自己的跨机器通信方式,比如Mysql JDBC,RPC, 消息中间件等。
分布式数据库
在上图中,DB是单一节点。当访问量达到一定程度,就会涉及到Mysql的分库分表问题。
分库/分表之后,就会涉及到join的问题,分布式事务的问题。
关于分库分表,业界也早有成熟方案。对上层屏蔽分库分表,sql的执行,像是在单库一样。
还有像MongoDB这种Nosql数据库,天生是分布式的。但同样会面对Mysql分库分表所要面对的问题。
还有像阿里的OceanBase,有Mysql的强一致性保证,又是分布式的,还可以支持分布式事务。
分布式消息中间件
在上图中,没有提及到消息中间件。相对其他基本问题,这个需要一个更适合的业务场景来谈,在以后的章节中,会再详述。
常用的消息中间件,比如老一辈的ActiveMQ/RabbitMQ, 新一点的,阿里的RocketMQ,LinkedIn的Kafka等。
消息中间件的一个典型场景就是:通过最终一致性,解决上面的分布式事务问题。
分布式session问题
在传统的单机版应用中,我们经常使用session。而当单机扩展到多机,单机的session就没办法被其他机器所访问。
此时就需要使用分布式session,把session存放在一个所有Tomcat都可以访问的地方。
关于分布式session,业界早有成熟方案,在此不再详述。
总结
本文罗列了分布式系统的各种基本问题和业界常用的技术,希望建立起分布式系统的一个宏观图谱。
计算机语言的种类非常的多,总的来说可以分成机器语言,汇编语言,高级语言三大类。
电脑每做的一次动作,一个步骤,都是按照以经用计算机语言编好的程序来执行的,程序是计算机要执行的指令的集合,而程序全部都是用我们所掌握的语言来编写的。所以人们要控制计算机一定要通过计算机语言向计算机发出命令。
计算机所能识别的语言只有机器语言,即由0和1构成的代码。但通常人们编程时,不采用机器语言,因为它非常难于记忆和识别。
目前通用的编程语言有两种形式:汇编语言和高级语言。
汇编语言的实质和机器语言是相同的,都是直接对硬件 *** 作,只不过指令采用了英文缩写的标识符,更容易识别和记忆。它同样需要编程者将每一步具体的 *** 作用命令的形式写出来。汇编程序通常由三部分组成:指令、伪指令和宏指令。汇编程序的每一句指令只能对应实际 *** 作过程中的一个很细微的动作,例如移动、自增,因此汇编源程序一般比较冗长、复杂、容易出错,而且使用汇编语言编程需要有更多的计算机专业知识,但汇编语言的优点也是显而易见的,用汇编语言所能完成的 *** 作不是一般高级语言所能实现的,而且源程序经汇编生成的可执行文件不仅比较小,而且执行速度很快。
高级语言是目前绝大多数编程者的选择。和汇编语言相比,它不但将许多相关的机器指令合成为单条指令,并且去掉了与具体 *** 作有关但与完成工作无关的细节,例如使用堆栈、寄存器等,这样就大大简化了程序中的指令。同时,由于省略了很多细节,编程者也就不需要有太多的专业知识。
高级语言主要是相对于汇编语言而言,它并不是特指某一种具体的语言,而是包括了很多编程语言,如目前流行的VB、VC、FoxPro、Delphi等,这些语言的语法、命令格式都各不相同。
高级语言所编制的程序不能直接被计算机识别,必须经过转换才能被执行,按转换方式可将它们分为两类:
解释类:执行方式类似于我们日常生活中的“同声翻译”,应用程序源代码一边由相应语言的解释器“翻译”成目标代码(机器语言),一边执行,因此效率比较低,而且不能生成可独立执行的可执行文件,应用程序不能脱离其解释器,但这种方式比较灵活,可以动态地调整、修改应用程序。
编译类:编译是指在应用源程序执行之前,就将程序源代码“翻译”成目标代码(机器语言),因此其目标程序可以脱离其语言环境独立执行,使用比较方便、效率较高。但应用程序一旦需要修改,必须先修改源代码,再重新编译生成新的目标文件(*OBJ)才能执行,只有目标文件而没有源代码,修改很不方便。现在大多数的编程语言都是编译型的,例如VisualC++、VisualFoxpro、Delphi等。
学习编程,从何入手
如果您想学习编程,却又不知从何入手,那么您不妨看看下面的几种学习方案,可能会给您一些启示吧!
方案一Basic语言&VisualBasic
优点
(1)Basic简单易学,很容易上手。
(2)VisualBasic提供了强大的可视化编程能力,可以让你轻松地做出漂亮的程序。
(3)众多的控件让编程变得象垒积木一样简单。
(4)VisualBasic的全部汉化让我们这些见了English就头大的人喜不自禁。
缺点
(1)VisualBasic不是真正的面向对象的开发文具。
(2)VisualBasic的数据类型太少,而且不支持指针,这使得它的表达能力很有限。
(3)VisualBasic不是真正的编译型语言,它产生的最终代码不是可执行的,是一种伪代码。它需要一个动态链接库去解释执行,这使得VisualBasic的编译速度大大变慢。
综述:方案一适合初涉编程的朋友,它对学习者的要求不高,几乎每个人都可以在一个比较短的时间里学会vB编程,并用VB做出自己的作品。对于那些把编程当做游戏的朋友来说,VB是您最佳的选择。
方案二Pascal语言&Delphi
优点
(1)Pascal语言结构严谨,可以很好地培养一个人的编程思想。
(2)Delphi是一门真正的面向对象的开发工具,并且是完全的可视化。
(3)Delphi使用了真编译,可以让你的代码编译成为可执行的文件,而且编译速度非常快。
(4)Delphi具有强大的数据库开发能力,可以让你轻松地开发数据库。
缺点
Delphi几乎可以说是完美的,只是Pascal语言的过于严谨让人感觉有点烦。
综述:方案二比较适合那些具有一定编程基础并且学过Pascal语言的朋友。
方案三C语言&VisualC
优点
(1)C语言灵活性好,效率高,可以接触到软件开发比较底层的东西。
(2)微软的MFC库博大精深,学会它可以让随心所欲地进行编程。
(3)VC是微软制作的产品,与 *** 作系统的结合更加紧密。
缺点
对使用者的要求比较高,既要具备丰富的C语言编程经验,又要具有一定的WINDOWS编程基础,它的过于专业使得一般的编程爱好者学习起来会有不小的困难。
综述:VC是程序员用的东西。如果你是一个永不满足的人,而且可以在编程上投入很大的精力和时间,那么学习VC你一定不会后悔的。
C语言简介
方案四C语言&CBuilder
优点
(1)C语言的优点全部得以继承。
(2)完全的可是化。
(3)极强的兼容性,支持OWL、VCL和MFC三大类库。
(4)编译速度非常快。
缺点
由于推出的时间太短,关于它的各种资料还不太多。
综述:我认为CBuilder是最好的编程工具。它既保持了C语言编程的优点,又做到了完全的可视化。
方案五SQL语言&PowerBuilder
对于一些传统的数据开发人员来说,Foxpro系列也许让他们感到更加熟悉。但是对于初学者来说,也许是最好的数据库开发工具。各种各样的控件,功能强大的语言都会帮助你开发出自己的数据库应用程序。
JSP简介
在Sun正式发布JSP(JavaServerPages)之后,这种新的Web应用开发技术很快引起了人们的关注。JSP为创建高度动态的Web应用提供了一个独特的开发环境。按照Sun的说法,JSP能够适应市场上包括ApacheWebServer、IIS40在内的85%的服务器产品。
JSP与ASP的简单比较
JSP与Microsoft的ASP技术非常相似。两者都提供在HTML代码中混合某种程序代码、由语言引擎解释执行程序代码的能力。在ASP或JSP环境下,HTML代码主要负责描述信息的显示样式,而程序代码则用来描述处理逻辑。普通的HTML页面只依赖于Web服务器,而ASP和JSP页面需要附加的语言引擎分析和执行程序代码。程序代码的执行结果被重新嵌入到HTML代码中,然后一起发送给浏览器。ASP和JSP都是面向Web服务器的技术,客户端浏览器不需要任何附加的软件支持。
ASP的编程语言是VBScript之类的脚本语言,JSP使用的是Java,这是两者最明显的区别。
此外,ASP与JSP还有一个更为本质的区别:两种语言引擎用完全不同的方式处理页面中嵌入的程序代码。在ASP下,VBScript代码被ASP引擎解释执行;在JSP下,代码被编译成Servlet并由Java虚拟机执行,这种编译 *** 作仅在对JSP页面的第一次请求时发生。
运行环境
执行JSP代码需要在服务器上安装JSP引擎。此处我们使用的是Sun的JavaServerWebDevelopmentKit(JSWDK)。为便于学习,这个软件包提供了大量可供修改的示例。安装JSWDK之后,只需执行startserver命令即可启动服务器。在默认配置下服务器在端口8080监听,使用localhost:8080即可打开缺省页面。
在运行JSP示例页面之前,请注意一下安装JSWDK的目录,特别是"work"子目录下的内容。执行示例页面时,可以在这里看到JSP页面如何被转换成Java源文件,然后又被编译成class文件(即Servlet)。JSWDK软件包中的示例页面分为两类,它们或者是JSP文件,或者是包含一个表单的HTML文件,这些表单均由JSP代码处理。与ASP一样,JSP中的Java代码均在服务器端执行。因此,在浏览器中使用"查看源文件"菜单是无法看到JSP源代码的,只能看到结果HTML代码。所有示例的源代码均通过一个单独的"examples"页面提供。
JavaServlet是一种开发Web应用的理想构架。JSP以Servlet技术为基础,又在许多方面作了改进。JSP页面看起来象普通HTML页面,但它允许嵌入执行代码,在这一点上,它和ASP技术非常相似。利用跨平台运行的JavaBean组件,JSP为分离处理逻辑与显示样式提供了卓越的解决方案。JSP必将成为ASP技术的有力竞争者。
SQL语言简介
SQL全称是“结构化查询语言(StructuredQueryLanguage)”,最早的是IBM的圣约瑟研究实验室为其关系数据库管理系统SYSTEMR开发的一种查询语言,它的前身是SQUARE语言。SQL语言结构简洁,功能强大,简单易学,所以自从IBM公司1981年推出以来,SQL语言,得到了广泛的应用。如今无论是像Oracle,Sybase,Informix,SQLserver这些大型的数据库管理系统,还是像VisualFoxporo,这些微机上常用的数据库开发系统,都支持SQL语言作为查询语言。
StructuredQueryLanguage包含4个部分:
数据查询语言DQL-DataQueryLanguageSELECT
数据 *** 纵语言DQL-DataLanguageINSERT,UPDATE,DELETE
数据定义语言DQL-DataDefinitionLanguageCREATE,ALTER,DROP
数据控制语言DQL-DataControlLanguageCOMMITWORK,ROLLBACKWORK
SQL的历史
在70年代初,EECodd首先提出了关系模型。70年代中期,IBM公司在研制SYSTEMR关系数据库管理系统中研制了SQL语言,最早的SQL语言(叫SEQUEL2)是在1976年11月的IBMJournalofR&D上公布的。
SQL的优点
SQL广泛地被采用正说明了它的优点。它使全部用户,包括应用程序员、DBA管理员和终端用户受益非浅。
(1)非过程化语言
SQL是一个非过程化的语言,因为它一次处理一个记录,对数据提供自动导航。SQL允许用户在高层的数据结构上工作,而不对单个记录进行 *** 作,可 *** 作记录集。所有SQL语句接受集合作为输入,返回集合作为输出。SQL的集合特性允许一条SQL语句的结果作为另一条SQL语句的输入。SQL不要求用户指定对数据的存放方法。这种特性使用户更易集中精力于要得到的结果。所有SQL语句使用查询优化器,它是RDBMS的一部分,由它决定对指定数据存取的最快速度的手段。查询优化器知道存在什么索引,哪儿使用合适,而用户从不需要知道表是否有索引,表有什么类型的索引。
(2)统一的语言
SQL可用于所有用户的DB活动模型,包括系统管理员、数据库管理员、应用程序员、决策支持系统人员及许多其它类型的终端用户。基本的SQL命令只需很少时间就能学会,最高级的命令在几天内便可掌握。SQL为许多任务提供了命令,包括:
查询数据
在表中插入、修改和删除记录
建立、修改和删除数据对象
控制对数据和数据对象的存取
保证数据库一致性和完整性
以前的数据库管理系统为上述各类 *** 作提供单独的语言,而SQL将全部任务统一在一种语言中。
(3)是所有关系数据库的公共语言
由于所有主要的关系数据库管理系统都支持SQL语言,用户可将使用SQL的技能从一个RDBMS转到另一个。所有用SQL编写的程序都是可以移植的。
Java语言简介
一Java的由来
当1995年SUN推出Java语言之后,全世界的目光都被这个神奇的语言所吸引。那么Java到底有何神奇之处呢
Java语言其实最是诞生于1991年,起初被称为OAK语言,是SUN公司为一些消费性电子产品而设计的一个通用环境。他们最初的目的只是为了开发一种独立于平台的软件技术,而且在网络出现之前,OAK可以说是默默无闻,甚至差点夭折。但是,网络的出现改变了OAK的命运。
在Java出现以前。Internet上的信息内容都是一些乏味死板的HTML文档。这对于那些迷恋于WEB浏览的人们来说简直不可容忍。他们迫切希望能在WEN中看到一些交互式的内容,开发人员也极希望能够在WEB上创建一类无需考虑软硬件平台就可以执行的应用程序,当然这些程序还要有极大的安全保障。对于用户的这种要求,传统的编程语言显得无能为力,面SUN的工程师敏锐地察觉到了这一点,从1994年起,他们开始将OAK技术应用于WEB上,并且开发出了HotJava的第一个版本。当SUN公司1995年正式以Java这个名字推出的时候,几乎所有的WEB开发人员都想到:噢,这正是我想要的。于是Java成了一颗耀眼的明星,丑小鸭一下了变成了白天鹅。
二Java的定义
Java是一种简单的,面象对象的,分布式的,解释的,键壮的安全的,结构的中立的,可移植的,性能很优异的多线程的,动态的语言。
Java的开发环境有不同的版本,如sun公司的JavaDevelopersKit,简称JDK。后来微软公司推出了支持Java规范的MicrosoftVisualJJava开发环境,简称VJ。
三Java的特点
1平台无关性
平台无关性是指Java能运行于不同的平台。Java引进虚拟机原理,并运行于虚拟机,实现不同平台的Java接口之间。使用Java编写的程序能在世界范围内共享。Java的数据类型与机器无关,Java虚拟机(JavaVirtualMachine)是建立在硬件和 *** 作系统之上,实现Java二进制代码的解释执行功能,提供于不同平台的接口的。
2安全性
Java的编程类似C,学习过C的读者将很快掌握Java的精髓。Java舍弃了C的指针对存储器地址的直接 *** 作,程序运行时,内存由 *** 作系统分配,这样可以避免病毒通过指针侵入系统。Java对程序提供了安全管理器,防止程序的非法访问。
3面向对象
Java吸取了C面向对象的概念,将数据封装于类中,利用类的优点,实现了程序的简洁性和便于维护性。类的封装性、继承性等有关对象的特性,使程序代码只需一次编译,然后通过上述特性反复利用。程序员只需把主要精力用在类和接口的设计和应用上。Java提供了众多的一般对象的类,通过继承即可使用父类的方法。在Java中,类的继承关系是单一的非多重的,一个子类只有一个父类,子类的父类又有一个父类。Java提供的Object类及其子类的继承关系如同一棵倒立的树形,根类为Object类,Object类功能强大,经常会使用到它及其它派生的子类。
4分布式
Java建立在扩展TCP/IP网络平台上。库函数提供了用>
5键壮性
Java致力于检查程序在编译和运行时的错误。类型检查帮助检查出许多开发早期出现的错误。Java自已 *** 纵内存减少了内存出错的可能性。Java还实现了真数组,避免了覆盖数据的可能。这些功能特征大大提高了开发Java应用程序的周期。Java提供:Null指针检测、数组边界检测、异常出口、Bytecode校验。
四Java与C/C语言
Java提供了一个功能强大语言的所有功能,但几乎没有一点含混特征。C安全性不好,但C和C被大家接受,所以Java设计成C形式,让大家很容易学习。
Java去掉了C语言的许多功能,让Java的语言功能很精炼,并增加了一些很有用的功能,如自动收集碎片。
Java去掉了以下几个C和C功能:
指针运算
结构
typedefs
#define
需要释放内存
这将减少了平常出错的50%。而且,Java很小,整个解释器只需215K的RAM。
面象对象:Java实现了C的基本面象对象技术并有一些增强,(为了语言简单,删除了一些功能)。Java处理数据方式和用对象接口处理对象数据方式一样。
五Java与Internet
我们知道,早先的>
Java并不是为Internet,>
Java程序和它的浏览器HotJava,提供了可让你的浏览器运行程序的方法。你能从你的浏览器里直接播放声音。你还能播放页面里的动画。Java还能告诉你的浏览器怎样处理新的类型文件。当我们能在2400baud线上传输视频图象时,HotJava将能显示这些视频。
当今Internet的一大发展趋势是电子商务,而Internet的安全问题是必须解决的问题,通常大的部门应设置防火墙,阻止非法侵入。
电子商务是当今的热门话题,然而传统的编程语言难以胜任电子商务系统,电子商务要求程序代码具有基本的要求:安全、可靠、同时要求能与运行于不同平台的机器的全世界客户开展业务。Java以其强安全性、平台无关性、硬件结构无关性、语言简洁同时面向对象,在网络编程语言中占据无可比拟的优势,成为实现电子商务系统的首选语言。
Java程序被放置在Internet服务器上,当用户访问服务器时,Java程序被下载到本地的用户机上,由浏览器解释运行。
Delphi简介
Delphi这个名字源于古希腊的城市名。它集中了第三代语言的优点。以ObjectPascal为基础,扩充了面向对象的能力,并且完美地结合了可视化的开发手段。Delphi自1995年3月一推出就受到了人们的关注,并在当年一举夺得了多项大奖。
Delphi的出现打破了V承可视化编程领域一统天下的局面。并且Delphi使用了本地编译器直接生成技术,使程序的执行性能远远高于其它产品生成的程序。它还是真正的面向对象的编程语言。PASCAL语言的严谨加上可视化的优势和强大的数据库功能使得它有充分的资本和微软的VB叫板。许多人当时都认为Pascal是最有前途的程序设计语言,并预测Delphi将会成为可视化编程的主流环境。
Delphi在你编好程序后自动转换成EXE文件它运行时速度比VB快,而且编译后不需要其他的支持库就能运行。它的数据库功能也挺强的,是开发中型数据库软件理想的编程工具。Delphi适用于应用软件、数据库系统、系统软件等类型的开发。而且它拥有和VB差不多一样的功能,而且一样能应用API函数,这在控制Windows很有用。
Delphi是全新的可视化编程环境,为我们提供了一种方便、快捷的Windows应用程序开发工具。它使用了MicrosoftWindows图形用户界面的许多先进特性和设计思想,采用了d性可重复利用的完整的面向对象程序语言(Object-OrientedLanguage)、当今世界上最快的编辑器、最为领先的数据库技术。对于广大的程序开发人员来讲,使用Delphi开发应用软件,无疑会大大地提高编程效率,而且随着应用的深入,您将会发现编程不再是枯燥无味的工作——Delphi的每一个设计细节,都将带给您一份欣喜。
Delphi的基本形式
Delphi实际上是Pascal语言的一种版本,但它与传统的Pascal语言有天壤之别。一个Delphi程序首先是应用程序框架,而这一框架正是应用程序的“骨架”。在骨架上即使没有附着任何东西,仍可以严格地按照设计运行。您的工作只是在“骨架”中加入您的程序。缺省的应用程序是一个空白的窗体(form),您可以运行它,结果得到一个空白的窗口。这个窗口具有Windows窗口的全部性质:可以被放大缩小、移动、最大最小化等,但您却没有编写一行程序。因此,可以说应用程序框架通过提供所有应用程序共有的东西,为用户应用程序的开发打下了良好的基础。
Delphi已经为您做好了一切基础工作——程序框架就是一个已经完成的可运行应用程序,只是不处理任何事情。您所需要做的,只是在程序中加入完成您所需功能的代码而已。在空白窗口的背后,应用程序的框架正在等待用户的输入。由于您并未告诉它接收到用户输入后作何反应,窗口除了响应Windows的基本 *** 作(移动、缩放等)外,它只是接受用户的输入,然后再忽略。
⑵ 定义处理过程类型
一旦你决定产生事件 就要定义事件如何被处理 这就是要决定事件处理过程的类型 在大多数情况下 定义的事件处理过程的类型是简单的通知类型(TNotifyEvent)和已定义的事件类型
通知事件只是告诉你特定的事件发生了 而没有描述什么时候和什么地方 通知事件使用时只带一个TObject类型的参数 该参数是Sender 然而所有通知事件的处理过程都知道是什么样的事件发生和发生在那个部件 例如 Click事件是通知类型 当编写Click事件的处理过程时 你知道的是Click事件发生和哪个部件被点按了 通知事件是单向过程 没有提供反馈机制
在某些情况下 只知道什么事件发生和发生在那个部件是不够的 如果按键事件发生 事件处理过程往往要知道用户按了哪个键 在这种情况下 需要事件处理过程包含有关事件的必要信息的参数 如果事件产生是为了响应消息 那么传递给事件的参数最好是直接来自消息参数
因为所有事件处理过程都是过程 所以从事件处理过程中返回信息的唯一方法是通过var参数 自定义部件可以用这些信息决定在用户事件处理过程执行后是否和怎样处理事件
例如 所有的击键事件(OnKeyDown OnKeyUp和OnKeyPressed)通过名为key的var参数传递键值 为了使应用程序看见包含在事件中的不同的键 事件处理过程可以改变key变量值
⑶ 声明事件
一旦你决定了事件处理过程的类型 你就要准备声明事件的方法指针和属性 为了让用户易于理解事件的功能 应当给事件一个有意义的名字 而且还要与部件中相似的属性的名称保持一致
Delphi中所有标准事件的名称都以 On 开头 这只是出于方便 编译器并不强制它 Object Inspector是看属性类型来决定属性是否是事件 所有的方法指针属性都被看作事件 并出现在事件页中
⑷ 调用事件
一般说来 最好将调用集中在事件上 就是说在部件中创建一个虚方法来调用用户的事件处理过程和提供任何缺省处理 当调用事件时 应考虑以下两点
● 必须允许空事件
● 用户能覆盖缺省处理
不能允许使空事件处理过程产生错误的情况出现 就是说 自定义部件的正常功能不能依赖来自用户事件处理过程的响应 实际上 空事件处理过程应当产生与无事件处理过程一样的结果
部件不应当要求用户以特殊方式使用它们 既然一个空事件处理过程应当与无事件处理过程一样动作 那么调用用户事件处理过程的代码应当象这样
if Assigned(OnClick) then OnClick(Self)
{ 执行缺省处理 }
而不应该有这样的代码
if Assigned(OnClick) then
OnClick(Self)
else
… { 执行缺省处理 }
对于某些种类的事件 用户可能想取代缺省处理甚至删除所有的响应 为支持用户实现这种功能 你需要传递var参数给事件处理过程 并在事件处理过程返回时检测某个值 空事件处理过程与无事件处理过程有相同作用 因为空事件处理过程不会改变任何var参数值 所以缺省处理总是在调用空事件处理过程后发生
例如在处理Key Press事件 用户可以通过将var参数key的值设置为空字符(# )来压制部件的缺省处理 代码如下
if Assigned(OnkeyPress) then OnkeyPress(Self key)
if key <> # then { 执行缺省处理 } ;
实际的代码将与这稍有不同 因为它只处理窗口消息 但处理逻辑是相同的 在缺省情况下 部件先调用任何用户赋予的事件处理过程 然后执行标准处理 如果用户的事件处理过程将key设为空 则部件跳过缺省处理
处理消息
在传统Windows编程中 一个很关键的方面是处理Windows发送给应用程序的消息 Delphi已经帮你处理了大多数的普通消息 但是在创建部件的过程中有可能Delphi没有处理方法 得由自己处理消息 也可能创建了新的消息需要处理它们
学习掌握Delphi的消息处理 要掌握以下三个方面
● 理解消息处理系统
● 修改(改变)消息处理方法
● 建立新的消息处理方法
理解消息处理系统
所有的Delphi对象内部具有处理消息的机制 如调用消息处理方法或消息处理过程 消息处理的基本思想是对象接收某种消息并派送它们 这是通过调用与接收的消息相应的方法来实现的 如果没有相应于消息的指定的方法 那就调用缺省处理 下面的图解表示消息派送系统
Delphi部件库定义了将所有Windows消息(包括用户自定义消息)直接转换到对象方法调用的消息派送系统 一般没有必要改变这种消息派送系统 只要建立消息处理方法
⑴Windows消息中有什么?
Windows消息是包含若干有用的域的数据记录 记录中最重要的是一个整型大小的值 该值标识消息 Windows定义了大量的消息 库单元Messages声明了所有消息的标识 消息中其它的有用信息包括两个域参数和结果域 两个参数分别是 位和 位的 Windows代码总是以wParam和lParam来引用它们
最初 Windows程序员不得不记住包含的每一个参数 现在 微软公司已经命名了这参数 这样理解伴随这些消息的信息就更简单了 例如 WM_KEYDOWN消息的参数被称为vkey和keydata 这就比wParam和lParam给出了更多的描述信息
Delphi为不同类型的消息定义了指定的记录类型 如鼠标消息在long参数中传递鼠标事件的x y座标 一个在高字 一个在低字 使用鼠标消息记录 你不需要自己关心哪个字是哪个座标 因为引用这些参数时通过名子Xpos和Ypos取代了lParamLo和lParamHi
⑵ 派送方法
当应用程序创建窗口时 在Windows Kernel中注册了一个窗口过程 窗口过程是处理窗口消息的函数 传统上 窗口过程包括了Case表达式 表达式的每个入口是窗口要处理的每一条消息 当你每次创建窗口时 必须建立完整的窗口过程
Delphi在下列三方面简化了消息派送
● 每个部件继承了完整的消息派送系统
● 派送系统具有缺省处理 用户只需定义想响应的消息的处理方法
● 可以修改消息处理的一部分 依靠继承的方法完成大多数处理
这种消息派送系统的最大优点是用户能在任何时候安全地发送任何消息给任何部件 如果部件没有为该消息定义处理方法 那缺省处理方法会解决这个问题 通常是忽略它
Delphi为应用程序每种类型的部件注册了名为MainWndProc的方法作为窗口过程 MainWndProc包含了异常处理块 它完成从Windows到名为WndProc的虚方法传送消息记录 并且通过调用应用程序对象的HandleException方法处理异常
MainWndProc是静态方法 没有包含任何消息的指定处理方法 定制过程发生在WndProc中 因为每个部件类型都能覆盖该方法以适合特定的需要
WndProc方法为每个影响它们处理的任何条件进行检查 以捕捉不要的消息 例如 当被拖动时 部件忽略键盘事件 因此 inControl的WndProc只在没有拖动时传送键盘事件 最后WndProc调用Dispatch方法 该方法是从TObject继承来的静态方法 决定什么方法来处理消息
Dispatch使用消息记录的Msg域来决定怎样派送特定消息 如果部件已经给该消息定义了处理方法 则Dispatch调用该方法 反之 Dispatch调用缺省处理方法
改变消息处理方法
在改变自定义部件的消息处理方法之前 先要弄清楚你真正想要做什么 Delphi将大多数的Windows消息转换成部件编写者和部件用户都能处理的事件 一般来说 你应当改变事件处理行为而不是改变消息处理行为
为了改变消息处理行为 要覆盖消息处理方法 也能提供捕获消息防止部件处理该消息
⑴ 覆盖处理方法
为了改变部件处理特定消息的方法 要覆盖那个消息的处理方法 如果部件不处理该消息 你就需要声明新的消息处理方法
为了覆盖消息处理方法 要在部件中以相同的消息索引声明新的方法 不要使用override指令 你必须使用Message指令和相应的消息索引
例如 为了覆盖一个处理WM_PAINT消息的方法 你要重声明WMPaint方法
type
TMyComponent=class(…)
procedure WMPaint(var Message: MPaint) message WM_PAINT;
end;
⑵ 使用消息参数
在消息处理方法内部 自定义部件访问消息记录的所有参数 因为消息总是var参数 如果需要的话 事件处理过程可以改变参数的值 Result域是经常改变的参数 Result是Windows文档中所指的消息的返回值 由SendMessage返回
因为消息处理方法的消息参数的类型随着被处理的消息的变化而变化 所以应当参考Windows消息文档中的参数的名字和含义 如果出于某种原因要使用旧风格的消息参数(wParam lParam) 可以配合通用类型TMessage来决定Message
⑶ 捕获消息
在某种情况下 你可能希望自定义部件能忽略某种消息 就是说 阻止部件将该消息派送给它的处理方法 为了那样来捕获消息 可以覆盖虚方法WndProc
WndProc方法在将消息传给Dispatch方法前屏蔽该消息 它依次决定哪一个方法来处理消息 通过覆盖WndProc 部件得到了派送消息之前过滤它们的机会
通常 象下面这样覆盖WndProc:
procedure TMyControl WndProc(var Message: TMessage)
begin
{ 决定是否继续处理过程 }
inherited WndProc (Message)
end;
下面的代码是TControl的WndProc的一部分 TControl定义整个范围内的鼠标消息 当用户拖动和放置控制时 它们将被滤过
procedure TControl WndProc(var Message:TMessage)
begin
if (Message Msg >= WM_MOVSEFIRST) and
(Message Msg <= WM_MOUSELAST) then
if Dragging then
DragMouseMsg(MMOUSE(Message)) { 处理拖动 }
else
… { 正常处理其它 }
… { 否则正常处理 }
end;
返回目录 DELPHI基础教程
编辑推荐
Java程序设计培训视频教程
J EE高级框架实战培训视频教程
Visual C++音频/视频技术开发与实战
Oracle索引技术
ORACLE G数据库开发优化指南
Java程序性能优化 让你的Java程序更快 更稳定
C嵌入式编程设计模式
Android游戏开发实践指南
lishixinzhi/Article/program/Delphi/201311/25120
以上就是关于DELPHI基础教程:Delphi开发数据库应用程序概述(一)[4]全部的内容,包括:DELPHI基础教程:Delphi开发数据库应用程序概述(一)[4]、delphi 分布式架构怎么学、学习编程,从何入手等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)