前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Delphi 教程

Delphi 教程

作者头像
全栈程序员站长
发布2022-09-07 15:37:42
1.9K0
发布2022-09-07 15:37:42
举报

大家好,又见面了,我是你们的朋友全栈君。

1.点击Project->View Source 可以看到工程的代码 program Project1;

uses Forms, Unit1 in ‘Unit1.pas’ {Form1};

{$R *.res}

begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end.

其中的application就是最基本的对象 它代表一个工程,可以全局的操作整个程序,application是定义在forms单元里的,你在用之前先引用forms. 虽然delphi是面向对象的,但是application是面向过程的,这是因为在程序刚建立的时候,是按顺序从上到下执行,此时还没有创建任何的对象,application是一个全局的过程变量. 它的重要方法有以下几个: Initialize:对全局程序进行初始化.就比如说你有2个窗体,form1和form2,里面分别有1个全局变量,一般在人们的理解上,这些全局变量在form创建时才拥有实例 ,但是实际上在application.initializel的时候就有了 第二个重要的方法是run: 它表明程序可以启动,注意不是“启动”,而是“可以启动”.这个地方是delphi命名不规范的地方 . 如果按规范写,应当是Application.CanRun:=True; 但是delphi是简写成了run. 接下来重要的方法是CreateForm:创建窗体.这个方法在使用dll内的窗体时更重要,因为只有它才能主动的修复dll入口,不然的话程序容易内存泄漏. 还有一个是ProcessMessages:这个方法可以让程序进入一个单独的线程,从而使占用的cpu减少,并且可以跟据需要建立其他的线程.对于一些像浏览器之类的程序,需要同时打开多个页面,或是其他的事情同时进行,这时就需要用ProcessMessages,不然程序将变得非常消息慢(换言之,消息就是线程的组成部分 )

在使用数据模块时 ,如果连接的数据库是access,则必须加入forms,activex单元,不然access接口会报错,不然access接口会报错,oracle也没有.在数据模块上一般放四种东西 (…,加密算法控件,这个控件在web service面板上 (SOP DOM),用于将xml文件进行dom加密 ).

第二个要讲的是unit:如果你的程序中有许多全局的函数,那么应当将它们放入一个新的unit中,并使用///进行注释.对于button.click等控件的事件可以不写注释,但是自定义的函数必须照///注释书写。你在函数名的上方输入 ///f ,它就会自动生成这个注释框架 ,你只要把内容填进去就行了 。

第三个要讲的是thread object,几乎所有的程序都不可能只有一个线程。对于一些需要在后台进行 ,并且不能打断前台工作的程序,必须进入线程。 unit Unit2;

interface

uses Classes;

type abc = class(TThread) private protected procedure Execute; override; end;

implementation

procedure abc.Execute;

begin

end;

end. 必须要注意,Execute方法是抽象的,必须覆盖。但是如果你想给它加上参数,比如说Execute(i:Integer),就不能使用override,而是必须写在public下:procedure Execute(i:integer);reintroduce;方法后缀使用重发布。 在一个程序里,可以拥有多个线程,但是在线程冲突的情况下,必须使用synchronize方法来防止冲突,这个方法是定义在classes单元内的公共方法,你在任何情况下都能使用它。 (技巧:有些时候你可能会在窗体上放满控件,这样就选不中窗体了,这个时候可以点任何一个控件,然后不断的按ESC,这样它就会按父类的顺序一级一级向上跳转,最后会跳到窗体上 。)

第四个要讲的是dll 这个技术基本上所有程序都会用到,因为你永远都不可能把所有的功能都写在一个exe里,如果功能太多,写在一起就无法维护,所以必须分开写。 结构: library Project2;

uses SysUtils, Classes;

{$R *.res}

begin

end.

这个只是系统生成的,一般来说,还必须加入windows,messages,forms单元。如果你开发的dll给其他语言调用,还必须加上sharemem单元 。编写dll的方法和编写exe的方法完全一样。

控件类: 第一个重要的是actionlist。一般的编程语言,它的控件只有三个关键,属性,方法和事件,但是delphi还有一个动作 ,这就意味着它能更方便的处理复杂的事情。基本上所有的控件都有动作,它们被列在actionlist里面 ,根据你的需要可以调用它们。

第二个讲的是HTTPRIO,这个东西是用来操作webService的。webService是当前世界上最先进和有效的网络服务方式 。delphi通过httprio控件,可以调用一切存在的webService。

第三个讲的是TCPServer和UDPServer。TCP用于点对点的传输,可以传文件,但是速度慢;UDP用于点对面的传输,不能传文件,但是速度快 。一般的网络通信程序中,将这2种协议放在一起用。单纯的发送信息用UDP,发送文件用TCP。它们的发送和接收方法都一样:通过SendBuffer进行发送 ,Adata.ReadBuffer进行接收。

再下一个,AntiFreeze。这个控件在开发网络应用时是必需的,在很多情况下,比如说QQ,可能会有多个用户同时向你发消息的情况,但是这些消息如果同时到达,就会引起阻塞。用antiFreeze控件可以将同时到达的消息放入一个线程,再按顺序读取,这样就避免了因消息的同时到达而引起的程序故障。

下面我给你讲解一整个单元 unit Unit1;

interface

implementation

end. 这是一个最简单的单元,它拥有单元名,接口部分,实现部分,最后用end.来结束。 接口部分用于进行定义,比如说类的定义,常量,变量定义,单元的引用,都能放在接口部分。 实现部分用于实现接口部分的类,也可以声明常量,变量或是引用单元,接口处引用和实现处引用的区别,就是接口引用没有类实例,而实现引用有类实例,并且接口处声明的常量,变量可被其他单元使用。对于一个单元,有时候需要initialization和finalization标识符,它们用于在单元载入前进行一定的操作,最常用的是

initialization

ActiveX.CoInitialize(nil); finalization

ActiveX.CoUninitialize; finalization在单元被释放后执行,一般进行的操作是将单元内的残留对象清空。比如说单元内定义了form1,并且没有手动的进行free,则可以在finalization中写FreeAndNil(form1);

ActiveX.CoUninitialize; 但是对变量的赋值不允许放在initialization部分,因为initialization是在单元载入前执行的,那个时候单元内的变量还未被创建。finalization在单元被释放后执行,一般进行的操作是将单元内的残留对象清空,比如说单元内定义了form1,并且没有手动的进行free 。 则可以在finalization中写FreeAndNil(form1); 在end.后面的代码,编译时被忽略。 也就是说end.后面写的代码,编译器不会检查,但是要注意一点,那些代码也会被编译到程序内。有很多人喜欢在end.后面加一些乱写的东西,这样编译后的程序在反编译器面前就显得非常混乱,使别人不容易激活成功教程,这是一种保护自己程序的手段 。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/148392.html原文链接:https://javaforall.cn

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com