??xml version="1.0" encoding="utf-8" standalone="yes"?>
1.0 介
2.0 一般程式碼格式
2.1 ^格
2.2 邊界
2.3 Begin...End
3.0 Object Pascal
3.1 括號
3.2 保留字與關鍵?br />3.3 E序與函?br />3.4 變數
3.4.1 變數命名與格?br />3.4.2 區域變?br />3.4.3 全域變數
3.5 型態
3.5.1 大小寫慣?br />3.5.2 點數型?br />3.5.3 列舉型態QEnumerated TypesQ?br />3.5.4 Variant ?OleVariant 型態
3.5.5 i構型態
3.6 陌句(statementsQ?
3.6.1 if 陌?br />3.6.2 case 陌?br />3.6.3 while 陌?br />3.6.4 for 陌?br />3.6.5 repeat 陌?br />3.6.6 with 陌?/p>
3.7 i構化異常處?
3.7.1 try...finally
3.7.2 try...except
3.8 別QclassesQ?/p>
3.8.1 命名/格式
3.8.2 Ƅ位QFieldsQ?br />3.8.3 Ҏ QMethodsQ?/p>
命名/格式
靜態ҎQStatic MethodsQ?
虛擬/動態ҎQVirtual/Dynamic MethodsQ?
抽象ҎQAbstract MethodsQ?
屬性存取方法(Property-Access MethodsQ?
3.8.4 屬性(PropertiesQ?
4.0 檔案QFileQ?br />4.1 Project Files
4.2 Form Files
4.3 Data Module Files
4.4 Remote Data Module Files
4.5 Unit Files
4.5.1 一般單元結?br />4.5.2 一般用途的單元
4.5.3 元g單元
4.6 檔案表頭QFile HeadersQ?/p>
5.0 Forms and Data Modules
5.1 Forms
5.1.1 Form 型態命名標準
5.1.2 Form 實體命名標準
5.1.3 自動建立?Forms
5.1.4 建立 Modal Form 的函?/p>
5.2 Data Modules
5.2.1 Data Module 型態命名標準
5.2.2 Data Module 實體命名標準
5.3 Remote Data Modules
6.0 套gQPackagesQ?br />6.1 埯時期 v.s. a計時期套g
6.2 檔案命名標準
7.0 元gQComponentsQ?br />7.1 使用者自a元?br />7.2 元g實體命名慣例
7.2.1 元g型態字首QComponent Type PrefixesQ?br />7.2.2 元g修飾詞名E(Component Qualifier NameQ?/p>
8.0 補充說明
--------------------------------------------------------------------------------
1.0 介
這䆾文g修改?Delphi 5 Developer's Guide 裡面?coding standardsQ該文所的寫風D Borland 大致相同Q我在編寫這䆾文g時也做了微幅的修改,刪除一些不斷重複的字句Q例如,「某某名E在命名時應該與它的目的相符」這類一般性的原則Q只要是「命名」,不管是專案名E,檔案名稱Q元Ӟ函式Q變?...都應該取有意的名稱?/p>
這䆾文g不可能照到所有細Q但是比較重要的部分都提CQ另外一?"Delphi 5 元g型態字首" 則包含了元g命名的字首徏議清單,應該也有參考價倹{?/p>
依照文g中的規範來撰寫程式,不但可ɽE式比較清晰易讀Q也能夠讓整個開發團隊的E式風格保持一_這樣組成員在看別h的程式碼時會輕鬆一些。如果這些風格和你原有的習慣相差很大,或者你正好接手E護別h的程式碼Q以下工具可能對你有用處Q?/p>
DelForExp - 可以q你重新R排 Delphi E式{?/p>
GExperts - 包含a多提高 Delphi 生產力的工具Q其?Code Proofreader 能夠自動q你修正E式的大小寫失誤?/p>
2.0 一般程式碼格式
2.1.^格
每層的縮格為兩個空白字元,不要使用 Tab 字元QTools | Editor options 裡面?Use tab character 達R不要NQ,以免E式到了別台機器或用其他文字編輯器示、列印時C樣?/p>
2.2.邊界
邊界a定?80 個字元(此為 Delphi 預設|Q當E式太镯超過邊界時應予以折行,不過於那些剛好有一個英文字跨在邊界上的情Ş則可以通容。折行時請盡量斷在逗號或者運子後面Q折下來的那行程式碼應該要往右縮|兩個空白字元)?/p>
2.3.Begin...End
begin ?end 應該寫在新的一行,且兩者要齊。下面的W一個例子是錯誤的示,W二個是正確的:
for I := 0 to 10 do begin // 錯誤
for I := 0 to 10 do // 正確
begin
但是?begin 是接?else 後面時則可以破例寫在 else 後面Q?/p>
if (I > 9) thenbegin ...endelse begin SomeStatement;end;
當然Qelse 之後?begin 要寫在新的一行也可以?/p>
〔回目錄?/p>
--------------------------------------------------------------------------------
3.0 Object Pascal
3.1.括號
左括號的右邊和右括號的左邊不應該有空白,參考下面的例子Q?/p>
CallProc( AParameter ); // 錯誤
CallProc(AParameter); // 正確
3.2 保留字與關鍵?br />Object Pascal 的保留字與關鍵字應該全部都用英文寫?/p>
3.3 E序與函?br />3.3.1 命名/格式
函式名稱W一個英文字母應該大寫,其後使用 Camel-capped 格式以便於閱讀。以下是錯誤C範Q?/p>
procedure thisisapoorlyformattedroutinename;
適當的名E應該像下面這個:
procedure ThisIsMuchMoreReadableRoutineName;
函式名稱應該要能代表它的功能Q讓夠不看內部細q道該函式大概在做什麹{當函式埯了某項動作,我們通常會以一個動詞為首來命名Q例如:
procedure FormatHardDrive;
a定某個變數值的函式應該?Set 為字首:
procedure SetUserName;
取得某個變數值的函式應該?Get 為字首:
procedure GetUserName: string;
3.3.2 形式參數
格式
相同型態的參數應該合併在一個語句中Q?/p>
procedure Foo(Param1, Param2, Param3: Integer; Param4: string);
命名
參數名稱應該W合它們所代表的意。參數名E可以在前面加上大寫字母 'A'Q?/p>
procedure SomeProc(AUserName: string; AUserAge: integer);
?'A' 開頭的參數命名方式是一項不成文的慣例,這麼做可以避免當參數名稱和屬性或Ƅ位名稱相同時所造成的淆?/p>
參數順序
以下於參數順序的徏議在使用「暫存器呼叫慣例」時特別有幫助(在效能上Q?/p>
最常用的參數擺在第一位,較少用的參數依左臛_的順序排列?
作為輸入的參數放左邊Q作出的參數攑֏邊?
比較一般性的參數攑֜左邊Q比較特D的攑֏邊,例如Q?
procedure SomeProc(APlanet, AContinent, ACountry, AState, ACity);
以上關於參數排列的徏議可能會有許多例外情形,例如事g處理函式Q它^是會以 Sender 最為第一個參數?/p>
常數參數
如果參數g會被函式修改Q應該在參數前面冠上 constQ特別是以下這些型態Qrecord, array, ShortString, interface?/p>
名稱衝突
如果你用的兩個單元中有相同的函式名稱Q當你呼叫該函式時,被叫用的是在 uses 子句中排在後面的單元的函式。為了避免這種情況Q你可以明白地指呼叫哪個單元的函式Q例如:
SysUtils.FindClose(SR);
?/p>
Windows.FindClose(Handle);
3.4 變數
3.4.1 變數命名與格?br />變數名稱應和它們的目的相符?br />q圈控制變數通常?i, j ,k 來命名,當然你也可以用像?UserIndex 之類有意的名稱?br />布林變數的名E應該要能充分表?True ?False 的意思?/p>
3.4.2 區域變?br />函式的區域變數恨其他變數的命名規則一樣。暫時性的變數也要有適當的名稱?/p>
當有必要的時候,在一進入函式時就要初始化區域變數。AnsiString 型態的區域變數會被自動初始化為空字串Qinterface ?dispinterface 型態的區域變數會自動被初始化?nilQ?Variant ?OleVariant 區域變數則會被自動初始化為 Unassigned?/p>
3.4.3 全域變數
你應該盡量避免用全域變數,當你真的需要時才用全域變數,而且盡量在一個單元的圍內用,如果一個全域變數會被多個單元用,你應該將它移C個共用的單元內?/p>
〔回目錄?/p>
--------------------------------------------------------------------------------
3.5 型態
3.5.1 大小寫慣?br />如果型態的名E屬g留字Q就全部寫。Win32 API 的型態則全用大寫Q一些比較特D的型態Q你應該遵@ Windows.pas 或其?API 單元裡面的寫法。至於其他的型態Q通常是名EqW一個字母大寫,光採用 Camel-capped 方式Q參考以下範例:
var MyString: string; // string 是保留字. WindowHandle: HWND; // Win32 API 的型? AForm: TMyForm; i: Integer; // 用小寫的 integer 也無?
3.5.2 點數型?br />不要使用 Real 型態Q它是為了相Ҏ舊的 pascal E式而保留的。一般用Q點數時,請?double 型態Q它?IEEE 定義的標準資料格式。如果需要更大範圍的數|可?ExtendedQ但它是屬於 Intel 規格Q而且 Java 不支援。只有當點數實t佔用的位於i大有意義時才使用 SingleQ例如用另一E語a寫成?DLL 時)?/p>
3.5.3 列舉型態QEnumerated TypesQ?br />列舉型態的名E必須以字母 'T' 開頭Q藉此突它是一個型態。列舉型態中的識別字名稱應該?2? 個和其型態相關的寫英文字母開頭Q例如:
TSongType = (stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB);
列舉型態的變數名E可以直接將型態的第一個字?'T' 拿掉來命名,或是其他hҎ意義的名E,例如QFavoriteSongType1, FavoriteSongType2?/p>
3.5.4 Variant ?OleVariant 型態
通常不徏C用這兩E型態,它們通常被用在只有埯時期才能定其型態的時候,例如 COM 和資料nE式a計。你應該只有在撰?COM 盔RE式的時候才使用 OleVariantQ因?Variant 可以有效率地儲存 Delphi 字串Q?OleVariant 則必須將所有字串轉換成 OLE 字串QWideChar 字串Q,而且不會被參考計數-Q它們總是被複製成新的字丌Ӏ?/p>
3.5.5 i構型態
陣列型態
陣列型態的名E開頭冠?'T'Q如果要宣告指標陣列的型態,名稱開頭應該冠上 'P'Q而且要宣告在陣列型態的前面,參考範例:
type
PCycleArray = ^TCycleArray;
TCycleArray = array [1..100] of integer;
陣列的變數在命名時可以直接將開頭?'T' 拿掉作為變數名稱?/p>
a錄型態
和陣列型態的規則一樣,參考下面的例Q?/p>
type
PEmployee = ^TEmployee;
TEmployee = record
EmployeeName: string
EmployeeRate: Double;
end;
〔回目錄?/p>
--------------------------------------------------------------------------------
3.6 陌?br />3.6.1 if 陌?br />比較常發生的情Ş應該攑֜ if/then/else 裡面?then 字句中,較少發生的情形則攑֜ else 字句裡面?
避免使用一長串?if 敘述Q如果可能的話,使用 case 來取代?
巢狀 if 不應該超過四層。當巢狀 if 過四層時,你應該想辦法以更明的方式來撰寫這段E式|例如部分判斷式寫成獨立函式Q?
不要?if 敘述中用不必要的括號?
3.6.2 case 陌?br />case 裡面的各個條件應該以數字或英文字母的順序排列?
各個條件的處理動作應盡量簡短,通常以不過五行E式為限,如果要處理的動作太複雜的話,應該寫成獨立的函式?
else 子句只有畉要預a行為或者偵測錯誤時才用?
3.6.3 while 陌?br />不徏議在 while 中?Exit 跳離q圈Q儘可能只用條件式?break 命o?
i?while q圈使用的變數的初始化動作應該要R鄰在進入q圈之前Q其間不要有M不相q的E式{?
M後續處理應在q圈後立即進行?
3.6.4 for 陌?br />3.6.5 repeat 陌?br />3.6.6 with 陌?br />〔回目錄?/p>
--------------------------------------------------------------------------------
3.7 i構化異常處理(Structured Exception HandlingQ?br />異常處理常被用於捕捉錯誤和資源回Ӟ例如Q假a你你配|了一項資源,你可以在 finally 子句撰寫釋放資源的程式碼以確保資源會被釋放?/p>
3.7.1 try...finally
在不需要理會錯誤的情Ş下,可以使用此敘qCZ資源被回Ӟ但是每一個配|資源的動作都應該對應一?try...finally 敘述Q以下的E式可能會引發問題Q?/p>
SomeClass1 := TSomeClass.Create;
SomeClass2 := TSomeClass.Create;
try
{do some code }
finally
SomeClass1.Free;
SomeClass2.Free;
end;
比較安全的寫法應該是Q?/p>
SomeClass1 := TSomeClass.Create;
try
SomeClass2 := TSomeClass.Create;
try
{do some code }
finally
SomeClass2.Free;
end;
finally
SomeClass1.Free;
end;
3.7.2 try...except
你可以用此敘qC捕捉異常並進行外的處理。一般來說,你不會只Z示錯誤a息而?try...exceptQ因?Application 物g會自動幫你顯C錯誤訊息。如果你?except 裡面處理完該做的事情之後惌再將錯誤傛_去,可以使用 raise 指o?/p>
〔回目錄?/p>
--------------------------------------------------------------------------------
3.8 別QclassesQ?br />3.8.1 命名/格式
別的型態名E׃大寫 'T' 開頭Q例如:
type
TCustomer = class(TObject)
別實體的名E可以直接將前面?'T' LQ?/p>
var
Customer: TCustomer;
a:元g的命名規則請參考「元件」章?/p>
3.8.2 Ƅ位QFieldsQ?br />別中的Ƅ位Q指的就是私有成員(private membersQ,他們的命名規則和一般的變數相同Q但是必須在前面冠上大寫 'F' Q表CZ們是 fields?
3.8.3 ҎQMethodsQ?br />命名/格式
Methods 的命名規則和一般函式相同?/p>
靜態ҎQStatic MethodsQ?
當你不希望某?method 被子別改寫QoverrideQ的話,可以它宣告為靜態方法?/p>
虛擬/動態ҎQVirtual/Dynamic MethodsQ?
當你預期某?method 會被子類別改寫的話,應將它宣告為 virtual。?dynamic 的用時是當一個類別有很多子類別的時候,例如一個類別有 100 個子別Q而這些子類別都會用到某?methodQ但是很會L寫它Q那這?method 應該被宣告?dynamic 以節省記憉?/p>
a:每一個類別的 virtual methods 需要以一個虛擬方法表QVMT, Virtual Method TableQ來a錄?/p>
抽象ҎQAbstract MethodsQ?
抽象Ҏ應該只被用於抽象別中,它們主要是用來定義基礎別的介面?/p>
屬性存取方法(Property-Access MethodsQ?
存取屬性的Ҏ是你經常在元g的原始碼中看到的 Get/Set ҎQ它們各自對應到屬性的讀取和寫入動作Q寫入的Ҏ名稱是以 Set 開頭Q參數值的名稱通常?Value 命名。參考以下範例:
TSomeClass =class(TObject)private FSomeField: Integer;protected function GetSomeField: Integer; procedure SetSomeField(Value: Integer);public property SomeField: Integer read GetSomeField write SetSomeField;end;
這些 Get/Set Ҏ應該攑֜ private ?protected 區D中?/p>
3.8.4 屬性(PropertiesQ?br />屬性可以讓外界存取別的私有成員,其命名方式是私有成員名E前面的 'F' L。由於屬性代表的是資料,所以名E應該是名詞而非動詞?/p>
通常屬性是單數Q如果是陣列型態的屬性,其名E應該用複數?/p>
〔回目錄?/p>
--------------------------------------------------------------------------------
4.0 檔案
4.1 Project Files
案名稱應該要能描述其功能,例如QThe Delphi 5 Developer's Guide ?Bug Manager 的專案名E就取名?DDGBugs.dpr?/p>
4.2 Form Files
Form 的檔案名E׃ Frm 作結,例如QAboutFrm.pas。主視窗通常會以 MainFrm.pas 命名?/p>
4.3 Data Module Files
Data Module 的檔案名E׃ DM 作結,例如QCustomerDM.pas ?CustomerDm.pas?/p>
4.4 Remote Data Module Files
Remote Data Module 的檔案名E׃ RDM 作結,例如QCustomerRDM.pas ?CustomerRdm.pas?/p>
a:MTSDataModule 也是 Remote Data Module 的一E,因此可以使用相同的命名方式?/p>
4.5 Unit Files
4.5.1 一般單元結?br />uses 子句
?interface 區D늚 uses 子句應該只包?interface 會用到的單元Q在 implementation 區D늚 uses 子句應該只包?implementation 會用到的單元Q沒有用到的單元應該其U除?/p>
interface 區D?
如其名稱所揭示的,這部分是提供外界存取的介面,在此區D中所宣告的型態,變數Q函式都可能會被其他單元使用Q因此不希望被外界存取者應|於 implementation 區D內?/p>
implementation 區D?
此區D|宣告的型態,變數Q函式等都只能被此單元用?/p>
initialization 區D?
不要把很花時間的工作攑֜此區D中Q否則會拖慢應用E式載入的時間?/p>
finalization 區D?
?initialization 區D中配置的資源必須在此處釋放?/p>
4.5.2 一般用途的單元
例如Q一個工具類的單元可能被命名?BugUtilities.pasQ或 BugUtils.pasQ,而一個專門存放全域變數的單元可能叫?AppGlobals.pas?/p>
a住這類q單元可能被專案中所有的E式單元及套件用,Z避免名稱衝突Q在為檔案命名時不要用太普遍的名E?/p>
4.5.3 元g單元
元g單元應該要被集中存放在一個獨立的目錄Q不應該攑֜案目錄下跟其他檔案混在一赗?/p>
4.6 檔案表頭QFile HeadersQ?br />檔案表頭通常提供了檔案的用途,版權宣告Q作者,注意事項...{資a。你可以採用似下面的寫法:
(*---------------------------------------------------------------------------
說明
要說明此檔案的用途?/p>
注意事項
版權宣告
修改歷史
---------------------------------------------------------------------------*)
如果有入或輸出的參數,以及跟外部互動的介面也可以在檔頭中註明?/p>
〔回目錄?/p>
--------------------------------------------------------------------------------
5.0 Forms and Data Modules
5.1 Forms
5.1.1 Form 型態命名標準
?TXxxxForm 的方式命名,例如Q?/p>
TAboutForm = class(TForm)
主視H通常會這麼寫:
TMainForm = class(TForm)
輸入客戶基本資料的表單可能像這樣Q?/p>
TCustomerEntryForm = class(TForm)
5.1.2 Form 實體命名標準
型態名E前面的 'T' L作為 Form 的實體名E,參考下面的例Q?/p>
型態名稱
實體名稱
TAboutForm AboutForm
TMainForm MainForm
TCustomerEntryForm CustomerEntryForm
5.1.3 自動建立?Forms
只有主視H才應該被自動徏立,除非有特D的原因Q否則其他視H都應該以動態的方式建立?/p>
5.1.4 建立 Modal Form 的函?br />當你要用一?Form 時,不要?Delphi q你產生?Form 變數Q應該以一個函式來建立及顯C這?FormQ參考下面的例Q?/p>
unit UserDataFrm;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TUserDataForm = class(TForm) edtUserName: TEdit; edtUserID: TEdit; private {Private declarations } public {Public declarations } end;function GetUserData(var aUserName: string; var aUserID: Integer): Word;implementation{$R *.DFM}function GetUserData(var aUserName: string; var aUserID: Integer): Word;var UserDataForm: TUserDataForm;begin UserDataForm := TUserDataForm.Create(Application); try UserDataForm.Caption := 'Getting User Data'; Result := UserDataForm.ShowModal; if Result = mrOK then begin aUserName := UserDataForm.edtUserName.Text; aUserID := StrToInt(UserDataForm.edtUserID.Text); end; finally UserDataForm.Free; end;end;end.
5.2 Data Modules
5.2.1 Data Module 型態命名標準
?TXxxDataModule ?TXxxDmod 的方式命名,例如Q?/p>
TCustomerDmod = class(TDataModule)
5.2.2 Data Module 實體命名標準
型態名E前面的 'T' L作為 Data Module 的實體名E,例如Q?/p>
var
CustomerDmod: TCustomerDmod;
5.3 Remote Data Modules
命名方式可以和一般的 Data Modules 一樣?TXxxDmodQ或者用 TXxxRdmod。例如:
var
CustomerRmod: TCustomerRdmod;
〔回目錄?/p>
--------------------------------------------------------------------------------
6.0 套gQPackagesQ?br />6.1 埯時期 v.s. a計時期套g
埯時期套g應該只包含其中各元g所需參考的單元或套Ӟ其他只有在設a時期才會用到的E式或單元Q例如屬?元gR輯器等Q就應該攑֜a計時期套g裡,此外Q用來註冊元件的單元也應該放在設a時期套件裡?/p>
6.2 檔案命名標準
套g的檔案名E名應該仿照以下的例子:
iiilibvv.dpkQ設a時期套Ӟ
iiistdvv.dpkQ執行時期套Ӟ
其中 iii 表示用來作為識別的三個字元,可能是你的姓名,公司名稱Q或是其他個體的縮寫。字?vv 表示此套件所適用?Delphi 版本號碼。?lib ?std 則用來區別設a時期和埯時期?/p>
假設某個套件同時有a計時期和執行時期兩E套Ӟ他們會有相似的檔案Q例?Delphi 5 Developer's Guide 的套件會命名為:
DdgLib50.dpkQ設a時期套Ӟ
DdgStd50.dpkQ執行時期套Ӟ
〔回目錄?/p>
--------------------------------------------------------------------------------
7.0 元gQComponentsQ?br />7.1 使用者自a元?br />7.1.1 元g型態命名標準
元g的命名方式和之前「類別」一當中提到的命名方式類|差別僅在於元件名E前面會冠上三個字元以作為識別Q這三個前|字元可以是你個h、公司、或M個體的名Eq寫,例如Q在 Delphi 5 Developer's Guide 裡面有一個時鐘元Ӟ他的定義是:
TddgClock = class(TComponent)
注意這三個前|字元都是小寫英文字母?/p>
7.1.2 元g單元
元g所屬的單元裡面應該只包含一個主元gQ所「主元g」就是指那些會放?Delphi 元g盤上面的元gQ其他輔助性質的元件則可以跟主元g攑֜同一個單元裡面?/p>
7.1.3 使用ad單元
用來ad元g的程序應該被抽離ZQ並集中C個獨立的檔案當中Q這個專門用來ad元g的單元同時也可以用來ad屬性編輯器Q元件編輯器Q專ӞDelphi expertsQ?...{等?/p>
由於ad元g的動作只有在a計時期套g中才會執行,因此ad單元應該只被攑֜a計時期套g裡,而不會出珑֜埯時期套g裡。註冊單元的檔案名稱您以下列型式命名Q?/p>
XxxReg.pas
其中 Xxx 表示用來作為識別的三個字元,可能是你的姓名,公司名稱Q或是其他個體的縮寫。例如,?Delphi 5 Developer's Guide 裡面用來ad元g的單元其檔名是 DdgReg.pas?/p>
7.2 元g實體命名慣例
元g的命名採用類伹{匈牙利表示法」的命名慣例Q元件的名稱分為「元件型態字首」以及「元件修飑E」兩個部分?/p>
7.2.1 元g型態字首QComponent Type PrefixesQ?br />所「元件型態字首」,是一i代表元件型態的英文寫字母Q例如,TButton 的型態字首為 btnQTEdit 的型態字首為 edt。你可以依照下列的步驟挑選出合適的字首:
U除開頭?'T' 字母Q例如,"TButton" p?"Button"?
U除所有的母音字母Q並且全部改成小寫,例如Q?Button" p?"bttn"Q?Edit" 變成 "edt"?
兩個連續的相同字母僅保留一個,例如Q?bttn" 變成 "btn"?
若結果和其他的名EpH,可以開始加入母音字母Q例如,"TBatton" 的字首和 "TButton" 一樣,因此可以?"TBatton" 的字首改?"batn"?
請參考另一?"Delphi 5 元g型態字首" 以取得更多元件型態字首的資訊?/p>
7.2.2 元g修飾詞名E(Component Qualifier NameQ?br />元g修飾詞名E應該要W合其作用,例如Q一個用來關閉視H的按鈕應該被命名為 "btnClose"Q入員工姓名的文字盒應被命名為 edtEmpName?/p>
J承下來Q從這個物仉始擴充功能,但有時候這種標準的設a方式,有實
際的困難Q一者我們手上可能沒有這個物件的
Source
Q二者更攚w個物件之
後,需考慮原先的物件可能已E在pȝ中運作,Z不破壞原有的物g功能
Q及使用的介面,這個時候我們需要一E偷龍轉鳳的ҎQ偷L把這個物
件至換掉Q要|換這個物Ӟ最好的Ҏ是產生一個一模一樣的別Z
Q而且不改變原有物件的屬性及ҎQ或者是在原有物件上擴充功能?/span>
以下提供一個另的a計ҎQ來解決這個問。假如有一?/span>
TEdit
的物?/span>
Q我們希望它在修改資料的時候,可以改變色Q在不改變原有物件的使用
介面下,如何來擴充這個功能呢H?/span>
請看這個範例的說明H?/span>
這個繼承自
TEdit
?/span>
TMyEdit
很簡單的宣告
ReadOnly
這個屬性,其他
Create
Q?/span>
Load
的方法,只是要在a計期間取得目前正確的顏色設定而已?/span>
type
TMyEdit = class(TEdit)
private
FDesignColor: TColor;
FReadOnly: boolean;
procedure SetReadOnly(Value: boolean);
procedure SetColor;
protected
procedure Loaded; override;
public
constructor Create(AOwner: TComponent); override;
published
property ReadOnly: boolean read FReadOnly write SetReadOnly;
end;
接下來我們看
TMyEdit
如何改變原來的屬性,請把焦點攑֜
SetReadOnly
上面Q這?
procedrue
動了以下的手?/span>
:
在繼?/span>
ReadOnly
原有的屬性之後,進行色的改變?/span>
procedure TMyEdit.SetReadOnly(Value: boolean);
begin
FReadOnly:= Value;
inherited ReadOnly:= Value;
SetColor;
end;
SetReadOnly
在父層類?/span>
TCustomEdit
中已有定,只是它被攑֜
private
區D裡Q子別是看不到的,否則只要改寫
SetReadOnly
Ҏp了。在這裡重新定義?/span>
ReadOnly
屬性,除了保有爉?/span>
ReadOnly
屬性的作用Q並賦予它新的行為。在a計別時,也許?/span>
Get/Set
存取Ҏ宣告?/span>
protected
區D|比較方便Q後代類別可以直接改?/span>
Get/Set
Ҏ來改變或附加行為Q但這也表示爉別將失去私有成員的保護力,子類別幾?/span>
可以完全改變爉別的行為。因此,要把
Get/Set
攑֜
private
還是
protected
區D實仁見智的問題Q設a者可視情況選擇對自己最有利的方式?/span>
以下?/span>
TMyEdit
所有實作的部分H?/span>
constructor TMyEdit.Create(AOwner: TComponent);
begin
inherited;
FDesignColor:= clWindow;
end;
procedure TMyEdit.Loaded;
begin
inherited;
FDesignColor:= Color;
end;
procedure TMyEdit.SetColor;
begin
if ReadOnly then
Color:= clBtnFace
else
Color:= FDesignColor;
end;
procedure TMyEdit.SetReadOnly(Value: boolean);
begin
FReadOnly:= Value;
inherited ReadOnly:= Value;
SetColor;
end;
寫好這個物件我們開始進行測試Q看這個物件如何無聲無息的嵌入我們已
E寫好的單元Q首先我們拉一?/span>
Form1
ZQ在上面放一?/span>
Edit1
?/span>
Button1
Q當然您還要建構這?/span>
TMyEdit
的物ӞZ方便赯Q請?/span>
個單元直?/span>
Copy
?/span>
Form1
所屬的單元裡頭Q然後在
Button1
上面Q寫?/span>
:
TMyEdit(Edit1).ReadOnly := False;
埯看看Q按一?/span>
Button1
Q這時?/span>
Edit1
?/span>
ReadOnly
是不是多了改變顏色的功能H?/span>
23.Ctrl+I
?/span>
Tab
?/span>
24.CTRL+J (
彈出
Delphi
語句提示視窗Q選擇所需語句自動完成一條語?/span>
)
E式模?/span>
25.Ctrl+M
?/span>
Enter
c?/span>
26.Ctrl+N
?/span>
Enter
鍵,但游標位|保持不?/span>
27.Ctrl+T
刪除游標右邊的一個單?/span>
28.Ctrl+Y
刪除游標所在行
37.CTRL+ENTER
定位到單元文?/span>
42.Ctrl+O+U
切換選擇塊的大小?/span>
(
注意鬆開
O
後再?/span>
U,Ctrl
保持按下
)
43.Ctrl+K+O
切換選擇塊為寫
(
注意鬆開
K
後再?/span>
O,Ctrl
保持按下
)
44.Ctrl+K+N
切換選擇塊為大寫
(
注意鬆開
K
後再?/span>
N,Ctrl
保持按下
)
45.Ctrl+Shift+G
插入
GUID
46.Ctrl+Shift+T
在游標行加入
To-Do
a釋
47.Ctrl+Shift+Y
刪除游標之後x行末之間的文本
48.CTRL+SHIFT+C
R寫x或者補上函數,i好
!!!
59.Ctrl+E
快速選擇(呵呵Q試試吧Q很好玩的)
DELPHI中的快捷方式一?br />1.SHIFT+游標左鍵 先選中Q一元g,按鍵後可怸視窗(怸元g後按Esc效果一?
2.Shift+F8 調試時彈出CPU視窗?br />3.Shift+F10 {於游標右鍵QWindows快捷鍵)?br />4.Shitf+頭 選擇
5.shift +F12 快速查找視H並打開
6.F7 Q步進式調試同時q蹤進入子過E)
7.F8 Q步進式調試不進入子過E)
8.F9 埯
9.F12 切換EDITOR,FORM
10.Alt+F4 關閉所有編輯框中打開的源程序文Ӟ但不關閉項目
11.ALT+游標左鍵 可以塊選E式|用來刪除齊的重複程式碼非常有用
12.Ctrl+F9 R譯
13.Ctrl+shift+N(n=1,2,3,4......) 定義書籤
14.Ctrl+n(n=1,2,3,4......)跛_書籤n
15.CTRL +SHIFT+N 在書cN處,再按一?取消書籤
16.Ctrl+PageUp 游標移x屏的W一行,螢幕不毈?br />17.Ctrl+PageDown 游標移x屏的最後一行,螢幕不毈?br />18.Ctrl+?向下滑螢幕Q游標跟隨毈動不出本?br />19.Ctrl+?向上滑螢幕Q游標跟隨毈動不出本?br />20.Ctrl+Home 游標移x仉
21.Ctrl+End 游標移x件尾
22.Ctrl+B Buffer List視窗
23.Ctrl+I 同Tab?br />24.CTRL+J (彈出Delphi語句提示視窗Q選擇所需語句自動完成一條語?E式模?br />25.Ctrl+M 同Enterc?br />26.Ctrl+N 同Enter鍵,但游標位|保持不?br />27.Ctrl+T 刪除游標右邊的一個單?br />28.Ctrl+Y 刪除游標所在行
29.CTRL+C 複製
30.CTRL+V g
31.CTRL+X 剪切
32.CTRL+Z 還原(Undo)
33.CTRL+S 保存
34.Ctrl+F 查找
35.Ctrl+L J續查找
36.Ctrl+r 替換
37.CTRL+ENTER 定位到單元文?br />38.Ctrl+F3 彈出Call Stack視窗
39.Ctrl+F4 {於File選單中的Close?br />40.Ctrl+Backspace 後退刪除一個詞,直到遇到一個分割符
41.Ctrl+游標轉輪 加速毈?br />42.Ctrl+O+U 切換選擇塊的大小?注意鬆開O後再按U,Ctrl保持按下)
43.Ctrl+K+O 切換選擇塊為寫(注意鬆開K後再按O,Ctrl保持按下)
44.Ctrl+K+N 切換選擇塊為大寫(注意鬆開K後再按N,Ctrl保持按下)
45.Ctrl+Shift+G 插入GUID
46.Ctrl+Shift+T 在游標行加入To-Doa釋
47.Ctrl+Shift+Y 刪除游標之後x行末之間的文本
48.CTRL+SHIFT+C R寫x或者補上函數,i好!!!
49.CTRL+SHIFT+E 示EXPLORER
50.Ctrl+Tab 在Inspector中切換Properties頁和Events?br />51.CTRL+SHIFT+U E式整塊左U?個空g|?br />52.CTRL+SHIFT+I E式整塊右U?個空g|?br />53.CTRL+SHIFT+?在過E、函數、事件內? 可蟩w到相應的過E、函數、事
件的定義Q在interface和implementation之間來回切換Q?br />54.CTRL+SHIFT+?在過E、函數、事件的定義處, 可蟩w到具體過程、函數、事件內?同上)
55.Tab 在object inspector視窗按tab鍵將游標Ud到屬性名區Q然後鍵入屬性名的開?br />字母可快速定位到該屬?br />56.Ctrl+Alt 按著Ctrl+Alt之後Q可用游標選擇一個矩形塊中的E式|
並可比它進行複製Q貼?br />57.Shift+↓、↑、→、← ?像素單位更改所選元件大?br />58.Ctrl+↓、↑、→、←?像素單位更改所選元件位|?br />59.Ctrl+E 快速選擇(呵呵Q試試吧Q很好玩的)
---------GExperts?--------
60.Ctrl+Alt+c a釋?br />61.Ctrl+Alt+u 取消a釋?br />62.Ctrl+Alt+h 生成?更詳細的a置在GExperts配置的Editor Experts屬性頁)
63.Ctrl+Alt+o 選擇應分隔W之間的語句
64.Ctrl+Alt+v 在對應的分隔W之間來回蟩?與已有快捷鍵有衝H,請更?
uses WinProcs;
.
begin
WinExec(…?;
.
end.
和调用Pascal库函数没什么两栗?
2. Delphi hint的字体和色彩如何改变
Delphi中Tapplication的属性有HintColor及HintPause。可以通过讄HintColor改变应用E序中的Hint的颜艌Ӏ通过讄HintPause改变触发Hint的时间。但遗憾的是QDelphi中Hint的字体不可以改变?
3. Delphi里如何计日?
时间在delphi中是最Ҏ的,如下Q?
var ss : TDateTime
其实Tdatetime是一个双_ֺ的QҎQ它的小数点前表C天敎ͼ如, ss := ss + 20 表示从ss开始向?0天,如果 ss = 234.567 它就表示 234.567?当然是从公元0q开始计的Q?
4. 如何用Delphi~ScreenSaver? (null)
屏幕保护E序无非是扩展名换成?SCR的可执行E序Q它接受两种命o行参敎ͼ
s q行命o参数
c 配置命o参数
Windows通过向程序发-s命o行参数来启动E序。要注意的是Q程序的H口是无Ҏ和标题;H口大小应与屏幕大小一Pq要注意H口的事件的处理?
5. Delphi 中如何改目录的名?
调用RenameFile函数Q如:
RenameFile(’c:wang emp? ’c:wang mp?;
6. DELPHI昄JPEG囑փ文g
只要 uses中加?JPEGpQJPEG单元里是有一个TJPEGImagec?可定义一变量如Jpeg,用LoadFromFile调入某个JPEG文g, 然后用Form的Canvas.Draw(x,y,Jpeg)卛_昄.
7. Delphi中对Jpeg格式文g的处理?
(1).?Uses 中加?JPEG 单元;
(2).定义一个全E变?例如 var AJPEG : TJPEGImage;
(3).?Form ?OnCreate 事g中加?:
Canvas.Pen.Color:=clBlack;
Canvas.Pen.Style:=psSolid;
Canvas.Brush.color:=clBtnFace;
Canvas.Brush.Style:=bsSolid; //此上是设|?Canvas 的一些属?便于以后
//Clear Form and Load a new JPEG file;
Ajpeg:=TJpegImage.Create;//动态生成Ajpeg;
Ajpeg.LoadFromFile(’D:Temp.jpg? //生成 Ajpeg ?调入 JPEG 文g
(4).?Form ?OnPain 事g中加入Canvas.Rectangle(2,2,560,430); //M个黑框的矩Ş图片围?
x:=10; y:=10;
Form1.Canvas.Draw(x,y,Ajpeg); //?x,y)为左上角输出 JPEG 文g;
//实际上其作用是当囑Ş被破坏是使图形恢?
(5).在’Load’或’Browse’按钮的 onClick 事g中加?
begin
if OpenPictureDialog1.Execute then
begin
Ajpeg.Free; //释放旧Ajpeg;
Ajpeg:=TJpegImage.Create; //产生一个新的Ajpeg;
Ajpeg.LoadFromFile(OpenPictureDialog1.Filename); //载入JPEG文g;
end;
Canvas.Rectangle(2,2,560,430); //Form Clear;
x:=10;
y:=10;
Form1.Canvas.Draw(x,y,Ajpeg); //昄新的Ajpeg;
end;
8. DELPHI3启动画面
in your *.dbr files do it
begin
{Create a splash form}
splash:=Tsplash.Create(self);
splash.Show;
splash.update
Application.Initialize;
Application.CreateForm(..)
.
.
.
splash.close;
splash.free;
Application.Run
end;
忠告一
布尔型变量的赋值操作应该是直接的。例如,在一个if/then/else语句中,if子句布型变量赋gؓTrueQ而else子句其赋ؓFalse。下面这D代码的写法是不好的Q?/p>
if If_Love_Delphi then
Result:=True
else
Result:=False;
而这样写比较好Q?/p>
Result:= If_Love_Delphi;
忠告?/p>
避免使用嵌套的if/then/if语句Q而用and来代ѝ下面这D代码太|嗦Q?/p>
if If_Love_Delphi then
if If_Love_Linux then
TryKylix(Now);
应该q样写:
if If_Love_Delphi and If_Love_Linux then
TryKylix(Now);
不用担心后面的判断语句会前执行。Project|Options|Compiler|Syntax Options|Complete Boolean eval选项通常是关闭的Q除非你选定q个)Q这保证了执行顺序不会颠倒?/p>
l合前两个忠告,假如你有一D这L代码Q?/p>
if If_Love_Delphi then
if If_Love_Linux then
Result:=True;
可以把它改成:
Result:= If_Love_Delphi and If_Love_LinuxQ?/p>
单而言Q假如结果取决于一个条件判断,那么QResult:=True或者Result:=Falseq样的语句就是多此一举。在初始化布型变量的时候,可以l它们赋倹{不q根本用不着把一个布型变量初始化ؓFalse--Delphi在创个变量的时候就已经把它赋职位False了。相似的情况q有Q?/p>
对象的布型属?Boolean)Q自动被初始化ؓFalse (0)Q?br />整型变量(Integer)Q自动被初始化ؓ 0Q?br />字符?String)Q自动被初始化ؓI字W串?/p>
忠告?/p>
判断布尔型变量的值时Q无需?=True"或?=False"q样的语句。下面的写法不好Q?/p>
if (If_Love_Delphi=True) and
(If_Love_Linux=False) then
DoNotTryLinux;
对于函数的返回值或者一个属性是布尔型的情况Q应该这样写Q?/p>
if If_Love_Delphi and
not If_Love_Linux then
DoNotTryLinux;
忠告?/p>
量不要?+"操作W进行字W串合ƈ。这样做效率太低了。下面的例子不好Q?/p>
ShowMessage('在下w高'+IntToStr(iHeight)+'cI体重'+IntToStr(iWeight)+'公斤?);
q样写会较好Q?/p>
ShowMessage(Format('在下w高%dQ体?d?, [iHeight,iWeight]));
忠告?/p>
量多用with语句。它不仅效率高,而且使代码更加易诅R比如,q段代码Q?/p>
if Sender if TEdit then
if (TEdit(Sender).Text=') or
(TEdit(Sender).Text[TEdit(Sender).SelStart]=') or
(TEdit(Sender).SelLength=
Length(TEdit(Sender).Text))
and (Key in ['a'..'z']) then
Key:=UpperCase(Key);
׃如这L代码来得z易读:
if Sender is TEdit then
with Sender as TEdit do
if (Text=') or
(Text[SelStart]=') or
(SelLength=Length(Text)) and
(Key in ['a'..'z'] then
Key:=UpCase(Key);
(*//
标题:Delphi中徏议用的语句
整理:Zswang
q接:http://www.csdn.net/Expert/TopicView1.asp?id=724036
日期:2002-06-22
支持:wjhu111#21cn.com
//*)
{ No.1 判断逻辑cd }
var B: Boolean;
begin
B := Boolean(2); //q样只是Z调试//B := True;
if B = True then ShowMessage('B = True'); //不徏?/不安?br /> ///////
if B then ShowMessage('B'); ////?br />end;
var B: Boolean;
begin
if Edit1.Text = '? then //不徏?/烦琐
B := True
else B := False;
///////
B := Edit1.Text = '?; ////?br />end;
{ No.2 临时SQL查询 }
begin
QueryTemp.Close;
QueryTemp.SQL.Text := 'SELECT SUM(金额) AS 合计 FROM 销售表';
QueryTemp.Open; //不徏?/数据没有关闭造成资源费
ShowMessage(Query1.FieldByName('合计').AsString);
/////
QueryTemp.SQL.Text := 'SELECT SUM(金额) AS 合计 FROM 销售表';
QueryTemp.Open;
ShowMessage(Query1.FieldByName('合计').AsString);
QueryTemp.Close; //?/使用完就关闭
end;
{ No.3 获取记录?}
var
vRecordCount: Integer;
begin
Query1.SQL.Text := 'SELECT * FROM Table1'; //不徏?/严重费资源Q会取得很多不必要得信息
Query1.Open;
vRecordCount := Query1.RecordCount;
Query1.Close;
/////
Query1.SQL.Text := 'SELECT COUNT(*) AS 记录?FROM Table1'; ////快速有效、只处理一条记?br /> Query1.Open;
vRecordCount := Query1.FieldByName('记录?).AsInteger;
Query1.Close;
ShowMessage(IntToStr(vRecordCount));
end;
{ No.4 字段赋?}
begin
Table1.Edit;
Table1.FieldByName('姓名').AsString := Edit1.Text; //不徏?br /> Table1.FieldByName('日期').AsDateTime := Date;
/////
Table1['姓名'] := Edit1.Text; ////短、扩充性好
//Table1.Fieldvalues['姓名'] := Edit1.Text; //Borland的方法。以及ParamValues[]
Table1['日期'] := Date;
end;
{ No.5 使用Self指针 }
begin
Edit1.Parent := Form1; //不徏?/Form1只是一个变?/如果没有分配资源怎么办?
///////
Edit1.Parent := Self; //
end;
{ No.6 遍历数据?}
var
I: Integer;
begin
Query1.First;
for I := 0 to Query1.RecordCount - 1 do begin //不徏?/Ҏ被媄?br /> Query1.Next;
{ };
end;
/////
Query1.First;
while not Query1.Eof do begin //
{ };
Query1.Next;
end;
end;
{ No.7 利用Sender参数Q代码通用 }
procedure TForm1.Edit1Change(Sender: TObject);
begin
if Edit1.Text = '' then //不徏?br /> Edit1.Color := clRed;
///////
if TEdit(Sender).Text = '' then ////复制到EditXChange中很方便
TEdit(Sender).Color := clRed;
end;
{ No.8 使用默认转换函数 }
var
I: Integer;
begin
I := StrToInt(Edit1.Text); //不徏?br /> ///////
I := StrToIntDef(Edit1.Text, 0);////参考StrToFloatDef,StrToDateDef....不过q些只有Delphi6才有
end;
{ No.9 遍历数组 }
var
I: Integer;
A: array[0..9] of Integer;
begin
for I := 0 to 9 do //不徏?br /> A[I] := I;
///////
for I := Low(A) to High(A) do ////扩充性好
A[I] := I;
end;
{ No.10 利用MaxInt帔R }
begin
Caption := Copy(Edit1.Text, 3, Length(Edit1.Text) - 3 + 1); //不徏?br /> ///////
Caption := Copy(Edit1.Text, 3, MaxInt); ////dQ少计算一?br />end;
{ No.11 Result函数指针 }
function FuncName: Boolean;
begin
FuncName := True; //不徏?/q且攑֜赋值号双不能当普通变?br /> ///////
Result := True; ////扩充性好
end;
function FuncSum(A: array of Integer): Integer;
var I: Integer;
begin
Result := 0;
for I := Low(A) to High(A) do
Result := Result + A[I]; //可不能用 FuncSum := FuncSum + A[I];
end;
{ No.12 必须执行的代码、用try ... finally ... end语句 }
var
vStringList: TStringList;
begin
vStringList := TStringList.Create;
vStringList.LoadFromFile('c:\temp.txt');
ShowMessage(vStringList.Text);
vStringList.Free; //不徏?/如果出现异常资源无法释?br /> ///////
vStringList := TStringList.Create;
try
vStringList.LoadFromFile('c:\temp.txt');
ShowMessage(vStringList.Text);
finally ////即出现Exit都会执行
vStringList.Free;
end;
end;
//其他情况1
begin
Screen.Cursor := crHourGlass;
try
{ 耗时操作 }
finally
Screen.Cursor := crDefault;
end;
end;
//其他情况2
begin
Query1.DisableControls;
try
{ 操作数据?}
finally
Query1.EnableControls;
end;
end;
>>对象的布型属?Boolean)Q自动被初始化ؓFalse (0)Q?br />>>整型变量(Integer)Q自动被初始化ؓ 0Q?br />>>字符?String)Q自动被初始化ؓI字W串?/p>
q个不一?/p>
局部变量最好初始化一?不然会生莫名错?
特别? Integer, string, Pointer
偶的l验
Table1['姓名'] := Edit1.Text; q个可以 但要是:
Edit1.Text := Table1['姓名'] //q个l对不行Q因时候要是NULL׃报错 q时候要FieldByName
己找到答案了QAnsiString也可以在Format和sprintf里用"%s"里指?
俺想数两三个AnsiStringq是可以?+"来连接,而更多的AnsiString应该用sprintf或Format?/p>
比较一?/p>
strMsg ="姓名: " + name + "q龄: " + IntToStr(age) + "L: " + IntToStr(num) + "工资: " + IntToStr(salary);
?/p>
strMsg.sprintf("姓名: %sq龄: %dL: %d工资: %d",name,age,num,salary);
后者可L比前者要略好Q生成的机器码只?/3, 更重要的是可以把sprintf里的格式字符串提出来集中l护Q而前者用"+"D的大量零字W串׃好处理?/p>
后者唯一~点是当有大量参数时Q需要花一点工夫将格式字符串和相应的参数对齐?br />
忠告1: 如果要用到with的地?h惌不能重构,其作ؓ一个函C?br />忠告2: 对于数据集的CLOSE请?br /> try
DataSet.Open;
finally
DataSet.Close;
end;
忠告3: 使用Sender?请先判断一下是不是nil, 是不是非你要的那个类?br />忠告4: FieldValue对null的处理实在是?误是用FieldByName().AsXXXXXq个
忠告5: 如果你要写一个长长的判断,q是写成一个函数吧,不要写进一个if then?那样,几天?你就看不懂?br />
1、关于WITHQ我个h基本不喜Ƣ用Q因Z带来的是可读性非常差。一个参数类Q几个属性的时候,用的q好Q而且目lh同要比较熟练q个c!如果二个以上的参数类Q天知道怎么读这一段的WITH代码?br />2、关于字W串Q用+和Formatq两个我一般是看情늚。有些字W串边境用Format很不好使,比如对一些SQL语句的拼写,多个SQL?q接代码易读性高。而且q个效率q算好!然而一些楼主都提及的字W串Q当然用Format要好Q同hL好Q我觉得在用到字符Q串Q操作的时候可L是主要的,如果跟效率搭上边了,长字W串处理Q我觉得已经是设计问题了?br />3、关于FOR和WHILE的比较,数据集的遍历当然用WHILE。RecordCount除非你不用数据集q渡Q如果用了,q个pȝ大了Q维护死你,不可预见性太高了。这不是效率问题Q是你写出来的Y件能不能用的问题?br />4、关于FieldByName。这个嘛提下Q我一直都是用它的。除非特D性情会用Fields[]。要不然Q别人的软g交给你维护的时候,你就{着哭吧Q查字段你就得花上所有的加班旉。?/p>
可能我说的没道理Q大家就指出来,如果能证明就更好了,q样我又学到东西了。?br />
Ctrl+PageUp 光标移x屏的W一行,屏幕不滚动?br /> Ctrl+PageDown 光标移x屏的最后一行,屏幕不滚动?br /> Ctrl+↓ ?向下滚动屏幕Q光标跟随滚动不出本屏?br /> Ctrl+↑ ?向上滚动屏幕Q光标跟随滚动不出本屏?br /> Ctrl+Shift+NUM 在光标行讄最多九个时标志号Q对临时切换非常有用?br /> 行的左边出C本书Q封面有NUMQ再按一ơ取消设|。?
Ctrl+NUM 直接光标蟩到NUM处,NUM是用Ctrl+Shift+NUM讄的标受?br /> NUM不能用小键盘?br /> Ctrl+Home 光标移x件头?br /> Ctrl+End 光标移x件尾?br /> Ctrl+B Buffer ListH口?br /> Ctrl+I 同Tab键?br /> Ctrl+M 同Enter键?br /> Ctrl+N 同Enter键,但光标位|保持不变?br /> Ctrl+T 删除光标双的一个单词?br /> Ctrl+Y 删除光标所在行?/p>
Ctrl+Shift+↑ ?光标在函C内时Q将光标快速移臛_前函数声明处?br /> Ctrl+Shift+↓ ?光标在函数声明行Ӟ光标快速移臛_数定义处?br /> Ctrl+Shift+C 声明一个过E或函数后,直接生成q程或函数的名称、begin、end;
Ctrl+Shift+E 光标在EditH口和ExplorerH口间切换?br /> Ctrl+Shift+G 插入GUID?br /> Ctrl+Shift+J 弹出Delphi语句提示H口Q选择所需语句自动完成一条语句?br /> Ctrl+Shift+T 在光标行加入To-Do注释?br /> Ctrl+Shift+Y 删除光标之后x行末之间的文本?/p>
Ctrl+F3 Call StackH口?br /> Ctrl+F4 {于File菜单中的CloseV?/p>
Ctrl+鼠标转轮 加速滚屏?/p>
Shift+F8 调试时弹出CPUH口?br /> Shift+F10 {于鼠标右键QWindows快捷键)?/p>
Alt+F4 关闭所有编辑框中打开的源E序文gQ但不关闭项目?br />
unit <库单元名U?/font>>
interface
uses <选择性的库单元列?/font>>
{公有说明}
implementation
uses <选择性的库单元列?/font>>
{U有说明}
{q程和函数的执行部分}
initialization {选择性的}
{选择性的初始化程序}
end.