單元 程式頭:uses(子句列出了那些連結到程式的單元),block(聲明,命令語句)
一個程式包括:
• 一個程式頭(program heading)
• 一個uses 子句(可選),和
• 一個包含聲明和命令語句的塊(block)
一個單元以單元頭(unit heading)開始,後面跟interface、implementation、initialization
和finalization 部分,後面兩個部分是可選的
一個uses 子句可以出現在:
• 程式或庫的工程檔案
• 單元的介面部分,和
• 單元的實現部分
在單元聲明以及uses 子句中(尤其是在Linux 下),單元名稱必須和檔案名稱大小寫一致。在其它情
況(比如使用限定符的標誌符),單元名是大小寫無關的。要避免在單元引用中出現問題,要明確指出單元檔案:
uses MyUnit in "myunit.pas";
如果像上面這樣在工程檔案中明確引用一個單元,在其它源檔案中就可以像下面那樣簡單地引用它,
而不必考慮大小寫問題:
uses Myunit;
uses 子句給編譯器提供各模組間的依賴資訊,因為這些資訊是存於模組自身的,所以,Object Pascal
程式不需要makefile 檔案、標頭檔以及include 預先處理指令(這些概念你可能要參考C 語言)。每當一個
工程調入IDE 時,Project Manager 建立一個makefile,但只有在包含多個工程的工程組中才儲存這些文
件。
• 單元源檔案 ( .pas)
• 工程檔案 ( .dpr)
• 封裝來源檔案 ( .dpk)
• 表單檔案,副檔名為 .dfm(Delphi)或 .xfm(Kylix)
• 資源檔,副檔名為 .res (已經編譯的資源檔)
• 工程選項檔案,副檔名為 .dof(Delphi)或 .kof(Kylix)
要改變程式的表徵圖,可使用Project Options 對話方塊。
<Leo> 在表單設計器上右擊彈出PopMenu有View as Text項,可察看事件和過程的關聯
事件控制代碼通過表單檔案(Windows 下是 .dfm,Linux 下是 .xfm)賦給指定的事件
空格(#32)和控制符(#0 到#31,其中#13 叫斷行符號符或行的結束符)被稱為空白符(blank)。
特殊符號是非文字和數字字元,或這類字元的組合,它們有固定的意義。
‘[’相當於‘(.’,‘]’相當於‘.)’;‘(*’和‘*)’分別相當於‘{’和‘}’(表示注釋)。
,!(驚歎號)、 ”(雙引號)、 %(百分比符號)、 ?(問號)、 /(反斜線)、 _(底線)、 |(通道)和 ~(破折
號)不是特殊符號
$首碼表示一個16 進位數字,比如$8F
標籤是一個不超過4 位的阿拉伯數字序列,也就是從0 到9999,打頭的0 沒有意義
。若單引號中沒有內容(’’),它被稱為空白串(null string)。在一個引用串中,兩個連續的單引號(’’)表示一個字
符,也就是單引號本身(’)
控制串由一個或多個控制字元(控制符)所組成,每個控制符包含一個#,後跟一個不帶正負號的整數(10
進位或16 進位),整數的範圍從0 到255,表示相應的ASCII 字元。下面的控制串
#89#111#117
就相當於引用串
’You’
運算子包括:@ not ^ * / div mod and shl shr as + - or xor = > < <> <= >= in 和 is。
一些運算子的行為因為傳給它們的資料類型不同而不同。比如,not 運算子用於整數時,是對它的
位進行求反運算,而對布爾類型進行邏輯非運算。
除了 ^ ,is 和 in,其它運算可應用在Variant 類型上。
• 不管x 和y 的類型是什麼,x/y 的結果總是擴充類型(extended);對其它運算子,只要有一個
運算數是實數類型,它的結果就是擴充類型;另外,只要有一個運算數是Int64 類型,它的結果就是Int64 類型;否則
,結果就是整數類型。如果一個運算數是整數的子界類型,它就像整數類型一樣被對待。
• x div y 的值取整數,也就是取得x/y 的值,然後以0 的方向取得最近的整數。
• mod 運算返回對運算數進行整數除後得到的餘數。換句話說,就是x mod y = x - (x div y)*y。
布林運算子not、and、or 和xor 作用於任何布爾類型的運算數,並返回一個布爾類型的值。
使用 $B 編譯器指示字控制計算方式,預設狀態是 {$B-},它採用部分計算。要在局部進行完全計
算,在代碼中使用 {$B+} 指示字。你也可以在Compiler Options 對話方塊中選擇Complete Boolean
Evaluation 選項,此時在整個專案範圍使用完全計算。
<Leo>///部分計算 equals 短路計算 in C++/C#
若任何一個運算數是variant 類型,編譯器總是進行完全計算(即使在 {$B-} 狀態下)
Logical (bitwise) operators(位邏輯運算子):not and or xor shl shr
• 位反(not)運算的傳回型別和運算數相同;
• 若and、or 或xor 的運算數都是整數類型,則它的傳回型別是包含運算數所有可能的值、且範圍最小的預定義(內建
)整數類型;
• 運算 x shl y 和 x shr y 把 x 的值向左或向右移 y 個位,也就等同於 x 乘或除以 2^y(2的 y 次方),傳回型別
和 x 相同。比如,若 N 儲存的是01101(10 進位的13),那麼 N shl 1 返11010(10 進位26)。注意,y 的值被解釋
為對 x 所屬類型大小(位元)進行模運算,比如,若 x 是一個integer,x shl 40 被解釋為 x shl 8,因為integer
的大小是32 位(4位元組),40 mod 32 等於8。
關係運算子 =、<>、<、>、<= 和 >= 都能對字串進行操作 + 運算子串連兩個字串
• + 運算子的運算數可以是字串、packed string(packed arrays of type Char)或字元。但是,若其中一個運算數
是寬字元(WideChar)類型,其它運算數必須是長字串。
• + 運算子的返回結果和任何字串類型是相容的。但是,若運算數都是短字串或字元,並且它們的組合長度大於255
,則返回結果取前面的255 個字元。
關係運算子 <、>、<= 和 >= 能對PChar 類型進行操作。其它的指運算子:+- 指標加減 ^ 取得指標所指的內容 = <>
等於 不等於
對於Pointer 類型,在dereference 之前必須進行類型轉換。
• 若I 是一個整數,P 是一個字元指標,那麼P + I 是把P 的地址加上I,也就是一個指向P 後面
第I 個字元處的指標(運算式I + P 等同於P + I);P – I 是把P 的地址減去I,也就是一個指向P
前面第I 個字元處的指標。
• 若P 和Q 都是字元指標,那麼P – Q 計算P 的地址(高地址)和Q 地址(低地址)之差,也就
是返回一個表示P 和Q 之間字元數目的整數。P + Q 沒有意義。
Set operators(集合運算子):
+並集 - 差集 * 交集 <= 小於等於(子集)>= 大於等於(超集) =等於 <>不等於 in 成員關係
以下規則適用於 +、– 和 * 運算子:
• 若且唯若序數(集合基礎類型中的一個值)O 屬於集合X 或集合Y(或同時屬於X 和Y)時,
O 屬於X + Y;若且唯若O 屬於X 但不屬於Y 時,O 屬於X – Y;若且唯若O 同時屬於X 和Y
時,O 屬於X * Y。
• +、– 和 * 的運算結果屬於集合類型set of A..B,這裡A 是結果中的最小序數,B 是結果中的
最大序數。
以下規則適用於 <=、>=、=、<> 和 in 運算子:
• 只有當X(集合)中的每個成員也是Y(集合)中的成員時,X <= Y 才為真;Z >= W 等同於
W <= Z;只有當U(集合)和V(集合)正好擁有相同的成員時,U = V 才為真,否則U <> V
為真;
• 對於序數O 和集合S,只有當O 是S 的一個成員時,O in S 才為真。
• 除了實數和整數能一起比較外,兩個運算數必須是相容的類型;
• 對字串進行比較,是依據它的每個字元在擴充ASCII 字元集中的順序,字元類型被當作長度
為1 的字串;
• 兩個packed string 要進行比較,它們必須具有相同數目的元素;一個具有n 個元素的packed string
與一個字串比較時,它被看作長度為n 的字串;
• 只有當兩個PChar 指標都指向同一個字元數組的範圍內時,<、>、<= 和 >= 運算子才能作用
於它們;
• 運算子 = 和 <> 能以類或類參考型別作為運算數。當用於類類型時,= 和 <> 的計算規則與
指標一樣,只有當C 和D 指向同一個執行個體對象時,C = D 為真,否則C <> D 為真;當用於類
引用時,只有當C 和D 表示同一個類時,C = D 為真,否則C <> D 為真。
as 和 is 運算子使用類和對象(執行個體)作為運算數,as 也用於介面類型。
@ 運算子返回一個變數、函數、過程或方法的地址,也就是說,@ 運算子構建一個指向運算數的
指標。
• 若X 是一個變數,@X 返回X 的地址(當X 是一個過程類型的變數時有特殊的規則,請參考語
句和運算式中的過程類型)。若預設的編譯器指示字 {$T–} 在起作用,則@X 的類型是
Pointer(通用指標);在 {$T+} 狀態下時,@X 的類型是 ^T,這裡T 是X 的類型;
• 若F 是一個常式(一個函數或過程),@F 返回F 的進入點,@F 的類型總是Pointer;
• 當 @ 作用於類的方法時,必須使用類名來限定方法名。比如
@TMyClass.DoSomething
它指向TMyClass 的DoSomething 方法。
Set constructors(集合構造器)
[5, 6, 7, 8]
[ 5..8 ]
[red, green, MyColor]
[1, 5, 10..K mod 12, 23]
[’A’..’Z’, ’a’..’z’, Chr(Digit + 48)]
集合構造器[]表示空集
字串、數組、數組屬性以及指向字串或數組的指標能被索引。比如:FileName[21]
強制類型轉換的文法是
typeIdentifier(expression)
若運算式是一個變數,結果被稱為variable typecast(變數轉換);否則,結果是一個value typecast(值轉換)。雖
然它們的文法相同,但它們有不同的轉換規則。
在值轉換中,類型標誌符和轉換的運算式必須都是有序類型或指標類型。值轉換的例子包括
Integer(’A’)
Char(48)
Boolean(0)
Color(2)
Longint(@Buffer)
聲明的文法以及聲明的位置取決於要定義的標誌符的種類。通常,聲明只能出現在塊(block)的開始處,
以及單元的介面或實現部分的開始處(在uses 子句之後)。
Hint 指示字platform、deprecated 和library 能附加在任何聲明之後。在聲明過程或函數的情況下,應
使用分號把hint 指示字和聲明的其它部分分開。比如:
procedure SomeOldRoutine; stdcall; deprecated;
var VersionNumber: Real library;
type AppError = class(Exception)
...
end platform;
當原始碼在{$HINTS ON} {$WARNINGS ON}狀態下編譯時間,對使用上述指示字聲明的標誌符的每個引
用都將產生一個適當的提示或警告。使用platform 標記一個條目和特定的作業系統(比如Windows 和
Linux)相關;使用deprecated 表示條目已經廢棄或支援它僅為了向後相容性;使用library 表示依賴於
特定的庫或組件架構(比如VCL 或CLX)。
指派陳述式的格式如下
variable := expression
這裡,variable 是任何變數引用,包括變數、變數類型轉換、解除引用的指標,或者一個結構變數的組
成部分;expression 是任何一個賦值相容的運算式。(在函數塊中,variable 能被函數名取代,參考Procedures
and functions。
當啟用擴充文法時({$X+}),調用函數也可以像調用過程那樣 當這樣調用函數時,它的傳回值被忽略。
goto label
label: statement
label label;
label label1, ..., labeln;
• 複合陳述式或with 語句只是簡單地執行一系列語句;
• 條件陳述式,也就是if 或case 語句,根據指定的標準,最多執行一個分支;
• 迴圈語句,包括repeat、while 和for 迴圈,重複執行一系列語句;
• 一組特殊的語句,包括raise、try...except 和try...finally 結構,用來建立和處理異常。
with 語句的文法是
with obj do statement
或
with obj1, ..., objn do statement
if 語句有兩種形式:if...then 和if...then...else
比如,
if J = 0 then
Exit
else
Result := I/J;
if J <> 0 then
begin
Result := I/J;
Count := Count + 1;
end
else if Count = Last then
Done := True
else
Exit;
Case Statements(Case 語句):
case selectorExpression of
caseList1: statement1;
...
caseListn: statementn;
else
statements;
end
case I of
1..5: Caption := ’Low’;
6..9: Caption := ’High’;
0, 10..99: Caption := ’Out of range’;
else
Caption := ’’;
end;
selectorExpression 是任何一個有序類型的運算式(字串無效),和C++一樣的。
。Object Pascal 有三種迴圈:repeat 語句、while 語句和for 語句。
使用Break 和Continue 過程來控制repeat、while 或for 語句的流程。
repeat 語句的文法是
repeat statement1; ...; statementn; until expression
比如:
repeat
Write(’Enter a value (0..9): ’);
Readln(I);
until (I >= 0) and (I <= 9);
while 語句的文法是
while expression do statement
比如:
while I > 0 do
begin
if Odd(I) then Z := Z * X;
I := I div 2;
X := Sqr(X);
end;
for 語句的文法是
for counter := initialvalue to finalvalue do statement
或
for counter := initialvalue downto finalvalue do statement
比如:for C := Red to Blue do Check(C);
一個塊包含一系列的聲明,後面跟一個符合語句。所有的聲明必須一起出現在塊的開始處,所以,塊的
形式是
declarations;
begin
statements;
end;
比如:
function UpperCase(const S: string): string;
var
Ch: Char;
L: Integer;
Source, Dest: PChar;
begin
...
end;
類型可以分為基本(fundamental)和一般(generic)類型。基本類型的範圍和形式是相同的,不管是基於何種CPU 和
作業系統;而一般類型的範圍和形式是平台相關的
大多數內建類型屬於基本類型,但少數整數、字元、字串和指標類型屬於一般類型。
在需要的時候使用一般資料類型是一個好注意,因為它們提供最佳化的效能和輕便性。
類型也可以分為簡單類型、字串類型、結構類型、指標類型、過程類型和變體類型。
下面的提綱顯示了Object Pascal 資料類型的分類:
simple簡單類型
ordinal有序類型
integer 一般(generic)整數類型是Integer 和Cardinal
基本整數類型包括Shortint、Smallint、Longint、
Int64、Byte、Word 和Longword
character 基底字元類型是AnsiChar 和WideChar。
一般字元類型是Char,它相當於AnsiChar。
Boolean 布爾類型為Boolean、ByteBool、WordBool和LongBool,Boolean是首選的
enumerated
subrange
real實數類型 Real48 Single Double Extended Comp Currency
string 字串類型 ShortString AnsiString WideString
structured
set
array
record
file
class
class reference
interface
pointer
procedural
Variant
(type identifier)
標準函數SizeOf 作用於所有變數和類型標誌符,它返回一個整數,表明儲存指定類型的資料所需要的內
存數(位元組)。
有序類型包括整數、字元、布爾、枚舉和子界類型。有序類型定義一個有次序的數值集合,除了它的第
一個值以外,其它每個值都有一個唯一的前驅值(predecessor);除了最後一個外,其它每個值都有一個
唯一的後繼值(successor)
Ord 有序類型運算式 序數值
Pred 有序類型運算式 運算式的前驅值
Succ 有序類型運算式 運算式的後繼值
High 有序類型的變數或標誌符 類型的最大值
Low 有序類型的變數或標誌符 類型的最小值
常式High、Low、Succ、Pred、Inc、Dec、IntToStr 和IntToHex 完全支援Int64 參數。
而且,Round、Trunc、StrToInt64 和StrToInt64Def 返回Int64 類型的值;
少數常式(包括Ord)根本不能對Int64 數值進行操作。
當把整數類型的最後一個值增大或把第一個值減少時,結果將回到整數類型的開頭或尾部
。內建函數Chr,返回一個在AnsiChar 或WideChar取值範圍內任意一個整數的字元值。比如,Chr(65)返回字母A。
<Leo>Inc()是什麼呢?
對ByteBool、WordBool 和LongBool 來說,若它的序數不為0,它就被認為是True。在一個需要Boolean類型的環境種,
編譯器自動把非0 值轉換為True。
在Object Pascal 中,布林運算式不能和整數或實數進行換算。所以,若X 是一個整數變數,語句
if X then ...;
會產生編譯錯誤
定義一個枚舉類型,使用下面的文法:
type typeName = (val1, ..., valn)
type Size = (Small = 5, Medium = 10, Large = Small + Medium);
比如:type Suit = (Club, Diamond, Heart, Spade);
在聲明變數時,可以直接使用(val1,…,valn)結構,它就像一個類型名稱:
var MyCard: (Club, Diamond, Heart, Spade);
子界類型表示其它有序類型(稱為基礎類型)的一個子集:它的形式為Low..High
• Extended 類型比其它實數類型有更高的精度,但不夠輕巧。當使用Extended 類型建立的檔案要跨平
台共用時,務必小心。
• Comp(computational)類型對Intel CPU 是最佳化的,表示為64 位元整數,但它被分類位實數類型,因
為它的行為不像有序類型(比如,你不能遞增和遞減)。保留此類型只是為了向後相容性,使用Int64
可獲得更好的效能。
• Currency 類型有固定的小數點,可以把在貨幣運算中出現的錯誤減到最少。It is stored as a scaled
64-bit integer with the four least significant digits implicitly representing decimal places. 當在賦值
語句和運算式中與其它實數類型混合使用時,它的值會自動除以或乘上10000。
在指派陳述式和運算式中,字串類型可以混合使用,編譯器自動進行所需的轉換。但對於過程或函數,
當使用引用方式傳遞字串時,類型必須正確。
在預設的{$H+}狀態下,編譯器把string(當它的後面沒有包含數位中括弧時)解釋為AnsiString;
使用{$H-}指示字把它解釋為ShortString。
標準函數Length 返回一個字串的字元個數;SetLength 設定一個字串的長度。
可以像數組一樣對字串使用索引。若S 是一個字串變數,i 是一個整數運算式,則S[i]表示S 中第
i 個字元(或者,嚴格說來,是第i 個位元組)。對於ShortString 或AnsiString,S[i]是AnsiChar 類型;對於
WideString,S[i]是WideChar 類型。語句 MyString[2] := ’A’; 把值A 賦給MyString 的第2 個字元。
若S 是一個ShortString 變數,Ord(S[0]),和Length(S)一樣,將返回S 的長度;給S[0]賦值,就像調用SetLength
,將改變S 的長度。
var MyString: string[100];聲明一個叫做MyString 的變數,它的最大長度是100 位元組,
標準函數High 和Low 能作用於short-string 類型名和變數,High 返回它的最大長度,Low 返回0。
AnsiString 類型又稱為長字串,它可以動態分配,並且長度只受記憶體限制。它使用8 位ANSI 字元。
長串變數是一個指標,佔據4 個位元組的記憶體。當變數為空白時(也就是長度為0 的字串),指標為nil,
此時,它不需要額外的記憶體
因為長串變數是指標,所以,兩個或更多的變數可以引用同一個值,而不必使用額外的記憶體。編譯器利
用這一點節省資源和進行快速賦值。只要一個長串變數被銷毀或賦給一個新值,原來的串(變數的前一
個值)引用計數減1,而新的值(如果有的話)引用計數加1。若引用計數為0,它的記憶體被釋放。這個
過程被稱為reference-counting。當使用字串索引改變其中的一個字元時,若字串的引用計數大於1,
將產生串的一個拷貝,這被稱為copy-on-write 機制。
WideString 類型是動態分配的、由16 位Unicode 字元所構成的字串。在大多數方面,它和AnsiString
相似。(註:寬字元串沒有引用計數,不支援copy-on-write 機制,但支援記憶體動態分配。)
在Win32 下,WideString 和COM BSTR 類型相容。
Object Pascal 支援單位元組和多位元組字元以及字串,適用的類型有:Char、PChar、AnsiChar、PAnsiChar
和AnsiString。對多位元組字串使用索引是不可取的,因為S[i]表示S 中第i 個位元組(不一定是第i 個字
符),但是,標準字串處理函數有多位元組版本,它們還實現了locale-specific ordering for characters(多
位元組函數的名稱通常以Ansi 開頭,比如StrPos 的多位元組版本是AnsiStrPos)。多位元組支援依賴於操作系
統和本地設定(current locale)。
Object Pascal 使用WideChar、PWideChar 和WideString 類型支援Unicode 字元和字串。
字串常量和類型PChar、PWideChar 是賦值相容的,後兩者表示指標,
它們指向一個以0 結尾的Char 或WideChar 字元數組。
一個字元指標(PChar 或PWideChar)可以像數組一樣使用索引。
結構類型包括集合、數組、記錄,也包括類、類引用(class-reference)和介面類型。
除了集合只能包含有序值以外,結構類型可以包含其它的結構類型,且結構的層次不受限制。
預設情況下,一個結構類型的值被圓整為字(word)或者雙字(double-word),這樣訪問起來更迅速。
當聲明一個結構類型時,可以包含關鍵字packed,這將對資料的儲存進行壓縮(並不是壓縮,只是不再
圓整資料,而保留它的自然結構)。比如:
type TNumbers = packed array[1..100] of Real;
使用packed 使資料訪問變慢,並且在使用字元數組的情況下,能影響類型相容性
集合(Set)是同一種有序類型的值的聚集,它們包含的值沒有內在的順序,且一個值在集合中包含兩次並沒有
實際意義。聲明:
type
TSomeInts = 1..250;
TIntSet = set of TSomeInts;
這等同於:type TIntSet = set of 1..250;
有了上面的聲明,你就可以像下面這樣構造集合了:
var Set1, Set2: TIntSet;
...
Set1 := [1, 3, 5, 7, 9];
Set2 := [2, 4, 6, 8, 10]
你也可以直接使用set of …構造直接聲明變數:
var MySet: set of ’a’..’z’;
...
MySet := [’a’,’b’,’c’];
靜態數群組類型以下面的格式聲明:array[indexType1, ..., indexTypen] of baseType
比如:var MyArray: array[1..100] of Char;
一個多維陣列是數組的數組,比如:
type TMatrix = array[1..10] of array[1..50] of Real;
就等價於
type TMatrix = array[1..10, 1..50] of Real;
可使用這樣的索引:MyMatrix[2,45],或像這樣:MyMatrix[2][45]。
packed array[Boolean,1..10,TShoeSize] of Integer; 等價於
packed array[Boolean] of packed array[1..10] of packed array[TShoeSize] of Integer;
標準函數Low 和High 作用於數群組類型(的標誌符)或變數,它們返回數組第1 個索引(類型)的最小
值和最大值;Length 返回數組第1 維的元素個數
一維、壓縮的(packed)、Char 類型的靜態數組稱為packed string,它和字串類型相容,也和其它具有
相同元素個數的packed string 相容。
array[0..x] of Char 類型的數組,是0 下標開始的字元數組,它用來儲存零結尾字串,並且和PChar 類
型相容。
給動態數組賦值或把它傳給SetLength函數時,它的內存被重新分配。
動態數組以下面的形式聲明: array of baseType
比如:var MyFlexibleArray: array of Real;
要取消動態數組的分配,給它的變數賦值nil,或者把變數傳給Finalize
不要對一個動態陣列變數使用運算子‘^’,也不要對它使用New 或Dispose 過程
若X 和Y 是同一類型的動態陣列變數,X := Y 使X 指向和Y 相同的數組(在這個操作之前,不必給X
分配記憶體)。不像字串和靜態數組,動態數組不會在被寫之前自動拷貝。
使用索引給動態數組賦值(比如,MyFlexibleArray[2] := 7),不會為數組重新分配記憶體;編譯時間,索引
邊界檢查也不會給出提示。
要截斷一個動態數組,把它傳給SetLength 或Copy,並把返回的值賦給陣列變數(SetLength 通常更快)
記錄(類似於其它語言中的結構)表示不同種類的元素的集合,每個元素稱為“欄位”,聲明記錄類型時
要為每個欄位指定名稱和類型。聲明記錄的文法是
type recordTypeName = record
fieldList1: type1;
...
fieldListn: typen;
end
比如:
type
TDateRec = record
Year: Integer;
Month: (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
Day: 1..31;
end;
只有在執行個體化時才進行分配,像下面的樣子:
var Record1, Record2: TDateRec;
Record2 := Record1; 把Record1 的值拷貝給Record2
也可以使用record ...構造直接聲明變數:
var S: record
Name: string;
Age: Integer;
end;
一個記錄類型能擁有變體部分,它看起來就像case 語句
type
TEmployee = record
FirstName, LastName: string[40];
BirthDate: TDate;
case Salaried: Boolean of
True: (AnnualSalary: Currency);
False: (HourlyWage: Currency);
end;
要聲明一個檔案類型,使用下面的文法:type fileTypeName = file of type