Delphi7用的是Windows開發語言,所以採用的是windows的工作機制。
其核心主要是三個:
1)視窗:作業系統連續地監視每一個視窗的活動或事件的訊號
2)事件:可以是使用者事件,也可以是系統事件
3)訊息:每發生一次事件,將引發一條訊息發送至作業系統。
對象是具有一定的屬性,方法,事件的實體。可以把屬性看作是對象的性質,把方法看作是對象的動作,把事件看作是對象的響應。
Delphi工程是由兩部分組成的:
第一部分是pascal的代碼他的儲存是.pas
第二部分是工程部分他的儲存方式是.dpr
一個代碼單元的結構:
unit FirstUnit; {1單元頭部分,指明了單元檔案名稱為FirstUnit.pas}
interface {2介面定義部分}
uses {使用單元部分}
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type {型別宣告部分}
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var {變數聲明部分}
Form1: TForm1;
implementation {3實現部分}
{$R *.dfm} {編譯器指令,用於尋找資源}
initialization {4初始化部分}
finalization {5結束部分}
end.
一般地,單元檔案由單元頭部分(unit),介面定義部分(interface),實現部分(implementation),初始化部分(initialization),結束部分(finalization)五部分組成.
1. 單元頭部分(unit):指出了單元的檔案名稱,單元名必須與檔案名稱同名
2. 介面定義部分(interface):宣告類型,常量,變數,函數和過程的地方.由uses,型別宣告(type),變數聲明(var)介面部分只能聲明不要把實現放入.對於可見域的說明會在後面說到!
3. ,實現部分(implementation):包含在介面部分聲明的函數和過程代碼.
4. 初始化部分(initialization):只在程式開始時運行一次,相當於C++的建構函式
5. 結束部分(finalization):這是在對象結束時啟動並執行,相當於C++的解構函式,是一個和構造
反向析構的過程.
程式調試:
Delphi7提供了一個功能強大的整合調試器(Integrated Debugger)
異常處理:
“產生異常”表示程式運行中發生錯誤,並建立異常對象(包含該錯誤的資訊及發生的時間和位置)來響應錯誤.異常對象的基類是Exception,它是在單元SysUtils中定義的.
1. 結構化異常處理
基本結構是try..except..end;
try
測試代碼語句;
except
on 異常1 do 異常1的響應語句
on 異常 2 do 異常2的響應語句
…….
end;
可能包含錯誤的代碼放在關鍵字try的後面,對異常的處理放在except的後面
2.
try…finally
不管try是否有異常finally都會運行
Delphi_day02
常量、變數與資料類型
一、資料類型:
1.數實值型別:用來儲存各種數值形式的資料,分為兩類:整型和實型
整數類型 位元組數 實數類型 位元組數
Integer 4 Single 4
Shortint 1 Real 8
Smallint 2 Double 8
Longint 4 Currency 8
Int64 8 Extended 10
Byte 1 Read48 6
Word 2 Comp 8
Longword 4
Cardinal 4
2. 字元和字串類型
字元類型用來儲存各種字元形式的資料,分為兩大類:字元型和字串型
字元型 位元組數 字串類型 最大長度
Char 1 String 4-2G
AnsiChar 1 ShortString 2-256
WideChar 2 AnsiString 4-2G
WideString 4-2G
3. 邏輯類型
邏輯型又稱為布爾型,是用來儲存邏輯值的資料類型
邏輯類型 位元組數
Boolean 1 0(false) 1(true)
ByteBool 1 0(false) !0(true)
WideString 2 0(false) !0(true)
LongBool 4 0(false) !0(true)
4. 強制類型轉換:
ObjectPascal是一種強型別的語言,既不同資料類型的資料之間不直接進行賦值操作,而且一種資料類型的資料也不能直接參与其他類型的運算
類型轉換函式 作用
IntToStr(Value:Integer) 將整型和長整型資料分別轉換為字串
IntToStr(Value:Int64) string
floatToStr(Value:Extended) 將實型(Real)資料轉換為字串型string
StrToFloat(const S:string) 將字串型資料轉換為實型Real
strToInt(const S:string) 將字串型資料分別轉換為整型和長整型
StrToInt64(const S:string)
以上的轉換都是從一個位元組或長度比較大的類型作為參數來進行轉換的這裡是為了強制類型轉換服務的。
注意:同一類型較長的類型轉製為較短的類型時,系統會進行自動截取,可能會影響資料的精度,對於不同類型資料轉換為強型別,如果必須強型別資料轉換為弱類型資料就要用到截斷函數Trunc(一個參數)或Round(一個參數)
二、常量與變數:
1.在程式中有兩種資料類型:一種在程式運行過程中的值保持不變,稱為常量,一種是程式運行過程中的值可以改變,稱為變數。
標識符:
是由字母或底線打頭的其他字元可以是數字和字母
不區分大小寫。
常量包含:常數常量和符號常量
符號常量:
Const
<常量名1>: [<類型名>]=<常量值1>
………
類型名可以不用寫,注意在這裡常量賦值和普通賦值時不一樣用的是”=”號而不是”:=”
2.變數:
變數的類型決定相應的記憶體空間的大小和格式,變數的取值即相應的記憶體空間所儲存的資料值,變數必須先進行聲明,然後才能使用。
Var
<變數名1>:<類型名1>
…………
注意:變數的定義必須在事件程序專門的常量、變數定義區,即第一個begin之前,同一行進行相同類型的聲明時中間用逗號分隔,變數有一個確定的值以後才能參加各種運算,還要注意有效泛圍。
三、範圍範圍:
標識符的範圍範圍從小到大包括3個等級,過程級、單元級和程式級
過程的內部變數即begin之前的變數只作用於過程。
寫在implementation的變數只作用於此單元
在interface的變數可以作用於所有工項下的單元,前提把其他要引用的加入到uses子句中,再用<單元名>.<標識符>來引用。
重定義標識符,即在更大的範圍中用過的標識符在其內部如過程級中重新有一個同名標識符,這個標識符會把更大的範圍中的標識符暫時隱藏起來。
四、進階資料類型:
1.枚舉類型的定義和聲明及應用函數:
先對枚舉類型進行定義:
Type
<枚舉類型名>=(<標識符1>,<標識符2>,<標識符3>,<標識符4>,……);
說明: type是系統的保留字,表示定義進階資料類型的開始,<枚舉類型名>是使用者自己定義的枚舉類型的名稱,<標識符>列舉出該類型中的所有資料元素,稱為枚舉常量,枚舉常量用逗號隔開。不允許重複定義,出不允許同時出現在不同的枚舉類型定義中。
聲明:
var
<標識符名>:<枚舉類型名>;
函數應用:
枚舉內的標識符都是有順序的從0到始,所以在得到枚舉的值有一套函數:
如下:
枚舉函數 功能 調用格式
Ord 求枚舉序數 ord(枚舉常量或枚舉變數)
Pred 求前驅值 。。。
Succ 求後繼值 。。。
Low 求第一個枚舉常量 Low(枚舉類型名)
Hight 求未一個枚舉常量 ….
2.子界類型的定義和聲明及注意
子界類型是有確定的資料類型、且取值範圍固定的資料集合。子界類型必須是某種順序類型的子集,所以稱其相應的順序類型為基底類型。
定義:
Type
<子界類型名>=<常量1>…<常量2>;
說明:<子界類型名>是使用者定義的子界類型的名稱,<常量1>表示子界類型的下界,即最小值,<常量2>表示子界類型的上界,即最大值,子界上界必須小於下界的,還必須是同一類型的。
例子:
Lowercase=’a’..’z’;
Month=(Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);
Sping=Feb..May;
聲明:
Var s1,s2:spring;
注意:
在調試階段子界所賦的值會進行檢查,在運行階段子界的值不一定會進行檢查。
3.集合類型:
這裡的集合就是一個數學上集合的定義他有幾個特徵如下:
1)互異性,集合中的元素是可以相互區分的,完全相同的元素視為同一個元素。
2)無序性,集合中的元素沒有順序,可以隨機排列。
3)有限性,一般意義下的集合元素個數可以是元限的,但是在這裡規定集合的元素個數不能超過256個
集合的定義:
Type
<集合類型名>=set of<基底類型>;
其中,<集合類型名>是使用者集合類型的名稱,<基底類型>表示集合中各元素的資料類型。在這裡教室:集合類型的<基底類型>必須是順序類型中的字元型、邏輯型、枚舉型和子界型,而不能是整形和其他資料類型。同時元素不能超過256個。
例如:
Type
Uppercase=’A’..’Z’;
Uchars=set of uppercase;
Month=(Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);
Vacation=set of Month;
集合變數的聲明:
Var
SumVac,WinVac:vacation
也可以不經過定義就用子界
Var
N1,n2:set of 1..100;
集合變數的取值:
集合變數不同於其他變數,它不是一個單獨的元素,而是一系列元素的一個集合。集合變數的取值稱為集合值,基一般表現形式如下:
[<元素1>,<元素2>,<元素3>,<元素4>。。。。];
集合類型的運算:
其實就是數學上的交、並、差運算
運算名稱 表示方式 運算結果 是否滿足交換律
並運算 S1+S2 兩個集合中所有不重複元素集合 是
交運算 S1*S2 兩個集合所共有的元素集合 是
差運算 S1-S2 所有屬於S1不屬於S2的集合 否
相等運算 S1=S2 元素全相等true 是
不等運算 S1<>S2 元素全不相等true 是
包含運算 S1>=S2 S2的元素全在S1中true 否
被包含運算 S1<=S2 否
屬於運算 X in S1 元素X在S1集合中true 否
4.數群組類型:
數組(Array)是數目固定、類型相同的若干個元素的有序集合,提供的資料分為靜態數組和動態數組。
a) 靜態數組
靜態數組在程式初始化時必須分配記憶體單元,明確其固定的大小和元素的資料類型
定義:
Type
<數群組類型名>=array[<下標集合1>,<下標集合2>] of <基底類型>
<下標集合1>表示數組第一維的大小,<下標集合2>表示數組第二維的大小。。。。。。
例如:
Type
MyArr1=array[1..5] of real; //一維數組
MyArr2=array[1..3,0..2] of integer; //二維數組
聲明:
Var
Arr1:MyArr1;
也可以
Arr2:array[1..3,0..2] of integer;
注意:因為一個陣列變數對應多個數組元素,所以陣列變數不能直接參加運算,也不能直接賦值,只有單個數組元素才可以參加運算,運算的類型取決於數群組類型的基底類型。
b) 動態數組:
動態數組在定義和聲明時僅指定數組的類型,而不指定數組的大小。
定義:
Type
<數群組類型名>=array of array of ..array of<基數型>
例如:
Type
MyArr4=array of integer;{一維動態數組}
MyArr5=array of array of real;{二維動態數組}
或
Arr4:MyArr4;
Arr5:array of array of char;
在使用動態陣列變數之前,要先調用標準流程SetLength來確定數組的大小,例如:
SetLength(arr4,3); {指定arr4有3個元素}
SelLength(arr5,2,3); {指定arr5的每一維大小為2,第二維大小為3}
此外允許建立一種特殊的多維動態數組,除第一維外,其他維的大小不固定
Var
Arr6:array of array of integer;
Begin
SetLength(arr6,2);
SetLength(arr6[0],2);
SetLength(arr6[1],3);
End;
5.記錄類型
記錄在這裡好比C++的結構體!
記錄類型(Record)可以將資料類型不同的資料集中在一起,並作為一個整體進行操作。
記錄類型的定義:
Type:
<記錄類型名>=Record
<網域名稱表1>:<類型1>;
<網域名稱表2>:<類型2>;
….
End;
其中,<記錄類型名>是使用者定義的記錄類型的名稱,<網域名稱表>中可以是多個合法的發網域名稱標識符,網域名稱又稱為欄位名,<類型>可以是任意的資料類型。同一個記錄類型中不能有同名的欄位,而因為範圍不同,記錄內的欄位名與記錄外的標識符可以相同。
例如:
Type
Student=Record
Id:integer;
Name:string[8];
Sex:char;
End;
聲明:
Var
<記錄變數名>:<記錄類型名>
記錄域的訪問:
<記錄變數名>.<欄位名>
使用With語句
With <記錄變數名>Do<語句>
<語句>可以是簡單語句,也可以是複合陳述式。在語句中,對欄位的訪問不需要加記錄變數名進行限定
With stu2 do
Begin
Id:=2;
Name:=’SB’;
Sex:=’F’;
End;
6.指標類型:
指標是一種特殊的資料類型,指標類型(Pointer)的變數稱為指標變數。指標變數具有一般變數的三個基本要素,即變數名、變數類型、變數值,它與一般變數的不同之外在於:指標變數是用來存放其他變數的記憶體位址的一種變數。
指標變數的聲明:
Type
<指標類型名>=^<基底類型>;
基底類型也可是進階資料類型如記錄型
聲明:
Type
PtrInt=^Integer
Var
P1,p2:PtrInt;
也可以
P4,p5:^Integer;
指標變數的賦值:
與普通的變數一樣,聲明了指標變數之後,編譯器將給指標變數分配記憶體單元,但記憶體單元中的值尚未確定,需要通過賦值操作來實現。格式如下:
<指標變數名>:=@<標識符>
@是一元操作符,用於擷取運算元的記憶體位址,@後面的運算元可以是變數、過程、函數等.
Var
N:integer;
P:^integer;
P:=@N;//為指標變數賦值
P^:=3;//“p^”來表示p所指向的記憶體單元
無類型指標變數:
聲明格式如下:
<指標變數名>:Pointer;
Type
pInt=^integer;
Var
P1:pInt;
M:integer;
N:real;
pAny:Pointer;
begin
pAny:=@M;
pAny:=@N;
p1:=Pint(pAny);//將無類型指標PAny轉換為整型指標類型p1
p1^:Random(n);//這時才可以用p^進行操作
end;
對於無類型指標p,不能使用”p^”的形式來引用它指向的變數。如果要引用無類型指標指向的變數,必須將其轉換成確定的類型。
指標變數的動態使用:
a) 指標變數的動態使用:
i)New 過程和Dispose過程
如果不使用@運算子為指標變數賦值,則指標變數稱為動態指標變數,動態變數在訪問之前必須首先分配記憶體單元。在此提供了標準流程New,用來為動態變數分配記憶體單元,並把該單元的地址賦給指標變數,所配置單位的大小由指標所指的類型決定,調用New過程的格式如下:
New(<指標變數名>);
當程式不再需要使用動態變數時,就調用標準流程Dispose刪除New建立的動態變數,並釋放所分配的記憶體單元。調用Dispose過程如下:
Dispose(<指標變數名>);
例如:
Var
P:^integer;
Begin
New(p);
P^=10;
Dispose(p);
End;
ii)GetMem過程和FreeMem過程
標準流程GetMem用於為動態變數分配一塊指定大小的記憶體地區,並把該地區的初始地址賦給指標變數。
GetMem(<指標變數名>,<地區大小>);
如果程式不再需要使用動態變數時,就調用標準流程FreeMem刪除GetMem建立的動態變數,並釋放所分配的記憶體單元。調用FreeMem過程的格式如下:
FreeMem(<指標變數名>);
New與GetMem的區別在於New是把自己的地址賦給自己,而GetMem是分配一塊指定大小的記憶體地區,把這個地區的初始地址給他,這個地址就很有可能不是自己了!
字元指標類型:
為了與Windows和C的字串相容,Object Pascal 提供了一種Pchar字元指標類型。pChar指標是一個指向以NULL字元結尾的字串指標。
Var
P:pChar;
Begin
p:=’Delphi7’;
End;
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/dingdingko/archive/2008/04/09/2267583.aspx