大家好,又见面了,我是你们的朋友全栈君。
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