Delphi教程
- 格式:ppt
- 大小:1.36 MB
- 文档页数:484
delphi 教程在此篇Delphi教程中,我们将介绍一些基本的Delphi编程知识。
Delphi是一种可视化的集成开发环境,用于创建Windows应用程序。
它支持面向对象编程,具有强大的图形用户界面设计工具和简化的应用程序开发工具。
首先,我们需要了解Delphi的安装和设置过程。
您可以从Embarcadero官网下载Delphi安装程序。
安装完成后,您可以根据需要配置Delphi的界面和选项。
接下来,让我们了解Delphi中的一些基本概念。
Delphi使用对象、类和单位的概念来组织代码。
对象是程序的实体,类是对象的模板,单位是一种将相关类和对象组织在一起的方式。
Delphi中的代码以过程和函数的形式组织。
过程是一段代码块,用于执行特定的任务,而函数是返回一个值的过程。
您可以使用Delphi的集成开发环境编写和编辑代码。
Delphi支持多种数据类型,包括整数、浮点数、字符和字符串。
您可以使用这些数据类型创建变量,并对其进行操作。
在Delphi中,您可以使用条件语句(如if语句和case语句)和循环语句(如for循环和while循环)来控制程序的执行流程。
这样,您可以根据条件执行不同的动作,或者重复执行一段代码。
Delphi还提供了丰富的图形用户界面设计工具。
您可以使用这些工具创建窗体和控件,并将它们放置在窗体上。
您可以使用属性编辑器更改控件的属性,并为控件添加事件处理程序,以响应用户的操作。
最后,让我们谈谈Delphi中的调试和错误处理。
Delphi提供了一些调试工具,可以帮助您查找和修复程序中的错误。
您可以使用调试器跟踪程序的执行过程,并在运行时查看变量的值。
您还可以使用异常处理机制捕捉和处理程序中的异常。
这就是本篇Delphi教程的简要概述。
通过学习这些基本概念,您将能够开始使用Delphi开发Windows应用程序。
希望这篇教程对您有所帮助!。
delphi教程Delphi是一种先进的编程语言和集成开发环境(IDE),经常用于快速开发可视化和跨平台的应用程序。
它是由Embarcadero Technologies开发的。
Delphi结合了面向对象编程和事件驱动编程的特点,并提供了强大的组件库和可视化设计工具,使开发人员能够轻松地创建功能强大且用户友好的应用程序。
Delphi教程可以帮助初学者了解和掌握Delphi编程语言的基础知识和技巧。
以下是一个简单的Delphi教程,介绍了一些基本概念和常用功能。
首先,我们需要了解Delphi的开发环境。
Delphi IDE提供了代码编辑器、可视化设计界面和调试工具等组件。
开发人员可以使用代码编辑器编写Delphi代码,使用界面设计器创建用户界面,以及使用调试工具调试和测试应用程序。
接下来,让我们来了解一些Delphi的基本概念。
Delphi是基于面向对象编程的语言,它使用类和对象来组织代码。
一个类是一个定义了一组属性和方法的模板,而对象是类的实例。
开发人员可以创建自己的类,并定义适用于这些类的属性和方法。
Delphi还支持事件驱动编程模型。
开发人员可以定义事件处理程序,以响应用户的操作或系统产生的事件。
通过将事件处理程序与控件的事件关联,开发人员可以实现用户界面的交互和功能。
Delphi还提供了丰富的组件库,其中包括许多预定义的控件和功能。
这些控件可以用于创建用户界面,例如按钮、文本框、列表框等等。
开发人员可以使用这些控件和组件来构建功能丰富的应用程序。
此外,Delphi还支持数据访问和数据库操作。
开发人员可以使用Delphi提供的数据库组件来连接和操作各种数据库,如Oracle、MySQL、Microsoft SQL Server等。
最后,Delphi还具有跨平台的能力。
开发人员可以使用一套代码开发应用程序,并在不同的操作系统上运行,如Windows、macOS和Linux等。
总结一下,Delphi是一种强大的编程语言和集成开发环境,适用于开发各种类型的应用程序。
delphi教程
Delphi 是一种基于 Pascal 的编程语言,用于创建窗体应用程序和控制台应用程序。
以下是一些Delphi的教程和指南,可以帮助您入门以及深入了解Delphi的各种功能和特性。
1. Delphi 简介和基础知识
- Delphi 是什么?它的历史和背景
- 安装和设置 Delphi 开发环境
- Delphi IDE 的界面和基本功能介绍
- Delphi 的 Pascal 语法和常用关键字
2. Delphi 窗体应用程序开发
- 创建一个简单的窗体应用程序
- 窗体的属性和事件
- 使用组件和控件设计用户界面
- 处理用户输入和事件响应
3. Delphi 数据库应用程序开发
- 连接和操作数据库
- 使用 SQL 查询和更新数据库
- 数据库表格和字段的创建和管理
- 数据集和数据绑定
4. Delphi 高级特性和技巧
- 使用面向对象编程技术
- 使用线程和并发处理
- 图形和图像处理
- 异常处理和调试技巧
5. Delphi 与其他技术的集成
- 使用外部 DLL 和动态链接库
- 与 Web 服务进行通信
- 与其他编程语言进行互操作
- 创建和使用自定义组件和控件
以上是一些Delphi教程的主要内容,在学习过程中,您可以通过搜索更多的资料来深入了解每个主题。
准备好了解Delphi 的强大功能和灵活性吗?开始学习吧!。
DELPHI基础教程第十九章Delphi自定义部件开发(二)19.2.2 Delphi部件编程19.2.2.1 创建属性属性(Property)是部件中最特殊的部分,主要因为部件用户在设计时可以看见和操作它们,并且在交互过程中能立即得到返回结果。
属性也很重要,因为如果将它们设计好后,将使用户更容易地使用,自己维护起来也很容易。
为了使你在部件中更好地使用属性,本部分将介绍下列内容:●为什么要创建属性●属性的种类●公布(publishing)继承的属性●定义部件属性●编写属性编辑器1. 为什么要创建属性属性提供非常重要的好处,最明显的好处是属性在设计时能出现在Object Inspector窗口中,这将简化编程工作,因为你只需读用户所赋的值,而不要处理构造对象的参数。
从部件使用者的观点看,属性象变量。
用户可以给属性赋值或读值,就好象属性是对象的域。
从部件编写者的观点看属性比对象的域有更强的功能;⑴用户可以在设计时设置属性这是非常重要的,因为不象方法,只能在运行时访问。
属性使用户在运行程序之前就能定制部件,通常你的部件不应包含很多的方法,它们的功能可以通过属性来实现。
⑵属性能隐藏详细的实现细节⑶属性能引起简单地赋值之外的响应,如触发事件⑷用于属性的实现方法可以是虚拟方法,这样看似简单的属性在不同的部件中,将实现不同的功能。
2. 属性的类型属性可以是函数能返回的任何类型,因为属性的实现可以使用函数。
所有的Pascal类型,兼容性规则都适用属性。
为属性选择类型的最重要的方面是不同的类型出现在Object Inspector窗口中的方式不同。
Object Inspector将按不同的类型决定其出现的方式。
你也能在注册部件时描述不同的属性编辑器。
下表列出属性出现在Object Inspector窗口中的方式表19.3 属性出现在Object Inspector窗口中的方式━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━属性类型处理方式───────────────────────────────────────简单类型Numeric、Character和String属性出现在Object Inspector中,用户可以直接编辑枚举类型枚举类型的属性显示值的方式定义在代码中。
Delphi7.0软件程序编制规范3.2、Delphi7.0软件程序编制规范3.2.1、编制程序:根据系统分析要求编制程序,要求实现代码的复用、算法的优化、程序代码的优化、发现数据库设计不合理的及时反馈,减少循环嵌套,基础数据避免重复更新,保证进入的数据就是齐全的、正确的。
3.2.2、程序自测:负责按测试方案进行自测,交付测试的程序不能出现不能正常运行、未按公式计算的简单错误。
3.2.3、程序测试:将完成的程序转系统分析人员按测试方案测试。
3.2.4、开发工具的程序编制规范:详见详细规范。
3.2.5、.net编程规范一.安装方法:1、安装IIS与frontpage扩展:点击控制面板,点击添加删除程序,选择添加删除WINDOWS组件,选择应用程序服务器。
点击详细信息,选择internet信息服务IIS,点击详细信息,选择frontpage 2002 server extensions与internet信息服务管理器,按向导提示点击下一步,然后放入系统盘。
2、要在防火墙退出的环境下进行安装,把网线拔掉。
3、放入第一张光盘,他会提示安装.net必备,放入第三张光盘,根据向导提示安装。
安装完第一张、第二张就可以运行.net了.第四、五、六张为MSDN帮助文件。
(07.02.06添加)3.2.6、Delphi7.0编程规范第一部分:软件安装与控件安装方法一、软件安装:光盘或网络安装后,将光盘CRACK目录下dent.slip拷贝到安装路径下。
未注册信息将不再显示。
二、基本安装:1、对于单个控件,Componet-->install component..-->PAS或DCU文件-->install;2、对于带*.dpk文件的控件包,File-->Open(下拉列表框中选*.dpk)-->install即可;3、对于带*.bpl文件的控件包,Install Packages-->Add-->bpl文件名即可;4、如果以上Install按钮为失效的话,试试Compile按钮;5、是run time lib则在option下的packages下的runtimepackes加之。
Delphi程序设计实用教程第2版•Delphi程序设计概述•Delphi语言基础•面向对象编程基础•窗体和控件应用•文件操作与数据库访问技术•网络编程技术•调试、优化和发布部署•实战项目:XXX系统设计与实现Delphi程序设计概述Delphi是一种高级编程语言,由Borland公司开发,以Object Pascal为基础。
Delphi支持面向对象的程序设计,具有丰富的组件库和强大的开发环境。
Delphi广泛应用于Windows桌面应用程序、Web应用程序、数据库应用程序等开发领域。
Delphi语言简介下载并安装Delphi开发环境,选择合适的版本和组件库。
配置开发环境,包括设置编译器选项、调试器选项、代码编辑器风格等。
安装和配置数据库连接驱动,以便在Delphi中访问数据库。
Delphi开发环境安装与配置第一个Delphi程序创建一个新的Delphi项目,选择适当编译和运行程序,查看程序执行结果。
的项目类型和模板。
在代码编辑器中编写程序代码,实现简单的功能,如输出“HelloWorld”。
010204 Delphi程序结构Delphi程序由项目文件、单元文件和窗体文件等组成。
项目文件包含程序的整体设置和引用单元的信息。
单元文件包含程序中的代码和数据,是实现程序功能的基本单元。
窗体文件包含程序中的界面元素和事件处理代码,是实现用户交互的重要部分。
03Delphi语言基础包括Integer 、Boolean 、Char 、String 、Float 等常用类型。
标准数据类型如数组、记录、集合、文件等复合数据类型。
构造类型用于访问内存地址的特殊数据类型。
指针类型可存储不同类型数据的灵活数据类型。
变体类型Delphi 数据类型介绍如何在Delphi 中声明变量并为其赋值。
变量声明与赋值讲解常量的概念、定义方法及在程序中的应用。
常量定义与使用阐述局部变量、全局变量的概念及其作用范围。
变量作用域变量与常量运算符与表达式算术运算符介绍加、减、乘、除等基本算术运算。
delphi教程Delphi是一种基于Object Pascal语言的编程环境和开发工具,由Borland公司开发。
Delphi的设计目的是为了简化软件开发过程,提高开发效率,并且能够快速创建各种Windows应用程序。
Delphi教程是学习和掌握Delphi编程的一种方法和资源,它可以帮助初学者从基础开始,逐步了解Delphi的语法和特性,然后学习如何使用Delphi开发应用程序。
Delphi教程通常包括以下内容:1. Delphi概述:介绍Delphi的起源、特点和应用领域。
2. Delphi环境搭建:介绍如何安装和配置Delphi开发环境,包括安装Delphi IDE,设置编译器和调试器等。
3. Delphi语法:介绍Delphi的语法规则、关键字和数据类型,包括变量声明、函数定义、条件语句、循环语句等。
4. Delphi组件:介绍Delphi的组件库,包括常用组件和自定义组件的使用方法和属性设置。
5. Delphi界面设计:介绍如何使用Delphi的可视化界面设计工具创建用户界面,包括窗体设计、控件布局和事件处理等。
6. Delphi数据库编程:介绍如何使用Delphi连接和操作数据库,包括数据查询、数据更新和事务处理等。
7. Delphi调试和优化:介绍如何使用Delphi的调试工具找出程序中的错误和性能瓶颈,并进行优化。
8. Delphi应用程序发布:介绍如何将Delphi应用程序打包和发布,包括生成可执行文件、安装程序和更新程序等。
通过学习Delphi教程,初学者可以逐步掌握Delphi编程的基本技术和方法,能够使用Delphi开发出简单的Windows应用程序。
随着学习的深入,他们可以进一步学习高级的Delphi 技术和框架,开发出更复杂、功能更强大的应用程序。
此外,Delphi还有丰富的第三方组件和库可供使用,开发者可以根据自己的需求选择合适的扩展工具和资源,提高开发效率和应用程序的质量。
DELPHI_DATASNAP_2024_教程Delphi DataSnap 2024 是一个强大的多层框架,可以用于构建分布式、跨平台的应用程序。
它允许开发人员通过简化的方式来创建和管理客户端/服务器应用程序,并提供了可靠的数据传输和通信机制。
Delphi DataSnap 2024 教程为开发人员提供了关于如何使用 Delphi DataSnap 2024 来构建分布式应用程序的详细指南。
下面将介绍一些主要的内容。
1. Delphi DataSnap 2024 的概述:教程开始时,将简要介绍Delphi DataSnap 2024 的概述,包括它的特点、优势和适用场景。
读者将了解到 Delphi DataSnap 2024 是如何帮助开发人员构建分布式应用程序的。
2. 准备工作:在开始开发分布式应用程序之前,需要进行一些准备工作。
教程将指导读者如何安装和配置 Delphi DataSnap 2024,并创建相应的开发环境。
3. 构建服务:在教程的这一部分,将详细介绍如何使用 Delphi DataSnap 2024 构建服务。
读者将学习如何创建一个服务应用程序,并配置服务的属性和参数。
4.定义数据模型:为了能够在客户端和服务器之间传输数据,需要定义一种数据模型。
这一部分将指导读者如何定义数据模型,包括创建数据表、定义字段和关系等。
5.实现服务方法:服务方法是客户端和服务器之间进行通信和数据交互的接口。
本部分将向读者展示如何实现和调用服务方法,包括参数传递、错误处理等。
6. 客户端开发:教程的这一部分将专注于客户端开发。
读者将了解如何创建一个客户端应用程序,并使用 Delphi DataSnap 2024 的客户端组件来与服务器进行通信和数据交互。
7. 安全和权限控制:在构建分布式应用程序时,安全和权限控制是非常重要的一部分。
本部分将指导读者如何使用 Delphi DataSnap 2024 的安全功能来保护应用程序的数据和通信。
●标题为“Delphi-Project1”的Delphi主窗口● Object Inspector窗口●标题为“Form1”的窗体(Form)窗口●标题为“Unit1.PAS”的代码编辑窗口。
刚启动时这一窗口的大部分被“Form1”窗体所掩盖。
将“Form1”窗体移开,或单击Form1窗体下方的状态行,可以使其全部可见。
在“Form1”窗体的任意可见位置单击鼠标,可以恢复主窗体可见以下我们将对这四个窗口分别进行介绍。
1.2.2 Delphi可视化编程环境介绍1.2.2.1 主窗口(Main Form)Delphi的主窗口位于屏幕的上端,包括Menu(菜单)、Speed Bar(加速条)和Component Panel(部件选项板)。
Menu是下拉式主菜单。
Speed Bar位于主窗口的左下端,由两排共14个加速按钮组成。
这些按钮是菜单功能的快捷方式,各种图标直观地表示了它能执行的动作。
Component Panel 由一行、若干页对象按钮所组成,利用它来选择需要的部件并将它放到窗体中去。
1.2.2.2 Object Inspector(对象检视器)Object Inspector窗口含有两页:Properties页显示窗体中当前被选择部件的属性信息,并允许改变对象的属性;Events页列出了当前部件可以响应的事件。
按动Object Inspector下端的“Events”页标签,使得Events页可见,这一定的事件后边的空白处,可以定义对象接受到相应事件时执行的动作。
首次启动时,Object Inspector窗口显示的是当前窗体Form1的属性。
Object Inspector根据对象属性的多少,决定是否有滚行显示。
移动滚行条,可以查看当前对象的全部属性。
此外,Object Inspector上还有Object Selector(对象选择器),位于Object Inspector 上方的下拉式菜单中。
delphi线程详细教程简单到复杂1. delphi之多线程编程(⼀)(2)delphi之多线程编程(⼀)本⽂的内容取⾃⽹络,并重新加以整理,在此留存仅仅是⽅便⾃⼰学习和查阅。
所有代码均亲⾃测试delphi7下测试有效。
图⽚均为⾃⼰制作。
多线程应该是编程⼯作者的基础技能, 但这个基础我从来没学过,所以仅仅是看上去会⼀些,明⽩了2+2的时候,其实我还不知道1+1。
开始本应该是⼀篇洋洋洒洒的⽂字, 不过我还是提倡先做起来, 在尝试中去理解.先试试这个:procedure TForm1.Button1Click(Sender: TObject);vari: Integer;beginfor i := 0to500000dobeginCanvas.TextOut(10, 10, IntToStr(i));end;end;上⾯程序运⾏时, 我们的窗体基本是"死" 的, 可以在你在程序运⾏期间拖动窗体试试...Delphi 为我们提供了⼀个简单的办法(Application.ProcessMessages)来解决这个问题:procedure TForm1.Button1Click(Sender: TObject);vari: Integer;beginfor i := 0to500000dobeginCanvas.TextOut(10, 10, IntToStr(i));Application.ProcessMessages;end;end;这个Application.ProcessMessages; ⼀般⽤在⽐较费时的循环中, 它会检查并先处理消息队列中的其他消息.但这算不上多线程, 譬如: 运⾏中你拖动窗体, 循环会暂停下来...在使⽤多线程以前, 让我们先简单修改⼀下程序:function MyFun: Integer;varfor i := 0to500000dobeginForm1.Canvas.Lock;Form1.Canvas.TextOut(10, 10, IntToStr(i));Form1.Canvas.Unlock;end;Result := 0;end;procedure TForm1.Button1Click(Sender: TObject);beginMyFun;end;细数上⾯程序的变化:1、⾸先这还不是多线程的, 也会让窗体假"死" ⼀会;2、把执⾏代码写在了⼀个函数⾥, 但这个函数不属于TForm1 的⽅法, 所以使⽤Canvas 是必须冠以名称(Form1);3、既然是个函数, (不管是否必要)都应该有返回值;4、使⽤了500001 次Lock 和Unlock.Canvas.Lock 好⽐在说: Canvas(绘图表⾯)正忙着呢, 其他想⽤Canvas 的等会;Canvas.Unlock : ⽤完了, 解锁!在Canvas 中使⽤Lock 和Unlock 是个好习惯, 在不使⽤多线程的情况下这⽆所谓, 但保不准哪天程序会扩展为多线程的; 我们现在学习多线程, 当然应该⽤.在Delphi 中使⽤多线程有两种⽅法: 调⽤API、使⽤TThread 类; 使⽤API 的代码更简单. function MyFun(p: Pointer): Integer; stdcall;vari: Integer;beginfor i := 0to500000dobeginForm1.Canvas.Lock;Form1.Canvas.TextOut(10, 10, IntToStr(i));Form1.Canvas.Unlock;end;Result := 0;end;procedure TForm1.Button1Click(Sender: TObject);ID: THandle;beginCreateThread(nil, 0, @MyFun, nil, 0, ID);end;代码分析:CreateThread ⼀个线程后, 算上原来的主线程, 这样程序就有两个线程、是标准的多线程了; CreateThread 第三个参数是函数指针, 新线程建⽴后将⽴即执⾏该函数, 函数执⾏完毕, 系统将销毁此线程从⽽结束多线程的故事.CreateThread 要使⽤的函数是系统级别的, 不能是某个类(譬如: TForm1)的⽅法, 并且有严格的格式(参数、返回值)要求, 不管你暂时是不是需要都必须按格式来;因为是系统级调⽤, 还要缀上stdcall, stdcall 是协调参数顺序的, 虽然这⾥只有⼀个参数没有顺序可⾔,但这是使⽤系统函数的惯例.CreateThread 还需要⼀个var 参数来接受新建线程的ID, 尽管暂时没⽤, 但这也是格式; 其他参数以后再说吧.这样⼀个最简单的多线程程序就出来了, 咱们再⽤TThread 类实现⼀次typeTMyThread = class(TThread)protectedprocedure Execute; override;end;procedure TMyThread.Execute;vari: Integer;beginFreeOnTerminate := True; {这可以让线程执⾏完毕后随即释放}for i := 0to500000dobeginForm1.Canvas.Lock;Form1.Canvas.TextOut(10, 10, IntToStr(i));Form1.Canvas.Unlock;end;end;procedure TForm1.Button1Click(Sender: TObject);beginTMyThread.Create(False);end;继承TThread 主要就是实现抽象⽅法Execute(把我们的代码写在⾥⾯), 等我们的TMyThread 实例化后, ⾸先就会执⾏Execute ⽅法中的代码.按常规我们⼀般这样去实例化:procedure TForm1.Button1Click(Sender: TObject);varMyThread: TMyThread;beginMyThread := TMyThread.Create(False);end;因为MyThread 变量在这⾥毫⽆⽤处(并且编译器还有提⽰), 所以不如直接写做TMyThread.Create (False);我们还可以轻松解决⼀个问题, 如果: TMyThread.Create(True) ?这样线程建⽴后就不会⽴即调⽤Execute, 可以在需要的时候再⽤Resume ⽅法执⾏线程, 譬如: procedureTForm1.Button1Click(Sender: TObject);varMyThread: TMyThread;beginMyThread := TMyThread.Create(True);MyThread.Resume;end;//可简化为:procedure TForm1.Button1Click(Sender: TObject);beginwith TMyThread.Create(True) do Resume;end;⼀、⼊门㈠、function CreateThread(lpThreadAttributes: Pointer; {安全设置}dwStackSize: DWORD; {堆栈⼤⼩}lpStartAddress: TFNThreadStartRoutine; {⼊⼝函数}lpParameter: Pointer; {函数参数}dwCreationFlags: DWORD; {启动选项}var lpThreadId: DWORD {输出线程 ID }): THandle; stdcall; {返回线程句柄}在Windows 上建⽴⼀个线程, 离不开CreateThread 函数;TThread.Create 就是先调⽤了BeginThread (Delphi ⾃定义的), BeginThread ⼜调⽤的Create Thread.既然有建⽴, 就该有释放, CreateThread 对应的释放函数是: ExitThread, 譬如下⾯代码: procedureTForm1.Button1Click(Sender: TObject);beginExitThread(0); {此句即可退出当前程序, 但不建议这样使⽤}end;代码注释:当前程序是⼀个进程, 进程只是⼀个⼯作环境, 线程是⼯作者;每个进程都会有⼀个启动线程(或叫主线程), 也就是说: 我们之前⼤量的编码都是写给这个主线程的;上⾯的ExitThread(0); 就是退出这个主线程;系统不允许⼀个没有线程的进程存在, 所以程序就退出了.另外: ExitThread 函数的参数是⼀个退出码, 这个退出码是给之后的其他函数⽤的, 这⾥随便给个⽆符号整数即可.或许你会说: 这个ExitThread 挺好⽤的; 其实不管是⽤API 还是⽤TThread 类写多线程, 我们很少⽤到它; 因为:1、假如直接使⽤API 的CreateThread, 它执⾏完⼊⼝函数后会⾃动退出, ⽆需ExitThread;2、⽤TThread 类建⽴的线程⼜绝不能使⽤ExitThread 退出; 因为使⽤TThread 建⽴线程时会同时分配更多资源(譬如你⾃定义的成员、还有它的祖先类(TObject)分配的资源等等), 如果⽤ExitThread给草草退出了, 这些资源将得不到释放⽽导致内存泄露. 尽管Delphi 提供了EndThread(其内部调⽤ExitThread), 这也不需要我们⼿动操作(假如⾮要⼿动操作也是件很⿇烦的事情, 因为很多时候你不知道线程是什么时候执⾏完毕的).除了CreateThread, 还有⼀个CreateRemoteThread, 可在其他进程中建⽴线程, 这不应该是现在学习的重点;现在先集中精⼒把CreateThread 的参数搞彻底.倒着来吧, 先谈谈CreateThread 将要返回的"线程句柄"."句柄" 类似指针, 但通过指针可读写对象, 通过句柄只是使⽤对象;有句柄的对象⼀般都是系统级别的对象(或叫内核对象); 之所以给我们的是句柄⽽不是指针, ⽬的只有⼀个: "安全";貌似通过句柄能做很多事情, 但⼀般把句柄提交到某个函数(⼀般是系统函数)后, 我们也就到此为⽌很难了解更多了; 事实上是系统并不相信我们.不管是指针还是句柄, 都不过是内存中的⼀⼩块数据(⼀般⽤结构描述), 微软并没有公开句柄的结构细节,猜⼀下它应该包括: 真实的指针地址、访问权限设置、引⽤计数等等.既然CreateThread 可以返回⼀个句柄, 说明线程属于"内核对象".实际上不管线程属于哪个进程, 它们在系统的怀抱中是平等的; 在优先级(后⾯详谈)相同的情况下, 系统会在相同的时间间隔内来运⾏⼀下每个线程, 不过这个间隔很⼩很⼩, 以⾄于让我们误以为程序是在不间断地运⾏.这时你应该有⼀个疑问: 系统在去执⾏其他线程的时候, 是怎么记住前⼀个线程的数据状态的?有这样⼀个结构TContext, 它基本上是⼀个CPU 寄存器的集合, 线程是数据就是通过这个结构切换的,我们也可以通过GetThreadContext 函数读取寄存器看看.附上这个结构TContext(或叫: CONTEXT、_CONTEXT) 的定义:PContext = ^TContext;_CONTEXT = recordContextFlags: DWORD;Dr0: DWORD;Dr1: DWORD;Dr3: DWORD;Dr6: DWORD;Dr7: DWORD;FloatSave: TFloatingSaveArea; SegGs: DWORD;SegFs: DWORD;SegEs: DWORD;SegDs: DWORD;Edi: DWORD;Esi: DWORD;Ebx: DWORD;Edx: DWORD;Ecx: DWORD;Eax: DWORD;Ebp: DWORD;Eip: DWORD;SegCs: DWORD;EFlags: DWORD;Esp: DWORD;SegSs: DWORD;end;CreateThread 的最后⼀个参数是"线程的ID";既然可以返回句柄, 为什么还要输出这个ID? 现在我知道的是:1、线程的ID 是唯⼀的; ⽽句柄可能不只⼀个, 譬如可以⽤GetCurrentThread 获取⼀个伪句柄、可以⽤DuplicateHandle 复制⼀个句柄等等.2、ID ⽐句柄更轻便.在主线程中GetCurrentThreadId、MainThreadID、MainInstance 获取的都是主线程的ID.㈡、启动选项function CreateThread(lpThreadAttributes: Pointer;dwStackSize: DWORD;lpStartAddress: TFNThreadStartRoutine;lpParameter: Pointer;dwCreationFlags: DWORD; {启动选项}var lpThreadId: DWORD): THandle; stdcall;0: 线程建⽴后⽴即执⾏⼊⼝函数;CREATE_SUSPENDED: 线程建⽴后会挂起等待.可⽤ResumeThread 函数是恢复线程的运⾏; 可⽤SuspendThread 再次挂起线程.这两个函数的参数都是线程句柄, 返回值是执⾏前的挂起计数.什么是挂起计数?SuspendThread 会给这个数+1; ResumeThread 会给这个数-1; 但这个数最⼩是0.当这个数= 0 时, 线程会运⾏; > 0 时会挂起.如果被SuspendThread 多次, 同样需要ResumeThread 多次才能恢复线程的运⾏.在下⾯的例⼦中, 有新线程不断给⼀个全局变量赋随机值;同时窗体上的Timer 控件每隔1/10 秒就把这个变量写在窗体标题;在这个过程中演⽰了ResumeThread、SuspendThread 两个函数.//上⾯图⽚中演⽰的代码。
1.1Delphi基本概念介绍1.1.1Delphi的基本形式Delphi实际上是Pascal语言的一种版本,但它与传统的Pascal语言有天壤之别。
一个Delphi程序首先是应用程序框架,而这一框架正是应用程序的“骨架”。
在骨架上即使没有附着任何东西,仍可以严格地按照设计运行。
您的工作只是在“骨架”中加入您的程序。
缺省的应用程序是一个空白的窗体(Form),您可以运行它,结果得到一个空白的窗口。
这个窗口具有Windows窗口的全部性质:可以被放大缩小、移动、最大最小化等,但您却没有编写一行程序。
因此,可以说应用程序框架通过提供所有应用程序共有的东西,为用户应用程序的开发打下了良好的基础。
Delphi已经为您做好了一切基础工作——程序框架就是一个已经完成的可运行应用程序,只是不处理任何事情。
您所需要做的,只是在程序中加入完成您所需功能的代码而已。
在空白窗口的背后,应用程序的框架正在等待用户的输入。
由于您并未告诉它接收到用户输入后作何反应,窗口除了响应Windows的基本操作(移动、缩放等)外,它只是接受用户的输入,然后再忽略。
Delphi把Windows编程的回调、句柄处理等繁复过程都放在一个不可见的Romulam覆盖物下面,这样您可以不为它们所困扰,轻松从容地对可视部件进行编程。
1.1.2面向对象编程的概念面向对象的程序设计(Object-Oriented Programming,简记为OOP)是Delphi诞生的基础。
OOP立意于创建软件重用代码,具备更好地模拟现实世界环境的能力,这使它被公认为是自上而下编程的优胜者。
它通过给程序中加入扩展语句,把函数“封装”进Windows编程所必需的“对象”中。
面向对象的编程语言使得复杂的工作条理清晰、编写容易。
说它是一场革命,不是对对象本身而言,而是对它们处理工作的能力而言。
对象并不与传统程序设计和编程方法兼容,只是部分面向对象反而会使情形更糟。
除非整个开发环境都是面向对象的,否则对象产生的好处还没有带来的麻烦多。