一個程序分爲兩個部分:
一、程序首部:
program 來標識這是一個pascal程序 後面的是可執行文件的名稱
程序名稱
二、程序體:
說明部分:數據先定義後使用
執行部分:以begin開始,以end結束 以後一個.表示整個程序的結束
uses 項目引用的其餘文件,系統建立的單元文件或是用戶建立的的單元文件
接口部分不能相互引用,實現部分能夠
全部單元隱式引用system.pas
{$R *.res}是編譯器指令,告訴編譯器去連接一個資源文件,在項目同名、後綴爲
.res的文件查找windows資源信息
單元文件.pas:
應用程序的源代碼
自定義單元:
unit 單元名;必定要與pas文件一致
interface
<公共說明部分>
用於聲明對其餘單元該部分是能夠訪問的—便可以從該單元中訪問哪些東西,沒有運行代碼
uses引用了系統預先定義的單元文件
接口部分包括了類型聲明、變量聲明、常數
implementation
<私有說明部分>
包括了代碼實現部分和隱含部分
uses引用了程序實現部分引用的單元文件,在用戶當前項目中建立的
實現部分包括了類型聲明、變量聲明、常數和過程—只能在單元內使用
定義在實現部分的過程和函數若是接口部分沒有相應的聲明,則只能在單元內部使用
{$R *.dfm} 範圍檢查打開 定義資源文件
begin/initialization
<初始化部分>
在全部其餘代碼運行前運行
Finalization
執行程序終止功能
在全部其餘代碼運行後運行
end.
Sender:Tobject 表明調用所在過程的控件
用法:一、能夠直接看成那個控件用
二、(Sender as 控件名).控件屬性 調用屬性
窗體文件.dfm
中間編譯單元.dcu
資源文件.res
配置與選項文件.dof
定義常量:
CONST
<常量標識符>=<常量>
定義變量:
VAR
<變量標識符>:<類型>;
定義屬性Property:
Property是一個頗有意思的語法特性,它使得方法具備了字段的調用特徵,並賦予字段執行動做的能力。
若是你使用過C++ Builder來寫基於VCL的程序,我想不少人都會注意到這樣一點,好比:
edt.Text = "test"; 這個時候edt文本框的內容會隨之改變,可是「理論」上Text應該只是改變了Text所在的內存數據而已,爲何會致使窗口更新界面着一些列動做?
這就是由於Property這一特性,Property是Borland爲C++擴展的語法特性,目的在於使C++ Builder可以方便的使用VCL庫,畢竟VCL是使用Object Pascal寫的。
有些扯遠了,言歸正傳,這裏仍是總結一下在Delphi中如何使用Poperty這一語法特性。
若是學習過C#的朋友應該會很容易理解,由於C#的屬性就是學習自Delphi,畢竟C#和Delphi是同一個設計者。
定義一個屬性Property的基本格式以下:
property 屬性名 : 屬性值類型 read 屬性讀函數/屬性值變量 write 屬性寫函數/屬性值變量
這裏簡單解釋一下:
1。Property是屬性定義關鍵字。
2。屬性的特徵相似於字段,因此屬性名就像字段名,屬性值類型就像字段的值類型
3。屬性讀函數,是屬性被「讀取」時所執行的操做,這樣在執行「取值」操做時,具有了執行其餘動做的可能。
另外,屬性值變量,能夠是Property所在類可以訪問的任何變量,若是使用了屬性值變量,則至關於屬性值直接從值變量中獲取,這和直接賦值是沒有什麼差異的
4。屬性寫函數,是屬性被「寫入」時所執行的操做,這樣在執行屬性「賦值」操做時,具有了執行其餘動做的可能。好比:寫入edt的Text屬性時,窗口會同時執行界面更新操做。
另外,屬性值變量和3中所述相似,若是使用了,就至關於將傳來的屬性值直接賦值到對應的屬性值變量
這裏的函數是真正的函數,不像C#中那樣的getter和setter,因此會有些難以理解。
5。屬性讀函數的函數聲明:
function 讀函數名: 屬性值類型;
其中讀函數名能夠自定義,只要和屬性聲明中同樣便可,該函數的返回值就是讀屬性操做時實際獲取的值。
6。屬性寫函數聲明(實際上是一個子函數):
procedure 寫函數名(value : 屬性值類型)
其中寫函數名能夠自定義,只要和屬性聲明中同樣便可,該函數參數value,就是對屬性賦值時傳遞過來的實際值。
7。讀函數和寫函數必須設置一個,若是隻設置讀函數,而沒有設置寫函數(同時去掉write關鍵字),這樣的屬性就是隻讀屬性,同理也能夠設置只寫屬性
8。爲了保證屬性公開性的同時掩蓋讀寫函數的可見性,能夠將讀寫函數設置爲私有,而將屬性設置爲共有,這樣能夠避免將讀寫函數自己暴露給調用者,不然就不太拉風了。
舉例:
TxKernelSearchThread = class(TThread)
private
keyword_list: TStringList;
procedure SetKeyword(value: UnicodeString);
public
property Kerword:UnicodeString write SetKeyword;
。。。
end;
procedure TxKernelSearchThread.SetKeyword(value: UnicodeString);
begin
if value = '' then Exit;
ExtractStrings([' '],[' '],PWideChar(value),Self.keyword_list);
end;
上面是一個只寫屬性的例子。
屬性的一個很重要的應用就是VCL中的控件屬性,以及事件屬性等,這也就解釋了爲何向文本框的Text屬性賦值,會更新界面操做,這正是由於屬性將字段和函數的特徵結合了起來。
算術運算符:
/(實數除)結果爲實型
DIV(整除)
mod(求餘)整數運算
賦值:
變量名:=表達式;
輸出語句:
write(表達式1,表達式2,...);
writeln('數據':場寬:場寬);
輸入語句:
read(<變量名錶>);能夠繼續讀下一個read語句
readln[(<變量名錶>)];必須換行,能夠無輸入,做爲暫停。
布爾類型:
是順序類型:false爲0 true爲1 布爾不能直接讀語句提供值
IF語句:
IF <布爾表達式> THEN 語句;
IF <布爾表達式> THEN 語句1 ELSE 語句2;
case語句:
case<表達式>of
<狀況表號1>:語句1;
<狀況表號2>:語句2;
<狀況表號3>:語句3;
end;
for<控制變量>:=<表達式1>to<表達式2>do<語句>;遞增
for<控制變量>:=<表達式1>downto<表達式2>do<語句>;遞減
不能爲實型
while<布爾表達式>do<語句>;
repeat
<語句1>;
.
.
<語句n>;
until<布爾表達式>;
type
<標識符1>=<類型1>;
.
.
<標識符n>=<類型n>;
使用數組類型等構造類型應在說明部分進行類型說明。
type標識開始一個類型定義段
數組:
分爲靜態和動態
一維數組的格式:
array[下標1..下標2]of<基本型>;
動態定義:
arrayof<基類型>;setlength過程設置大小
type arrartype=array[1..8]of integer;
var a1,a2:arraytype;
多維數組:
array[下標類型1]of array[下標類型2]of 元素類型
array[下標類型 1,下標類型 2] of 元素類型;
字符類型:
const 字符常量='字符'
var 字符變量:char;
後繼函數: succ('a')='b'
前繼函數: pred('B') ='A'
序號函數: ord('A') =65
字符串類型:
type<字符串類型標識符>=string[n];n是字符串長度,
必須是0~255之間,0中存放的是字符串的實際長度,
將 string[n]寫成 string,則默認 n 值爲 255
var 字符串變量:字符串類型標識符
另外一種定義:
var name:string[8];
鏈接:
鏈接的結果字符串長度超過 255, 則被截成 255 個字符。 若鏈接後的
字符串存放在定義的字符串變量中, 當其長度超過定義的字符串長度時, 超過部
份字符串被截
字符串的函數:
copy(s,m,n)
length(s)
pos(sub,s)
insert(sour,s,m)
delete(s,m,n)
str(x[:w[:d]]),s]
枚舉類型:
格式:(標識符1,標識符2..標識符n)
type days=(sun,mon,tue,wed,thu,fri,sat);
子界類型:
格式:<常量1>..<常量2> 下界和上界必須是同一順序類型,而且上界序號大於下界
type letter='a'..'b';
var ch1,ch2:letter;
表號聲明語句和goto語句:
label Aa;
var I:integer;
begin
… //語句
if(I=0) then goto Aa;
… //語句
Aa:begin
… //語句
end;
end;
集合:
set of<基類型>基類型能夠是任意順序類型,但不能是整型、實型或其餘構造類型
值:[1,2,3]能夠爲空,次序無關、可重複、可爲基類型容許的表達式、不能超過256個
集合只能經過賦值語句
+並 *交 -差 in
記錄類型:
包含不一樣類型相互相關的數據
定義:
record
<域名1>:<類型1>;
<域名n>:<類型n>;
end;
開域語句:
with<記錄變量名錶>do
<語句>可直接用域名
函數:
函數也遵循先說明後使用的規則,
函數的說明放在調用該函數的程序說明部分
定義:
function<函數名>(<形式參數表>):<類型>;
過程:
分爲標準過程(系統內部定義號的)、自定義過程、事件過程
須要先定義後調用。函數通常用於求值,而過程通常實現某些操做
procedure <過程名> (<形式參數表>);
形參表格式形式以下:
[var] 變量名錶:類型; …; [var] 變量名錶:類型。
其中帶 var 的稱爲變量形參,不帶 var 的稱爲值形參。在函數中,形參
通常都是值形參,不多用變量形參(但可使用)。
函數中使用形參,值傳遞 過程當中使用變參,地址傳遞
子程序的調用規則:
向內層調用,不能隔層調,只能調相鄰層
內層能夠調外層,而且能夠隔層調用
同層後定義能夠調用先定義,調後定義須要forward
全程量:
全程量是指在主程序的說明部分中說明的量。全程量的做用域分兩種狀況:
①當全程量和局部量不一樣名時, 其做用域是整個程序範圍(自定義起直
到主程序結束)。
②當全程量和局部量同名時,全程量的做用域不包含局部量的做用域
動態數據類型:
指針類型:能夠方便高效地增長或刪除數據
指針變量(也稱動態變量)存放某個存儲單元的地址; 也就是說指針變量指示某個存儲單元
格式:^基類型 類型能夠是除指針、文件外的全部類型
type pointer=^Integer;
var p1,p2:pointer;
③pascal 規定全部類型都必須先定義後使用, 但只有在定義指針類型時
能夠例外,以下列定義是合法的:
type pointer=^rec;
rec=record
a:integer;
b:char
end
指針變量的賦值:
<指針變量名>:=@<標識符> @用於獲取操做數的內存地址,@後面的操做數能夠是變量、過程和函數等。
無類型指針:<指針變量名>:Pointer;無類型的指針的做用是它能夠指向任何類型 ,對於無類型指針,不能用指針變量符號後加^的形式來引用它的動態變量。
開闢動態存儲單元:
new(指針變量) 系統自動開闢存儲單元把地址賦給指針變量
dispose(指針變量) 釋放所指向的存儲單元
引用動態存儲單元 <指針變量>^
對指針變量的操做:
相互賦值
p1:=ni1 指針的值爲空
比較運算
GetMem(<指針變量名>,<區域大小>);
FreeMem(<指針變量名>);
利用指針構建鏈表結構:
type pointer=^ rec;
rec=record
data: integer;
next:pointer;
end;
var head:pointer;
插入:
New(m);
read(m^.data);
m^.next:=q;
p^.next:=m;
刪除:
q^.next:=p^.next;
dispose(p);
文件:
分爲:文本文件、有類型文件、無類型文件
適用於各類文件的操做:
一、文件變量與外部文件創建聯繫
procedure AssignFile(var F;FileName:string);
二、文件變量與外部文件中斷聯繫
procedure ClsoeFile(var F);
三、以讀方式打開文件(Reset)
procedure Reset(var F[:File;RecSize:Word]);文件不存在會報錯
四、以寫方式打開文件(Rewrite)
procedure Rewrite(var F:File[;Recsize:Word]);建立並打開新文件
五、刪除文件procedure Erase(var F);
適用於文本文件的操做:
本文件由若干行組成, 行與行之間用行結束標記隔開, 文件末尾有一個文件結束標記
只能順序地處理文本文件, 並且不能對一文本文件同時進行輸入和輸出
自動轉換功能
文本文件的每個元素均爲字符型,但在將文件元素讀入到一個變量
(整型, 實型或字符串型) 中時, Pascal 會自動將其轉換爲與變量相同的數據類
型。與此相反在將一個變量寫入文本文件時,也會自動轉移爲字符型
一、以添加方式打開文件(Append)
Procedure Append(var F:Text);打開已存在的文件
二、用Read過程讀取數據
procedure Read([var F:Text;]V1[,V2,…,Vn]);
三、用Readln過程讀取數據。
procedure Readln([var F:Text;]V1[,V2,…,Vn]);
四、用Write過程寫入數據。
procedure Write([var F:Text;]P1[,P2,…,Pn]);
五、用Writeln過程寫入數據
procedure Writeln([var F:Text;]P1[,P2,…,Pn]);
有類型文件:
有類型文件是一種具備必定數據類型的文件,它是由指定數據組成,讀寫過程所操做對象的單位是一個指定類型的數據
二進制格式存貯
訪問既能夠順序方式也能夠用隨機方式
聲明:
Type fileTypeName=file of type
一、有類型文件的讀取和寫入方法
容許同時爲讀和寫打開
procedure Read(F,V1[,V2,…,Vn]);
procedure Write(F,V1,…,Vn);
無類型文件:
數據直接在磁盤文件和變量之間傳輸, 省去了文件緩解區, 所以比其它文件少佔內存,主要用來直接訪問固定長元素的任意磁盤文件
無類型文件無固定的數據結構,可由使用者決定每一個數據記錄的長度
Var DataFiel:file;
在對無類型文件用Reset和Rewrite過程打開時,可帶有第二個參數,用來講明數據記錄的長度,若是默認則爲128B
讀寫:
procdure BlockRead(var F:File;var Buf;Count:Integer[;var AmtTransferred:Integer]);
procdure BlockWrite(var F:File;var Buf;Count:Integer[;var AmtTransferred:Integer]);
buf:存儲數據 count:每次讀寫記錄個數 amttransferred:實際讀寫的記錄個數
文本文件的定義:
var F1,F2:text;
和外部文件創建聯繫:
ASSIGN(F1,`FILEIN.DAT`)
打開文件
REWRITE(f);建立並打開新文件
Append(f);打開已存在的文件
對文件進行寫操做:
WRITE(f, <項目名>)
WRITELN(f, <項目名>)
關閉文件:
CLOSE(f);
讀文本文件:
READ(f, <變量名錶>) READLN(f, <變量名錶>);
EOLN(f):回送行結束符
EOF(f):回送文件結束符
面向對象基礎:
單元:
一個可供使用的各類標準程序、子程序、文件以及它們的目錄等信息的有序集合
引用單元 uses+單元
{$}
@運算符放在變量前面將獲取變量的地址
b:byte(c);強制轉換 當兩個變量數據長度同樣時才能強制類型轉換
類的定義:
構建類的實例:Worker:= Tworker.Create;
釋放對象:Worker.Free;
類成員有三類:Field(字段)、Method(方法)、property(特性)
方法的聲明:
Procedure (方法名)([<參數表>]);
Function (方法名)([<參數表>]):<返回值類型>;
方法可分爲4種類型,分別是構造、析構、過程和函數,它們分別用Constuctor、Destructor、Procedure、Function這4個符號來聲明。
構造:
Constructor<構造名>([<參數表>]);
構造名能夠是任何合法的標識符,不過按照Delphi的習慣,構造名常使用Create
通常方法只能在對象實例中引用,而構造既能夠由一個對象實例引用,也能夠直接由類來引用。
析構的聲明格式爲:
Destructor<析構名>([<參數表>]);
按照習慣,析構名常使用Destroy
析構的做用跟構造正相反,它用於刪除對象並指定刪除對象時的動做,一般是釋放對象所佔用的堆和先前佔用的其餘資源
type
TForm1 = class//T開頭表示類
Name: String;
Age: Integer;
Constructor Create();
procedure Button1Click(Sender: TObject);
end;
Constructor Create();
begin
Name:='myself';
Age:=20;
End;
Aman:=Tmember.Create();//爲對象分配內存並初始化
Aman.Free;//釋放資源 不要直接調用Destroy() Free()首選進行檢查保證這個對象實例不爲NIL,而後調用對象的析構方法Destroy()。
全部定義的類派生自Tobject類
TForm1 = class(TForm)//括號後面是父類 繼承的寫法
存取控制符:
public:關鍵字public後面聲明全是公有類型,直到遇到另外一種存取控制符
private
protected
published:設計和運行期間均可以訪問,權限最高
automated:和public基本相同,區別在會生成OLE自動化操做的類型信息
靜態方法:
除非特別指明,不然聲明的方法都是靜態方法,好處是啓動速度快,派生類訪問同一個靜態方法的地址,不能重載
若是你在派生類定義一個與祖先類相同名的靜態方法,派生類的靜態方法只是替換祖先類的靜態方法
虛擬方法:地址在容許其由定義方法的對象來尋址
在聲明後面加virtual,派生類修改父類仍可使用,VMT虛擬方法表:保存着類類型的全部虛擬方法地址。
聲明結尾加overide重寫
動態方法:不進VMT,由編譯器給它一個索引號 加Dynamic
消息句柄方法:在方法定義時加上一個message指令字,就能夠定義一個消息句柄方法。消息句柄方法主要用於響應並處理某個特定的事件
抽象方法:
首先必須是虛擬的或動態的,其次它只有聲明而沒有定義,只能在派生類中定義它(重載)
Procedure <方法名>([<參數表>]);Virtual/dyname;abstract;
Function <方法名)([<參數表>]);Virtual/dyname;abstract;
重載方法:override
只有在祖先類中定義對象方法爲虛擬後,才能進行重載。不然,對於靜態對象方法,沒有辦法激活滯後聯編,只有改變祖先類的代碼
重載虛擬方法,必須指定相同的參數並使用保留字override。
重定義方法:overload
對象能夠有多個同名的方法,這些方法被稱爲從新定義的方法(Overload)。
爲從新定義靜態對象方法,用戶只需向子類添加該對象方法,它的參數能夠與原來方法的參數相同或不一樣,而不須要其餘特殊的標誌。
重載override和重定義overload區別:
靜態不能重載 能夠重定義
抽象才能重載
重載參數相同 重定義參數能夠相同或不一樣
須要保留字override 不須要其餘特殊標誌
抽象類Abstract:派生類必須實現抽象方法,不然也是抽象類沒法實例化
類的特性:
聲明特性:特性名、特性的數據類型、讀寫特性值的方法
Property <特性名>:<類型>read<字段名>/<方法名> Write<字段名>/<方法名>;
特性限定符:Read,write,Stored和Default
Read限定符:
Read <字段名>/<方法名>
Wrire限定符:
Write <字段名>/<方法名>
Stored限定符:
Storetrue true/false[default<屬性缺省值>][nodefault]
特性重載,就是在祖先類中聲明的特性,能夠在派生類中從新聲明,包括改變特性的可見性,從新指定訪問方法和存儲限定符以及缺省限定符等
Property<特性名>;
類中能夠從新定義一個與祖先類具備相同名稱的屬性,重定義至關於聲明瞭一個新的屬性,該屬性隱藏了從祖先類中繼承的同名屬性。屬性聲明中是否聲明瞭屬性類型是區別覆蓋與重定義的惟一途徑。若是後代類中聲明的屬性帶有類型,那就是重定義。重定義一個屬性必需給出完整的定義。
無論在後代類中是經過重定義隱藏仍是覆蓋祖先類中的屬性,屬性的調用老是靜態的。
VCL:
可視化組件庫
該組件庫是一個類庫,包含了在Delphi程序設計中所用到的幾乎全部的組件類結構
Tobject類是全部其餘類的祖先
TPersistent是Tobject類的直接派生類,該類是一個抽象類,主要爲它的繼承者提供對流的讀寫能力
TPersistent類的直接派生類,該類是VCL中全部組件類的祖先類。該類定義了全部組件最基本的屬性、方法和事件。該組件類中包含可視的和不可視的組件
TControl直接派生於TComponent類,該類是全部在運行時可見的組件類的祖先類,該類中封裝了可見組件的運行位置等信息
異常基類:Exception Exception類則繼承自TObject類,它們全都定義於【Sysutils】
異常類其標識符的第一個字母都是「E」
有兩個基本屬性:
一、Exception.HelpContext
Type ThelpContext= -MaxLongint..MaxLongint;
Property HelpContext:ThelpContext;
它提供了與異常對象聯繫在一塊兒的上下文相關幫助信息的序列號。該序列號決定當發生異常時用戶按F1鍵顯示的一個異常錯誤的幫助信息。
二、Exception.Message
property Message: string
該屬性存儲異常發生時的錯誤信息。能夠經過該屬性在提示錯誤對話框中顯示錯誤信息字符串。
方法:
一、Exception.Create方法
Constructor Create(Const Msg: String);
二、Exception.CreateFmt
Constructor CreateFmt(Const Msg:String;Const Args:Array of Const)
帶有格式化字符串提示信息的對話框
三、Exception.CreatHelp
Constructor CreateHelp(Const Msg:String; AhelpContsxt:Integer) ;
該方法產生一個帶有一條簡單提示信息和上下文幫助序列號的提示對話框
異常控制語句:
try
語句1;
except
on 異常狀況1 do 處理語句1;
on 異常狀況n do 處理語句n;
else
處理語句;
end;
try
語句塊1
finally
語句塊2
end.
串口通訊: 經常使用的PC機都配置了RS-232C標準接口 串行通訊接口基本功能是:在發送時,把CPU送來的並行碼轉換成串行碼,逐位地依次發送出去;在接收時,把發送過來的串行碼逐位地接收,組裝成並行碼,並行地發送給CPU去處理。這種串行到並行轉換的功能,經常使用硬件電路來實現,這種硬件電路叫作串行通訊接口。 普通的Modem一般都是經過RS-232C串行口信號線與計算機鏈接 我的計算機的RS-232C接口名稱有多個:RS-232C口、串口、通訊口、COM口、異步口等