﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-&lt;font color="red"&gt;中國男人&lt;/font&gt;&lt;font color="lightgreen"&gt;大鹏一曰同风起，扶摇直上九万里&lt;/font&gt;-随笔分类-Delphi</title><link>http://www.blogjava.net/liaojiyong/category/14249.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 19:01:40 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 19:01:40 GMT</pubDate><ttl>60</ttl><item><title>Delphi 5 寫碼標準</title><link>http://www.blogjava.net/liaojiyong/archive/2007/02/06/98319.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Tue, 06 Feb 2007 07:15:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/02/06/98319.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/98319.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/02/06/98319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/98319.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/98319.html</trackback:ping><description><![CDATA[
		<p>目錄</p>
		<p>1.0 簡介<br />2.0 一般程式碼格式<br />2.1 縮格<br />2.2 邊界<br />2.3 Begin...End <br />3.0 Object Pascal<br />3.1 括號<br />3.2 保留字與關鍵字<br />3.3 程序與函式<br />3.4 變數 <br />3.4.1 變數命名與格式<br />3.4.2 區域變數<br />3.4.3 全域變數</p>
		<p>3.5 型態</p>
		<p>3.5.1 大小寫慣例<br />3.5.2 浮點數型態<br />3.5.3 列舉型態（Enumerated Types）<br />3.5.4 Variant 和 OleVariant 型態<br />3.5.5 結構型態</p>
		<p>3.6 陳述句（statements） <br />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>
		<p>3.7 結構化異常處理 <br />3.7.1 try...finally<br />3.7.2 try...except</p>
		<p>3.8 類別（classes）</p>
		<p>3.8.1 命名/格式<br />3.8.2 欄位（Fields）<br />3.8.3 方法 （Methods）</p>
		<p>命名/格式 <br />靜態方法（Static Methods） <br />虛擬/動態方法（Virtual/Dynamic Methods） <br />抽象方法（Abstract Methods） <br />屬性存取方法（Property-Access Methods） <br />3.8.4 屬性（Properties） <br />4.0 檔案（File）<br />4.1 Project Files<br />4.2 Form Files<br />4.3 Data Module Files<br />4.4 Remote Data Module Files<br />4.5 Unit Files</p>
		<p>4.5.1 一般單元結構<br />4.5.2 一般用途的單元<br />4.5.3 元件單元</p>
		<p>4.6 檔案表頭（File Headers）</p>
		<p>5.0 Forms and Data Modules<br />5.1 Forms</p>
		<p>5.1.1 Form 型態命名標準<br />5.1.2 Form 實體命名標準<br />5.1.3 自動建立的 Forms<br />5.1.4 建立 Modal Form 的函式</p>
		<p>5.2 Data Modules</p>
		<p>5.2.1 Data Module 型態命名標準<br />5.2.2 Data Module 實體命名標準 </p>
		<p>5.3 Remote Data Modules</p>
		<p>6.0 套件（Packages）<br />6.1 執行時期 v.s. 設計時期套件<br />6.2 檔案命名標準</p>
		<p>7.0 元件（Components）<br />7.1 使用者自訂元件<br />7.2 元件實體命名慣例</p>
		<p>7.2.1 元件型態字首（Component Type Prefixes）<br />7.2.2 元件修飾詞名稱（Component Qualifier Name）</p>
		<p>8.0 補充說明 </p>
		<p>--------------------------------------------------------------------------------</p>
		<p>1.0 簡介<br />這份文件修改自 Delphi 5 Developer's Guide 裡面的 coding standards，該文所建議的寫碼風格與 Borland 大致相同，我在編寫這份文件時也做了微幅的修改，刪除一些不斷重複的字句，例如，「某某名稱在命名時應該與它的目的相符」這類一般性的原則，只要是「命名」，不管是專案名稱，檔案名稱，元件，函式，變數....都應該取有意義的名稱。</p>
		<p>這份文件不可能照顧到所有細節，但是比較重要的部分都提到了，另外一篇 "Delphi 5 元件型態字首" 則包含了元件命名的字首建議清單，應該也有參考價值。</p>
		<p>依照文件中的規範來撰寫程式，不但可使程式碼比較清晰易讀，也能夠讓整個開發團隊的程式風格保持一致，這樣小組成員在看別人的程式碼時會輕鬆一些。如果這些風格和你原有的習慣相差很大，或者你正好接手維護別人的程式碼，以下工具可能對你有用處：</p>
		<p>DelForExp - 可以幫你重新編排 Delphi 程式碼。</p>
		<p>GExperts - 包含許多提高 Delphi 生產力的工具，其中 Code Proofreader 能夠自動幫你修正程式碼的大小寫失誤。</p>
		<p>2.0 一般程式碼格式<br />2.1.縮格<br />每層的縮格為兩個空白字元，不要使用 Tab 字元（Tools | Editor options 裡面的 Use tab character 選項不要勾選），以免程式碼到了別台機器或用其他文字編輯器顯示、列印時走了樣。</p>
		<p>2.2.邊界<br />邊界設定為 80 個字元（此為 Delphi 預設值），當程式碼太長而超過邊界時應予以折行，不過對於那些剛好有一個英文字跨在邊界上的情形則可以通容。折行時請盡量斷在逗號或者運算子後面，折下來的那行程式碼應該要往右縮格（兩個空白字元）。</p>
		<p>2.3.Begin...End<br />begin 和 end 應該寫在新的一行，且兩者要對齊。下面的第一個例子是錯誤的示範，第二個是正確的：</p>
		<p>for I := 0 to 10 do begin // 錯誤<br />for I := 0 to 10 do // 正確<br />begin<br />但是當 begin 是接在 else 後面時則可以破例寫在 else 後面：</p>
		<p>
				<br />if (I &gt; 9) thenbegin  ...endelse begin  SomeStatement;end;</p>
		<p>當然，else 之後的 begin 要寫在新的一行也可以。</p>
		<p>〔回目錄〕</p>
		<p>
				<br />--------------------------------------------------------------------------------</p>
		<p>3.0 Object Pascal<br />3.1.括號<br />左括號的右邊和右括號的左邊不應該有空白，參考下面的例子：</p>
		<p>CallProc( AParameter ); // 錯誤<br />CallProc(AParameter); // 正確<br />3.2 保留字與關鍵字<br />Object Pascal 的保留字與關鍵字應該全部都用英文小寫。</p>
		<p>3.3 程序與函式<br />3.3.1 命名/格式<br />函式名稱第一個英文字母應該大寫，其後使用 Camel-capped 格式以便於閱讀。以下是錯誤示範：</p>
		<p>procedure thisisapoorlyformattedroutinename;</p>
		<p>適當的名稱應該像下面這個：</p>
		<p>procedure ThisIsMuchMoreReadableRoutineName;</p>
		<p>函式名稱應該要能代表它的功能，讓人能夠不看內部細節就知道該函式大概在做什麼。當函式執行了某項動作，我們通常會以一個動詞為首來命名，例如：</p>
		<p>procedure FormatHardDrive;</p>
		<p>設定某個變數值的函式應該以 Set 為字首：</p>
		<p>procedure SetUserName;</p>
		<p>取得某個變數值的函式應該以 Get 為字首：</p>
		<p>procedure GetUserName: string;</p>
		<p>3.3.2 形式參數<br />格式 <br />相同型態的參數應該合併在一個語句中：</p>
		<p>procedure Foo(Param1, Param2, Param3: Integer; Param4: string);</p>
		<p>命名 <br />參數名稱應該符合它們所代表的意義。參數名稱可以在前面加上大寫字母 'A'：</p>
		<p>procedure SomeProc(AUserName: string; AUserAge: integer);</p>
		<p>以 'A' 開頭的參數命名方式是一項不成文的慣例，這麼做可以避免當參數名稱和屬性或欄位名稱相同時所造成的混淆。</p>
		<p>參數順序 <br />以下對於參數順序的建議在使用「暫存器呼叫慣例」時特別有幫助（在效能上）。</p>
		<p>最常用的參數擺在第一位，較少用的參數依左至右的順序排列。 <br />作為輸入的參數放左邊，作為輸出的參數放右邊。 <br />將比較一般性的參數放在左邊，比較特殊的放右邊，例如： <br />procedure SomeProc(APlanet, AContinent, ACountry, AState, ACity);</p>
		<p>以上關於參數排列的建議可能會有許多例外情形，例如事件處理函式，它總是會以 Sender 最為第一個參數。</p>
		<p>常數參數 <br />如果參數值不會被函式修改，應該在參數前面冠上 const，特別是以下這些型態：record, array, ShortString, interface。</p>
		<p>名稱衝突 <br />如果你使用的兩個單元中有相同的函式名稱，當你呼叫該函式時，被叫用的是在 uses 子句中排在後面的單元的函式。為了避免這種情況，你可以明白地指出要呼叫哪個單元的函式，例如：</p>
		<p>SysUtils.FindClose(SR);</p>
		<p>和</p>
		<p>Windows.FindClose(Handle);</p>
		<p>3.4 變數<br />3.4.1 變數命名與格式<br />變數名稱應和它們的目的相符。<br />迴圈控制變數通常以 i, j ,k 來命名，當然你也可以用像是 UserIndex 之類有意義的名稱。<br />布林變數的名稱應該要能充分表達 True 或 False 的意思。</p>
		<p>3.4.2 區域變數<br />函式的區域變數恨其他變數的命名規則一樣。暫時性的變數也要有適當的名稱。</p>
		<p>當有必要的時候，在一進入函式時就要初始化區域變數。AnsiString 型態的區域變數會被自動初始化為空字串，interface 和 dispinterface 型態的區域變數會自動被初始化為 nil，而 Variant 和 OleVariant 區域變數則會被自動初始化為 Unassigned。</p>
		<p>3.4.3 全域變數<br />你應該盡量避免使用全域變數，當你真的需要時才使用全域變數，而且盡量在一個單元的範圍內使用，如果一個全域變數會被多個單元使用，你應該將它移到一個共用的單元內。</p>
		<p>〔回目錄〕</p>
		<p>
				<br />--------------------------------------------------------------------------------</p>
		<p>3.5 型態<br />3.5.1 大小寫慣例<br />如果型態的名稱屬於保留字，就全部小寫。Win32 API 的型態則全用大寫，一些比較特殊的型態，你應該遵循 Windows.pas 或其他 API 單元裡面的寫法。至於其他的型態，通常是名稱的第一個字母大寫，其餘採用 Camel-capped 方式，參考以下範例：</p>
		<p>
				<br />var  MyString: string;    // string 是保留字.  WindowHandle: HWND;  // Win32 API 的型態.  AForm: TMyForm;        i: Integer;          // 用小寫的 integer 也無妨.</p>
		<p>3.5.2 浮點數型態<br />不要使用 Real 型態，它是為了相容於舊的 pascal 程式而保留的。一般使用浮點數時，請使用 double 型態，它是 IEEE 定義的標準資料格式。如果需要更大範圍的數值，可使用 Extended，但它是屬於 Intel 規格，而且 Java 不支援。只有當浮點數實踐佔用的位於組大小有意義時才使用 Single（例如使用另一種語言寫成的 DLL 時）。</p>
		<p>3.5.3 列舉型態（Enumerated Types）<br />列舉型態的名稱必須以字母 'T' 開頭，藉此突顯它是一個型態。列舉型態中的識別字名稱應該以 2～3 個和其型態相關的小寫英文字母開頭，例如：</p>
		<p>TSongType = (stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB);<br />列舉型態的變數名稱可以直接將型態的第一個字母 'T' 拿掉來命名，或是其他具有特殊意義的名稱，例如：FavoriteSongType1, FavoriteSongType2。</p>
		<p>3.5.4 Variant 和 OleVariant 型態<br />通常不建議使用這兩種型態，它們通常被使用在只有執行時期才能確定其型態的時候，例如 COM 和資料庫程式設計。你應該只有在撰寫 COM 相關程式的時候才使用 OleVariant，因為 Variant 可以有效率地儲存 Delphi 字串，而 OleVariant 則必須將所有字串轉換成 OLE 字串（WideChar 字串），而且不會被參考計數－－它們總是被複製成新的字串。</p>
		<p>3.5.5 結構型態<br />陣列型態 <br />陣列型態的名稱開頭冠上 'T'，如果要宣告指標陣列的型態，名稱開頭應該冠上 'P'，而且要宣告在陣列型態的前面，參考範例：</p>
		<p>type<br />PCycleArray = ^TCycleArray;<br />TCycleArray = array [1..100] of integer;<br />陣列的變數在命名時可以直接將開頭的 'T' 拿掉作為變數名稱。</p>
		<p>記錄型態 <br />和陣列型態的規則一樣，參考下面的範例：</p>
		<p>type<br />PEmployee = ^TEmployee;<br />TEmployee = record<br />EmployeeName: string<br />EmployeeRate: Double;<br />end;<br />〔回目錄〕</p>
		<p>
				<br />--------------------------------------------------------------------------------</p>
		<p>3.6 陳述句<br />3.6.1 if 陳述句<br />比較常發生的情形應該放在 if/then/else 裡面的 then 字句中，較少發生的情形則放在 else 字句裡面。 <br />避免使用一長串的 if 敘述，如果可能的話，使用 case 來取代。 <br />巢狀 if 不應該超過四層。當巢狀 if 超過四層時，你應該想辦法以更簡明的方式來撰寫這段程式碼（例如將部分判斷式寫成獨立函式）。 <br />不要在 if 敘述中使用不必要的括號。 <br />3.6.2 case 陳述句<br />case 裡面的各個條件應該以數字或英文字母的順序排列。 <br />各個條件的處理動作應盡量簡短，通常以不超過五行程式碼為限，如果要處理的動作太複雜的話，應該寫成獨立的函式。 <br />else 子句只有當需要預設行為或者偵測錯誤時才使用。 <br />3.6.3 while 陳述句<br />不建議在 while 中使用 Exit 跳離迴圈，儘可能只使用條件式和 break 命令。 <br />給 while 迴圈使用的變數的初始化動作應該要緊鄰在進入迴圈之前，其間不要有任何不相干的程式碼。 <br />任何後續處理應在迴圈後立即進行。 <br />3.6.4 for 陳述句<br />3.6.5 repeat 陳述句<br />3.6.6 with 陳述句<br />〔回目錄〕</p>
		<p>
				<br />--------------------------------------------------------------------------------</p>
		<p>3.7 結構化異常處理（Structured Exception Handling）<br />異常處理常被用於捕捉錯誤和資源回收，例如，假設你你配置了一項資源，你可以在 finally 子句撰寫釋放資源的程式碼以確保資源會被釋放。</p>
		<p>3.7.1 try...finally<br />在不需要理會錯誤的情形下，可以使用此敘述來確保資源被回收，但是每一個配置資源的動作都應該對應一個 try...finally 敘述，以下的程式碼可能會引發問題：</p>
		<p>SomeClass1 := TSomeClass.Create;<br />SomeClass2 := TSomeClass.Create;<br />try<br />{do some code }<br />finally<br />SomeClass1.Free;<br />SomeClass2.Free;<br />end;<br />比較安全的寫法應該是：</p>
		<p>SomeClass1 := TSomeClass.Create;<br />try<br />SomeClass2 := TSomeClass.Create;<br />try<br />{do some code }<br />finally<br />SomeClass2.Free;<br />end;<br />finally<br />SomeClass1.Free;<br />end;<br />3.7.2 try...except<br />你可以用此敘述來捕捉異常並進行額外的處理。一般來說，你不會只為了顯示錯誤訊息而使用 try...except，因為 Application 物件會自動幫你顯示錯誤訊息。如果你在 except 裡面處理完該做的事情之後想要再將錯誤傳出去，可以使用 raise 指令。</p>
		<p>〔回目錄〕</p>
		<p>
				<br />--------------------------------------------------------------------------------</p>
		<p>3.8 類別（classes）<br />3.8.1 命名/格式<br />類別的型態名稱以大寫 'T' 開頭，例如：</p>
		<p>type<br />TCustomer = class(TObject)<br />類別實體的名稱可以直接將前面的 'T' 去掉：</p>
		<p>var<br />Customer: TCustomer;<br />註：元件的命名規則請參考「元件」章節。</p>
		<p>3.8.2 欄位（Fields）<br />類別中的欄位，指的就是私有成員（private members），他們的命名規則和一般的變數相同，但是必須在前面冠上大寫 'F' ，表示他們是 fields。 <br />3.8.3 方法（Methods）<br />命名/格式 <br />Methods 的命名規則和一般函式相同。</p>
		<p>靜態方法（Static Methods） <br />當你不希望某個 method 被子類別改寫（override）的話，可以將它宣告為靜態方法。</p>
		<p>虛擬/動態方法（Virtual/Dynamic Methods） <br />當你預期某個 method 會被子類別改寫的話，應將它宣告為 virtual。而 dynamic 的使用時機是當一個類別有很多子類別的時候，例如一個類別有 100 個子類別，而這些子類別都會用到某個 method，但是很少會去改寫它，那這個 method 就應該被宣告為 dynamic 以節省記憶體。</p>
		<p>註：每一個類別的 virtual methods 需要以一個虛擬方法表（VMT, Virtual Method Table）來記錄。</p>
		<p>抽象方法（Abstract Methods） <br />抽象方法應該只被用於抽象類別中，它們主要是用來定義基礎類別的介面。</p>
		<p>屬性存取方法（Property-Access Methods） <br />存取屬性的方法就是你經常在元件的原始碼中看到的 Get/Set 方法，它們各自對應到屬性的讀取和寫入動作，寫入的方法名稱是以 Set 開頭，參數值的名稱通常以 Value 命名。參考以下範例：</p>
		<p>
				<br />TSomeClass =class(TObject)private  FSomeField: Integer;protected  function GetSomeField: Integer;  procedure SetSomeField(Value: Integer);public  property SomeField: Integer read GetSomeField write SetSomeField;end;</p>
		<p>這些 Get/Set 方法應該放在 private 或 protected 區段中。</p>
		<p>3.8.4 屬性（Properties）<br />屬性可以讓外界存取類別的私有成員，其命名方式是將私有成員名稱前面的 'F' 去掉。由於屬性代表的是資料，所以名稱應該是名詞而非動詞。</p>
		<p>通常屬性是單數，如果是陣列型態的屬性，其名稱應該使用複數。</p>
		<p>〔回目錄〕</p>
		<p>
				<br />--------------------------------------------------------------------------------</p>
		<p>4.0 檔案<br />4.1 Project Files<br />專案名稱應該要能描述其功能，例如，The Delphi 5 Developer's Guide 的 Bug Manager 的專案名稱就取名為 DDGBugs.dpr。</p>
		<p>4.2 Form Files<br />Form 的檔案名稱以 Frm 作結尾，例如，AboutFrm.pas。主視窗通常會以 MainFrm.pas 命名。</p>
		<p>4.3 Data Module Files<br />Data Module 的檔案名稱以 DM 作結尾，例如，CustomerDM.pas 或 CustomerDm.pas。</p>
		<p>4.4 Remote Data Module Files<br />Remote Data Module 的檔案名稱以 RDM 作結尾，例如，CustomerRDM.pas 或 CustomerRdm.pas。</p>
		<p>註：MTSDataModule 也是 Remote Data Module 的一種，因此可以使用相同的命名方式。</p>
		<p>4.5 Unit Files<br />4.5.1 一般單元結構<br />uses 子句 <br />在 interface 區段的 uses 子句應該只包含 interface 會用到的單元，在 implementation 區段的 uses 子句應該只包含 implementation 會用到的單元，沒有用到的單元應該將其移除。</p>
		<p>interface 區段 <br />如其名稱所揭示的，這部分是提供外界存取的介面，在此區段中所宣告的型態，變數，函式都可能會被其他單元使用，因此不希望被外界存取者應置於 implementation 區段內。</p>
		<p>implementation 區段 <br />此區段所宣告的型態，變數，函式等都只能被此單元使用。</p>
		<p>initialization 區段 <br />不要把很花時間的工作放在此區段中，否則會拖慢應用程式載入的時間。</p>
		<p>finalization 區段 <br />在 initialization 區段中配置的資源必須在此處釋放。</p>
		<p>4.5.2 一般用途的單元<br />例如，一個工具類的單元可能被命名為 BugUtilities.pas（或 BugUtils.pas），而一個專門存放全域變數的單元可能叫做 AppGlobals.pas。</p>
		<p>記住這類共用單元可能被專案中所有的程式單元及套件使用，為了避免名稱衝突，在為檔案命名時不要用太普遍的名稱。</p>
		<p>4.5.3 元件單元<br />元件單元應該要被集中存放在一個獨立的目錄，不應該放在專案目錄下跟其他檔案混在一起。</p>
		<p>4.6 檔案表頭（File Headers）<br />檔案表頭通常提供了檔案的用途，版權宣告，作者，注意事項...等資訊。你可以採用類似下面的寫法：</p>
		<p>(*---------------------------------------------------------------------------<br />說明</p>
		<p>簡要說明此檔案的用途。</p>
		<p>注意事項</p>
		<p>版權宣告</p>
		<p>修改歷史<br />---------------------------------------------------------------------------*)<br />如果有輸入或輸出的參數，以及跟外部互動的介面也可以在檔頭中註明。</p>
		<p>〔回目錄〕</p>
		<p>
				<br />--------------------------------------------------------------------------------</p>
		<p>5.0 Forms and Data Modules<br />5.1 Forms<br />5.1.1 Form 型態命名標準<br />以 TXxxxForm 的方式命名，例如：</p>
		<p>TAboutForm = class(TForm)<br />主視窗通常會這麼寫：</p>
		<p>TMainForm = class(TForm)<br />輸入客戶基本資料的表單可能像這樣：</p>
		<p>TCustomerEntryForm = class(TForm)<br />5.1.2 Form 實體命名標準<br />將型態名稱前面的 'T' 去掉作為 Form 的實體名稱，參考下面的範例：</p>
		<p>型態名稱<br />實體名稱</p>
		<p>TAboutForm AboutForm <br />TMainForm MainForm <br />TCustomerEntryForm CustomerEntryForm </p>
		<p>5.1.3 自動建立的 Forms<br />只有主視窗才應該被自動建立，除非有特殊的原因，否則其他視窗都應該以動態的方式建立。</p>
		<p>5.1.4 建立 Modal Form 的函式<br />當你要使用一個 Form 時，不要用 Delphi 幫你產生的 Form 變數，應該以一個函式來建立及顯示這個 Form，參考下面的範例：</p>
		<p>
				<br />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.</p>
		<p>5.2 Data Modules<br />5.2.1 Data Module 型態命名標準<br />以 TXxxDataModule 或 TXxxDmod 的方式命名，例如：</p>
		<p>TCustomerDmod = class(TDataModule)<br />5.2.2 Data Module 實體命名標準<br />將型態名稱前面的 'T' 去掉作為 Data Module 的實體名稱，例如：</p>
		<p>var<br />CustomerDmod: TCustomerDmod;<br />5.3 Remote Data Modules<br />命名方式可以和一般的 Data Modules 一樣使用 TXxxDmod，或者用 TXxxRdmod。例如：</p>
		<p>var<br />CustomerRmod: TCustomerRdmod;<br />〔回目錄〕</p>
		<p>
				<br />--------------------------------------------------------------------------------</p>
		<p>6.0 套件（Packages）<br />6.1 執行時期 v.s. 設計時期套件<br />執行時期套件應該只包含其中各元件所需參考的單元或套件，其他只有在設計時期才會用到的程式碼或單元，例如屬性/元件編輯器等，就應該放在設計時期套件裡，此外，用來註冊元件的單元也應該放在設計時期套件裡。</p>
		<p>6.2 檔案命名標準<br />套件的檔案名稱名應該仿照以下的例子：</p>
		<p>iiilibvv.dpk（設計時期套件） <br />iiistdvv.dpk（執行時期套件） <br />其中 iii 表示用來作為識別的三個字元，可能是你的姓名，公司名稱，或是其他個體的縮寫。字元 vv 表示此套件所適用的 Delphi 版本號碼。而 lib 和 std 則用來區別設計時期和執行時期。</p>
		<p>假設某個套件同時有設計時期和執行時期兩種套件，他們會有相似的檔案，例如 Delphi 5 Developer's Guide 的套件會命名為：</p>
		<p>DdgLib50.dpk（設計時期套件） <br />DdgStd50.dpk（執行時期套件） <br />〔回目錄〕</p>
		<p>
				<br />--------------------------------------------------------------------------------</p>
		<p>7.0 元件（Components）<br />7.1 使用者自訂元件<br />7.1.1 元件型態命名標準<br />元件的命名方式和之前「類別」一節當中提到的命名方式類似，差別僅在於元件名稱前面會冠上三個字元以作為識別，這三個前置字元可以是你個人、公司、或任何個體的名稱縮寫，例如，在 Delphi 5 Developer's Guide 裡面有一個時鐘元件，他的定義是：</p>
		<p>TddgClock = class(TComponent)</p>
		<p>注意這三個前置字元都是小寫英文字母。</p>
		<p>7.1.2 元件單元<br />元件所屬的單元裡面應該就只包含一個主元件，所謂「主元件」就是指那些會放到 Delphi 元件盤上面的元件，其他輔助性質的元件則可以跟主元件放在同一個單元裡面。</p>
		<p>7.1.3 使用註冊單元<br />用來註冊元件的程序應該被抽離出來，並集中到一個獨立的檔案當中，這個專門用來註冊元件的單元同時也可以用來註冊屬性編輯器，元件編輯器，專家（Delphi experts）....等等。</p>
		<p>由於註冊元件的動作只有在設計時期套件中才會執行，因此註冊單元應該只被放在設計時期套件裡，而不會出現在執行時期套件裡。註冊單元的檔案名稱建議您以下列型式命名：</p>
		<p>XxxReg.pas</p>
		<p>其中 Xxx 表示用來作為識別的三個字元，可能是你的姓名，公司名稱，或是其他個體的縮寫。例如，在 Delphi 5 Developer's Guide 裡面用來註冊元件的單元其檔名就是 DdgReg.pas。</p>
		<p>7.2 元件實體命名慣例<br />元件的命名採用類似「匈牙利表示法」的命名慣例，元件的名稱分為「元件型態字首」以及「元件修飾名稱」兩個部分。</p>
		<p>7.2.1 元件型態字首（Component Type Prefixes）<br />所謂「元件型態字首」，就是一組代表元件型態的英文小寫字母，例如，TButton 的型態字首為 btn，TEdit 的型態字首為 edt。你可以依照下列的步驟挑選出合適的字首：</p>
		<p>移除開頭的 'T' 字母，例如，"TButton" 就變成 "Button"。 <br />移除所有的母音字母，並且全部改成小寫，例如，"Button" 就變成 "bttn"，"Edit" 變成 "edt"。 <br />兩個連續的相同字母僅保留一個，例如，"bttn" 變成 "btn"。 <br />若結果和其他的名稱衝突，可以開始加入母音字母，例如，"TBatton" 的字首和 "TButton" 一樣，因此可以將 "TBatton" 的字首改成 "batn"。 <br />請參考另一篇 "Delphi 5 元件型態字首" 以取得更多元件型態字首的資訊。</p>
		<p>7.2.2 元件修飾詞名稱（Component Qualifier Name）<br />元件修飾詞名稱應該要符合其作用，例如，一個用來關閉視窗的按鈕應該被命名為 "btnClose"，輸入員工姓名的文字盒應被命名為 edtEmpName。</p>
		<p> </p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/98319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-02-06 15:15 <a href="http://www.blogjava.net/liaojiyong/archive/2007/02/06/98319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Delphi 函數表</title><link>http://www.blogjava.net/liaojiyong/archive/2007/02/06/98318.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Tue, 06 Feb 2007 07:12:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/02/06/98318.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/98318.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/02/06/98318.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/98318.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/98318.html</trackback:ping><description><![CDATA[名稱                        類型         說明<br />----------------------------------------------------------------------------------<br />Abort                       函數         引起放棄的意外處理 <br />Abs                         函數         絕對值函數 <br />AddExitProc                 函數         將一過程添加到運行時庫的結束過程表中 <br />Addr                        函數         返回指定對象的地址 <br />AdjustLineBreaks            函數         將給定字符串的行分隔符調整為CR/LF序列 <br />Align                       屬性         使控件位於窗口某部分 <br />Alignment                   屬性         控件標籤的文字位置 <br />AllocMem                    函數         在堆棧上分配給定大小的塊 <br />AllowGrayed                 屬性         允許一個灰度選擇 <br />AnsiCompareStr              函數         比較字符串（區分大小寫） <br />AnsiCompareText             函數         比較字符串（不區分大小寫） <br />AnsiLowerCase               函數         將字符轉換為小寫 <br />AnsiUpperCase               函數         將字符轉換為大寫 <br />Append                      函數         以附加的方式打開已有的文件 <br />ArcTan                      函數         余切函數 <br />AssignFile                  函數         給文件變量賦一外部文件名 <br />Assigned                    函數         測試函數或過程變量是否為空 <br />AutoSize                    屬性         自動控制標籤的大小 <br />BackgroundColor             屬性         背景色 <br />BeginThread                 函數         以適當的方式建立用於內存管理的線程 <br />BevelInner                  屬性         控件方框的內框方式 <br />BevelOuter                  屬性         控件方框的外框方式 <br />BevelWidth                  屬性         控件方框的外框寬度 <br />BlockRead                   函數         讀一個或多個記錄到變量中 <br />BlockWrite                  函數         從變量中寫一個或多個記錄 <br />BorderStyle                 屬性         邊界類型 <br />BorderWidth                 屬性         邊界寬度 <br />Break                       命令         終止for、while、repeat循環語句 <br />Brush                       屬性         畫刷 <br />Caption                     屬性         標籤文字的內容 <br />ChangeFileExt               函數         改變文件的後綴 <br />ChDir                       函數         改變當前目錄 <br />Checked                     屬性         確定復選框選中狀態 <br />Chr                         函數         返回指定序數的字符 <br />CloseFile                   命令         關閉打開的文件 <br />Color                       屬性         標籤的顏色 <br />Columns                     屬性         顯示的列數 <br />CompareStr                  函數         比較字符串（區分大小寫） <br />Concat                      函數         合併字符串 <br />Continue                    命令         繼續for、while、repeat的下一個循環 <br />Copy                        函數         返回一字符串的子串 <br />Cos                         函數         余弦函數 <br />Ctl3D                       屬性         是否具有3D效果 <br />Cursor                      屬性         鼠標指針移入後的形狀 <br />Date                        函數         返回當前的日期 <br />DateTimeToFileDate          函數         將DELPHI的日期格式轉換為DOS的日期格式 <br />DateTimeToStr               函數         將日期時間格式轉換為字符串 <br />DateTimeToString            函數         將日期時間格式轉換為字符串 <br />DateToStr                   函數         將日期格式轉換為字符串 <br />DayOfWeek                   函數         返回星期的數值 <br />Dec                         函數         遞減變量值 <br />DecodeDate                  函數         將日期格式分解為年月日 <br />DecodeTime                  函數         將時間格式分解為時、分、秒、毫秒 <br />Delete                      函數         從字符串中刪除子串 <br />DeleteFile                  命令         刪除文件 <br />DiskFree                    函數         返回剩餘磁盤空間的大小 <br />DiskSize                    函數         返回指定磁盤的容量 <br />Dispose                     函數         釋放動態變量所佔的空間 <br />DisposeStr                  函數         釋放字符串在堆棧中的內存空間 <br />DitherBackground            屬性         使背景色的色彩加重或減少50% <br />DragCursor                  屬性         當鼠標按下時光標的形狀 <br />DragMode                    屬性         按動的作用方式 <br />DropDownCount               屬性         容許的顯示數據項的數目 <br />EditMask                    屬性         編輯模式 <br />Enabled                     屬性         是否使標籤呈現打開狀態 <br />EncodeDate                  函數         將年月日合成為日期格式 <br />EncodeTime                  函數         將時、分、秒、毫秒合成為時間格式 <br />EndMargin                   屬性         末尾邊緣 <br />Eof                         函數         對有類型或無類型文件測試是否到文件尾 <br />Eoln                        函數         返回文本文件的行結束狀態 <br />Erase                       命令         刪除外部文件 <br />ExceptAddr                  函數         返回引起當前意外的地址 <br />Exclude                     函數         從集合中刪除一些元素 <br />ExceptObject                函數         返回當前意外的索引 <br />Exit                        命令         立即從當前的語句塊中退出 <br />Exp                         函數         指數函數 <br />ExpandFileName              函數         返回包含絕對路徑的字符串 <br />ExtendedSelect              屬性         是否允許存在選擇模式，True時，MultiSelect才有意義 <br />ExtractFileDir              函數         返回驅動器和路徑 <br />ExtractFileExt              函數         返回文件的後綴 <br />ExtractFileName             函數         返回文件名 <br />ExtractFilePath             函數         返回指定文件的路徑 <br />FileAge                     函數         返回文件已存在的時間 <br />FileClose                   命令         關閉指定的文件 <br />FileCreate                  命令         用指定的文件名建立新文件 <br />FileDateToDateTime          函數         將DOS的日期格式轉換為DELPHI的日期格式 <br />FileExists                  函數         檢查文件是否存在 <br />FileGatAttr                 函數         返回文件的屬性 <br />FileGetDate                 函數         返回文件的DOS日期時間標記 <br />FileOpen                    命令         用指定的存取模式打開指定的文件 <br />FilePos                     函數         返回文件的當前指針位置 <br />FileRead                    命令         從指定的文件讀取 <br />FileSearch                  命令         在目錄中搜索指定的文件 <br />FileSeek                    函數         改變文件的指針 <br />FileSetAttr                 函數         設置文件屬性 <br />FileSetDate                 函數         設置文件的DOS日期時間標記 <br />FileSize                    函數         返回當前文件的大小 <br />FileWrite                   函數         對指定的文件做寫操作 <br />FillChar                    函數         用指定的值填充連續字節的數 <br />FindClose                   命令         終止FindFirst/FindNext序列 <br />FindFirst                   命令         對指定的文件名及屬性搜索目錄 <br />FindNext                    命令         返回與文件名及屬性匹配的下一入口 <br />FloatToDecimal              函數         將浮點數轉換為十進制數 <br />FloatToStrF                 函數         將浮點數轉換為字符串 <br />FloatToStr                  函數         將浮點數轉換為字符串 <br />FloatToText                 函數         將給定的浮點數轉換為十進制數 <br />FloatToTextFmt              函數         將給定的浮點數轉換為十進制數 <br />Flush                       函數         將緩衝區的內容刷新到輸出的文本文件中 <br />FmtLoadStr                  函數         從程序的資源字符串表中裝載字符串 <br />FmtStr                      函數         格式化一系列的參數，其結果以參數Result返回 <br />Font                        屬性         設置字體 <br />Format                      函數         格式化一系列的參數並返回Pascal字符串 <br />FormatBuf                   函數         格式化一系列的參數 <br />FormatDateTime              函數         用指定的格式來格式化日期和時間 <br />FormatFloat                 函數         指定浮點數格式 <br />Frac                        函數         返回參數的小數部分 <br />FreeMem                     函數         按給定大小釋放動態變量所佔的空間 <br />GetDir                                   返回指定驅動器的當前目錄 <br />GetHeapStatus                            返回內存管理器的當前狀態 <br />GetMem                                   建立一指定大小的動態變量，並將指針指向該處 <br />GetMemoryManager                         返回內存管理器的入口點 <br />Glyph                       函數         按鈕上的圖像 <br />Halt                                     停止程序的執行並返回到操作系統 <br />Hi                                       返回參數的高地址位 <br />High                                     返回參數的上限值 <br />Hint                        屬性         提示信息 <br />Int                                      返回參數的整數部分 <br />Include                                  添加元素到集合中 <br />Insert                                   在字符串中插入子串 <br />IntToHex                                 將整型數轉換為十六進制數 <br />IntToStr                                 將整型數轉換為字符串 <br />IOResult                                 返回最新的I/O操作完成狀態 <br />IsValidIdent                             測試字符串是否為有效的標識符 <br />Items                       屬性         默認顯示的節點 <br />Kind                        屬性         擺放樣式<br />LargeChange                 屬性         最大改變值 <br />Layout                      屬性         圖像佈局 <br />Length                      函數         返回字符串的動態長度 <br />Lines                       屬性         缺省顯示內容 <br />Ln                          函數         自然對數函數 <br />Lo                          函數         返回參數的低地址位 <br />LoadStr                     函數         從應用程序的可執行文件中裝載字符資源 <br />LowerCase                   函數         將給定的字符串變為小寫 <br />Low                         函數         返回參數的下限值 <br />Max                         屬性         最大值 <br />MaxLength                   屬性         最大長度 <br />Min                         屬性         最小值 <br />MkDir                       命令         建立一子目錄 <br />Move                        函數         從源到目標複製字節 <br />MultiSelect                 屬性         允許同時選擇幾個數據項 <br />Name                        屬性         控件的名字 <br />New                         函數         建立新的動態變量並設置一指針變量指向他 <br />NewStr                      函數         在堆棧上分配新的字符串 <br />Now                         函數         返回當前的日期和時間 <br />Odd                                      測試參數是否為奇數 <br />OnActivate                  事件         焦點移到窗體上時觸發 <br />OnClick                     事件         單擊窗體空白區域觸發 <br />OnDblClick                  事件         雙擊窗體空白區域觸發 <br />OnCloseQuery                事件         使用者試圖關閉窗體觸發 <br />OnClose                     事件         窗體關閉後才觸發 <br />OnCreate                    事件         窗體第一次創建時觸發 <br />OnDeactivate                事件         用戶切換到另一應用程序觸發 <br />OnDragDrop                  事件         鼠標拖放操作結束時觸發 <br />OnDragOver                  事件         有其他控件從他上面移過觸發 <br />OnMouseDown                 事件         按下鼠標鍵時觸發 <br />OnMouseUp                   事件         釋放鼠標鍵時觸發 <br />OnMouseMove                 事件         移動鼠標時觸發 <br />OnHide                      事件         隱藏窗體時觸發 <br />OnKeyDown                   事件         按下鍵盤某鍵時觸發 <br />OnKeyPress                  事件         按下鍵盤上的單個字符鍵時觸發 <br />OnKeyUp                     事件         釋放鍵盤上的某鍵時觸發 <br />OnPaint                     事件         窗體上有新部分暴露出來觸發 <br />OnResize                    事件         重新調整窗體大小觸發 <br />OnShow                      事件         在窗體實際顯示之前瞬間觸發 <br />Ord                                      返回序數類的序數 <br />OutlineStyle                屬性         類型 <br />OutOfMemoryError                         引起OutOfMemory意外 <br />PageIndex                   屬性         頁索引 <br />Pages                       屬性         頁 <br />ParamCount                  函數         返回在命令行上傳遞給程序的參數數量 <br />ParamStr                    函數         返回指定的命令行參數 <br />Pen                         屬性         畫刷設置 <br />Pi                          函數         返回圓周率Pi <br />Picture                     屬性         顯示圖像 <br />PictureClosed               屬性         設置Closed位圖 <br />PictureLeaf                 屬性         設置Leaf位圖 <br />PictureMinus                屬性         設置Minus位圖 <br />PictureOpen                 屬性         設置Open位圖 <br />PicturePlus                 屬性         設置Plus位圖 <br />Pos                         函數         在字符串中搜索子串 <br />Pred                        函數         返回先前的參數 <br />Random                      函數         返回一隨機函數 <br />Randomize                   函數         用一隨機數初始化內置的隨機數生成器 <br />Read                        函數         對有格式的文件，讀一文件組件到變量中；<br />                                         對文本文件，讀一個或多個值到一個或多個變量中 <br />Readln                      函數         執行Read過程，然後跳到文件下一行 <br />ReadOnly                    屬性         只讀屬性 <br />ReAllocMem                  函數         分配一動態變量 <br />Rename                      函數         重命名外部文件 <br />RenameFile                  函數         對文件重命名 <br />Reset                       函數         打開已有的文件 <br />Rewrite                     函數         建立並打開一新的文件 <br />RmDir                       函數         刪除空的子目錄 <br />Round                       函數         將實數值捨入為整型值 <br />RunError                    函數         停止程序的執行 <br />ScrollBars                  屬性         滾動條狀態 <br />Seek                        函數         將文件的當前指針移動到指定的組件上 <br />SeekEof                     函數         返回文件的文件結束狀態 <br />SeekEoln                    函數         返回文件的行結束狀態 <br />SelectedColor               屬性         選中顏色 <br />SetMemoryManager            函數         設置內存管理器的入口點 <br />SetTextBuf                  函數         給文本文件指定I/O緩衝區 <br />Shape                       屬性         顯示的形狀 <br />ShowException               函數         顯示意外消息與地址 <br />Sin                         函數         正弦函數 <br />SizeOf                      函數         返回參數所佔的字節數 <br />SmallChange                 屬性         最小改變值 <br />Sorted                      屬性         是否允許排序 <br />Sqr                         函數         平方函數 <br />Sqrt                        函數         平方根函數 <br />StartMargin                 屬性         開始邊緣 <br />State                       屬性         控件當前狀態 <br />Str                         函數         將數值轉換為字符串<br />StrAlloc                    函數         給以NULL結束的字符串分配最大長度-1的緩衝區 <br />StrBufSize                  函數         返回存儲在由StrAlloc分配的字符緩衝區的最大字符數 <br />StrCat                      函數         將一字符串附加到另一字符串尾並返回合併的字符串 <br />StrComp                     函數         比較兩個字符串 <br />StrCopy                     函數         將一個字符串複製到另一個字符串中 <br />StrDispose                  函數         釋放堆棧上的字符串 <br />StrECopy                    函數         將一字符串複製到另一個字符串並返回結果字符串尾部的指針 <br />StrEnd                      函數         返回指向字符串尾部的指針 <br />Stretch                     屬性         自動適應控件的大小 <br />StrFmt                      函數         格式化一系列的參數 <br />StrIComp                    函數         比較兩個字符串（不區分大小寫） <br />StringToWideChar            函數         將ANSI字符串轉換為UNICODE字符串 <br />StrLCat                     函數         將一字符串中的字符附加到另一字符串尾並返回合併的字符串 <br />StrLComp                    函數         以最大長度比較兩個字符串 <br />StrLCopy                    函數         將一個字符串中的字符複製到另一個字符串中 <br />StrLen                      函數         返回字符串中的字符數 <br />StrLFmt                     函數         格式化一系列的參數，其結果中包含有指向目標緩衝區的指針 <br />StrLIComp                   函數         以最大長度比較兩個字符串（不區分大小寫） <br />StrLower                    函數         將字符串中的字符轉換為小寫 <br />StrMove                     函數         將一個字符串中的字符複製到另一個字符串中 <br />StrNew                      函數         在堆棧上分配一個字符串 <br />StrPas                      函數         將以NULL結束的字符串轉換為PASCAL類的字符串 <br />StrPCopy                    函數         將PASCAL類的字符串複製為以NULL結束的字符串 <br />StrPLCopy                   函數         從PASCAL類的最大長度字符串複製為以NULL結束的字符串 <br />StrPos                      函數         返回一個字符串在另一個字符串中首次出現指針 <br />StrRScan                    函數         返回字符串中最後出現字符的指針 <br />StrScan                     函數         返回字符串中出現首字符的指針 <br />StrToDate                   函數         將字符串轉換為日期格式 <br />StrToDateTime               函數         將字符串轉換為日期/時間格式 <br />StrToFloat                  函數         將給定的字符串轉換為浮點數 <br />StrToInt                    函數         將字符串轉換為整型 <br />StrToIntDef                 函數         將字符串轉換為整型或默認值 <br />StrToTime                   函數         將字符串轉換為時間格式 <br />StrUpper                    函數         將字符串中的字符轉換為大寫 <br />Style                       屬性         類型選擇 <br />Suce                        函數         返回後繼的參數 <br />Swap                        函數         交換參數的高低地址位 <br />Tabs                        屬性         標記每一項的內容 <br />TabIndex                    屬性         標記索引 <br />Text                        屬性         顯示的文本 <br />TextToFloat                 函數         將字符串（以NULL結束的格式）轉換為浮點數 <br />Time                        函數         返回當前的時間 <br />TimeToStr                   函數         將時間格式轉換為字符串 <br />Trim                        函數         從給定的字符串中刪除前導和尾部的空格及控制字符 <br />TrimLeft                    函數         從給定的字符串中刪除首部的空格及控制字符 <br />TrimRight                   函數         從給定的字符串中刪除尾部的空格及控制字符 <br />Trunc                       函數         將實型值截取為整型值 <br />Truncate                    函數         截去當前文件位置後的內容 <br />UnSelectedColor             屬性         未選中顏色 <br />UpCase                                   將字符轉換為大寫 <br />UpperCase                                將給定的字符串變為大寫 <br />Val                         函數         將字符串轉換為整型值 <br />VarArrayCreate              函數         以給定的界限和維數建立變體數組 <br />VarArrayDimCount            函數         返回給定變體的維數 <br />VarArrayHighBound           函數         返回給定變體數組維數的上界 <br />VarArrayLock                函數         鎖定給定的變體數組 <br />VarArrayLowBound            函數         返回給定變體數組維數的下界 <br />VarArrayOf                  函數         返回指定變體的數組元素 <br />VarArrayRedim               函數         通過改變上限來調整變體的大小 <br />VarArrayUnlock              函數         解鎖指定的變體數組 <br />VarAsType                   函數         將變體轉換為指定的類型 <br />VarCase                     函數         將變體轉換為指定的類型並保存他 <br />VarClear                    函數         清除指定的變體 <br />VarCopy                     函數         將指定的變體複製為指定的變體 <br />VarFormDateTime             函數         返回包含日期時間的變體 <br />VarIsArray                  函數         測試變體是否為數組 <br />VarIsEmpty                  函數         測試變體是否為UNASSIGNED <br />VarIsNull                   函數         測試變體是否為NULL <br />VarToDateTime               函數         將給定的變體轉換為日期時間 <br />VarType                     函數         將變體轉換為指定的類型並保存他 <br />Visible                     屬性         控件的可見性 <br />WantReturns                 屬性         為True時，按回車鍵產生一個回車符；<br />                                         為False時，按下Ctrl+Enter才產生回車符 <br />Write                       命令         對有格式的文件，寫一變量到文件組件中；<br />                                         對文本文件，寫一個或多個值到文件中 <br />Writeln                     命令         執行WRITE過程，然後輸出一行結束標誌 <br />WideCharLenToString         函數         將ANSI字符串轉換為UNICODE字符串 <br />WideCharLenToStrWar         函數         將UNICODE字符串轉換為ANSI字符串變量 <br />WideCharToString            函數         將UNICODE字符串轉換為ANSI字符串 <br />WideCharToStrVar            函數         將UNICODE字符串轉換為ANSI字符串變量 <br /><img src ="http://www.blogjava.net/liaojiyong/aggbug/98318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-02-06 15:12 <a href="http://www.blogjava.net/liaojiyong/archive/2007/02/06/98318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>偷龍轉鳳的物件設計方法</title><link>http://www.blogjava.net/liaojiyong/archive/2007/02/06/98316.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Tue, 06 Feb 2007 07:04:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/02/06/98316.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/98316.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/02/06/98316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/98316.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/98316.html</trackback:ping><description><![CDATA[
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">一般我們設計一個物件，規規矩矩的從</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">VCL</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">下選擇一個最符合本身需求的物計</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">繼承下來，從這個物件開始擴充功能，但有時候這種標準的設計方式，有實</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">際的困難，一者我們手上可能沒有這個物件的</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">Source</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">，二者更改這個物件之</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">後，需考慮原先的物件可能已經在系統中運作，為了不破壞原有的物件功能</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">，及使用的介面，這個時候我們需要一種偷龍轉鳳的方法，偷偷的把這個物</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">件至換掉，要置換這個物件，最好的方法就是產生一個一模一樣的類別出來</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">，而且不改變原有物件的屬性及方法，或者是在原有物件上擴充功能。</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">以下提供一個另類的設計方法，來解決這個問題。假如有一個</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">TEdit </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">的物件</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">，我們希望它在修改資料的時候，可以改變顏色，在不改變原有物件的使用</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">介面下，如何來擴充這個功能呢﹖</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">請看這個範例的說明﹕</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">這個繼承自</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW"> TEdit </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">的</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW"> TMyEdit </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">很簡單的宣告</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW"> ReadOnly </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">這個屬性，其他 </span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">Create</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">，</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">Load </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">的方法，只是要在設計期間取得目前正確的顏色設定而已。</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">type<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">  </span>TMyEdit = class(TEdit)<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">  </span>private<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">    </span>FDesignColor: TColor;<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">    </span>FReadOnly: boolean;<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">    </span>procedure SetReadOnly(Value: boolean);<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">    </span>procedure SetColor;<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">  </span>protected<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">    </span>procedure Loaded; override;<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">  </span>public<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">    </span>constructor Create(AOwner: TComponent); override;<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">  </span>published<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">    </span>property ReadOnly: boolean read FReadOnly write SetReadOnly;<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">end; <o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">接下來我們看</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW"> TMyEdit </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">如何改變原來的屬性，請把焦點放在</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW"> SetReadOnly</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">上面，這個 </span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">procedrue </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">動了以下的手腳</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">: </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">在繼承</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">ReadOnly</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">原有的屬性之後，進行顏色的改變。</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">procedure TMyEdit.SetReadOnly(Value: boolean);<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">begin<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">  </span>FReadOnly:= Value;<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">  </span>inherited ReadOnly:= Value;<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">  </span>SetColor;<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">end;<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes"> </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">SetReadOnly </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">在父層類別</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW"> TCustomEdit <o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">中已有定義，只是它被放在</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW"> private <o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">區段裡，子類別是看不到的，否則只要改寫</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW"> SetReadOnly <o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">方法就行了。在這裡重新定義了</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW"> ReadOnly <o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">屬性，除了保有父類別</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW"> ReadOnly <o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">屬性的作用，並賦予它新的行為。在設計類別時，也許將</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">Get/Set </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">存取方法宣告在</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW"> protected <o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">區段會比較方便，後代類別可以直接改寫</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW"> Get/Set <o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">方法來改變或附加行為，但這也表示父類別將失去對私有成員的保護力，子類別幾乎</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">可以完全改變父類別的行為。因此，要把</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">Get/Set </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">放在</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW"> private </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">還是</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW"> protected <o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">區段實為見仁見智的問題，設計者可視情況選擇對自己最有利的方式。</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">以下是</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW"> TMyEdit </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">所有實作的部分﹕</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">constructor TMyEdit.Create(AOwner: TComponent);<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">begin<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">  </span>inherited;<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">  </span>FDesignColor:= clWindow; <o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">end; <o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">procedure TMyEdit.Loaded; <o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">begin<span style="mso-spacerun: yes">   </span><o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">  </span>inherited;<span style="mso-spacerun: yes">   </span><o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">  </span>FDesignColor:= Color; <o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">end; <o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">procedure TMyEdit.SetColor; <o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">begin<span style="mso-spacerun: yes">   </span><o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">  </span>if ReadOnly then<span style="mso-spacerun: yes">     </span><o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">    </span>Color:= clBtnFace<span style="mso-spacerun: yes">   </span><o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">  </span>else<span style="mso-spacerun: yes">     </span><o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">    </span>Color:= FDesignColor; <o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">end; <o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">procedure TMyEdit.SetReadOnly(Value: boolean); <o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">begin<span style="mso-spacerun: yes">   </span><o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">  </span>FReadOnly:= Value;<span style="mso-spacerun: yes">   </span><o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">  </span>inherited ReadOnly:= Value;<span style="mso-spacerun: yes">   </span><o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<span style="mso-spacerun: yes">  </span>SetColor; <o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">end;<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">寫好這個物件我們開始進行測試，看這個物件如何無聲無息的嵌入我們已</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">經寫好的單元，首先我們拉一個</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">Form1</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">出來，在上面放一個</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">Edit1 </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">及</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">Button1</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">，當然您還要建構這個</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW"> TMyEdit </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">的物件，為了方便起見，請將這</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">個單元直接</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">Copy </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">到</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW"> Form1 </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">所屬的單元裡頭，然後在</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW"> Button1 </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">上面，寫入</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">:<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">TMyEdit(Edit1).ReadOnly := False; <o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">執行看看，按一下</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW"> Button1</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">，這時候</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW"> Edit1 </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">的</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW"> ReadOnly </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">是不是多了改變顏色的功能﹖</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/98316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-02-06 15:04 <a href="http://www.blogjava.net/liaojiyong/archive/2007/02/06/98316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Delphi中的快捷方式大收集</title><link>http://www.blogjava.net/liaojiyong/archive/2007/02/06/98312.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Tue, 06 Feb 2007 06:58:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/02/06/98312.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/98312.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/02/06/98312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/98312.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/98312.html</trackback:ping><description><![CDATA[
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">11.ALT+</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">游標左鍵 可以塊選程式碼，用來刪除對齊的重複程式碼非常有用</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">23.Ctrl+I </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">同</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">Tab</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">鍵</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">24.CTRL+J (</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">彈出</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">Delphi</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">語句提示視窗，選擇所需語句將自動完成一條語句</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">)</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">程式碼模板</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">25.Ctrl+M </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">同</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">Enter</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">鍵。</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">26.Ctrl+N </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">同</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">Enter</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">鍵，但游標位置保持不變</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">27.Ctrl+T </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">刪除游標右邊的一個單詞</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">28.Ctrl+Y </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">刪除游標所在行</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">37.CTRL+ENTER </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">定位到單元文件</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">42.Ctrl+O+U </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">切換選擇塊的大小寫</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">(</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">注意鬆開</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">O</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">後再按</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">U,Ctrl</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">保持按下</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">)<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">43.Ctrl+K+O </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">切換選擇塊為小寫</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">(</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">注意鬆開</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">K</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">後再按</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">O,Ctrl</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">保持按下</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">)<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">44.Ctrl+K+N </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">切換選擇塊為大寫</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">(</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">注意鬆開</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">K</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">後再按</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">N,Ctrl</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">保持按下</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">)<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">45.Ctrl+Shift+G </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">插入</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">GUID<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">46.Ctrl+Shift+T </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">在游標行加入</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">To-Do</span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">註釋</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">47.Ctrl+Shift+Y </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">刪除游標之後至本行末尾之間的文本</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">48.CTRL+SHIFT+C </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">編寫申明或者補上函數，絕好</span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">!!!<o:p></o:p></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">59.Ctrl+E </span>
				<span lang="ZH-TW" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">快速選擇（呵呵，試試吧，很好玩的） <br /></span>
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">
						<o:p>
								<br />
								<br />
								<br />
								<br />
								<br />
								<br />
								<br />
								<br />
								<br />
								<br />
								<br />
								<br />
								<br />
								<br />
								<br />
								<br />
								<br />
								<br />
								<br />
								<br />
								<br />
								<br />
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: MingLiU; mso-bidi-font-family: MingLiU; mso-fareast-language: ZH-TW">DELPHI中的快捷方式一覽<br />1.SHIFT+游標左鍵 先選中任一元件,按鍵後可選中視窗(選中元件後按Esc效果一樣)<br />2.Shift+F8 調試時彈出CPU視窗。<br />3.Shift+F10 等於游標右鍵（Windows快捷鍵）。<br />4.Shitf+箭頭 選擇<br />5.shift +F12 快速查找視窗並打開<br />6.F7 （步進式調試同時追蹤進入子過程）<br />7.F8 （步進式調試不進入子過程）<br />8.F9 執行<br />9.F12 切換EDITOR,FORM<br />10.Alt+F4 關閉所有編輯框中打開的源程序文件，但不關閉項目<br />11.ALT+游標左鍵 可以塊選程式碼，用來刪除對齊的重複程式碼非常有用<br />12.Ctrl+F9 編譯<br />13.Ctrl+shift+N(n=1,2,3,4......) 定義書籤<br />14.Ctrl+n(n=1,2,3,4......)跳到書籤n<br />15.CTRL +SHIFT+N 在書籤N處，再按一次 取消書籤<br />16.Ctrl+PageUp 將游標移至本屏的第一行，螢幕不滾動<br />17.Ctrl+PageDown 將游標移至本屏的最後一行，螢幕不滾動<br />18.Ctrl+↓ 向下滾動螢幕，游標跟隨滾動不出本屏<br />19.Ctrl+↑ 向上滾動螢幕，游標跟隨滾動不出本屏<br />20.Ctrl+Home 將游標移至文件頭<br />21.Ctrl+End 將游標移至文件尾<br />22.Ctrl+B Buffer List視窗<br />23.Ctrl+I 同Tab鍵<br />24.CTRL+J (彈出Delphi語句提示視窗，選擇所需語句將自動完成一條語句)程式碼模板<br />25.Ctrl+M 同Enter鍵。<br />26.Ctrl+N 同Enter鍵，但游標位置保持不變<br />27.Ctrl+T 刪除游標右邊的一個單詞<br />28.Ctrl+Y 刪除游標所在行<br />29.CTRL+C 複製<br />30.CTRL+V 貼上<br />31.CTRL+X 剪切<br />32.CTRL+Z 還原(Undo)<br />33.CTRL+S 保存<br />34.Ctrl+F 查找<br />35.Ctrl+L 繼續查找<br />36.Ctrl+r 替換<br />37.CTRL+ENTER 定位到單元文件<br />38.Ctrl+F3 彈出Call Stack視窗<br />39.Ctrl+F4 等於File選單中的Close項<br />40.Ctrl+Backspace 後退刪除一個詞,直到遇到一個分割符<br />41.Ctrl+游標轉輪 加速滾屏<br />42.Ctrl+O+U 切換選擇塊的大小寫(注意鬆開O後再按U,Ctrl保持按下)<br />43.Ctrl+K+O 切換選擇塊為小寫(注意鬆開K後再按O,Ctrl保持按下)<br />44.Ctrl+K+N 切換選擇塊為大寫(注意鬆開K後再按N,Ctrl保持按下)<br />45.Ctrl+Shift+G 插入GUID<br />46.Ctrl+Shift+T 在游標行加入To-Do註釋<br />47.Ctrl+Shift+Y 刪除游標之後至本行末尾之間的文本<br />48.CTRL+SHIFT+C 編寫申明或者補上函數，絕好!!!<br />49.CTRL+SHIFT+E 顯示EXPLORER<br />50.Ctrl+Tab 在Inspector中切換Properties頁和Events頁<br />51.CTRL+SHIFT+U 程式碼整塊左移2個空格位置<br />52.CTRL+SHIFT+I 程式碼整塊右移2個空格位置<br />53.CTRL+SHIFT+↑ 在過程、函數、事件內部, 可跳躍到相應的過程、函數、事<br />件的定義（在interface和implementation之間來回切換）<br />54.CTRL+SHIFT+↓ 在過程、函數、事件的定義處， 可跳躍到具體過程、函數、事件內部(同上)<br />55.Tab 在object inspector視窗按tab鍵將游標移動到屬性名區，然後鍵入屬性名的開頭<br />字母可快速定位到該屬性<br />56.Ctrl+Alt 按著Ctrl+Alt之後，可用游標選擇一個矩形塊中的程式碼，<br />並可比它進行複製，貼上<br />57.Shift+↓、↑、→、← 以1像素單位更改所選元件大小<br />58.Ctrl+↓、↑、→、←以1像素單位更改所選元件位置<br />59.Ctrl+E 快速選擇（呵呵，試試吧，很好玩的） <br />---------GExperts中---------<br />60.Ctrl+Alt+c 註釋塊<br />61.Ctrl+Alt+u 取消註釋塊<br />62.Ctrl+Alt+h 生成頭(更詳細的設置在GExperts配置的Editor Experts屬性頁)<br />63.Ctrl+Alt+o 選擇對應分隔符之間的語句<br />64.Ctrl+Alt+v 在對應的分隔符之間來回跳轉(與已有快捷鍵有衝突，請更改)<br /></span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
		</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/98312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-02-06 14:58 <a href="http://www.blogjava.net/liaojiyong/archive/2007/02/06/98312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Delphi 编程技巧常见实例问答</title><link>http://www.blogjava.net/liaojiyong/archive/2007/01/17/94455.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 17 Jan 2007 08:27:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/01/17/94455.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/94455.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/01/17/94455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/94455.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/94455.html</trackback:ping><description><![CDATA[
		<p>1. delphi怎样调用外部EXE文件？ </p>
		<p>　　uses WinProcs; <br />　　. <br />　　begin <br />　　WinExec(……); <br />　　. <br />　　end. <br />　　<br />　　和调用Pascal库函数没什么两样。 </p>
		<p>　　2. Delphi hint的字体和色彩如何改变 <br />　　<br />　　Delphi中Tapplication的属性有HintColor及HintPause。可以通过设置HintColor改变应用程序中的Hint的颜色、通过设置HintPause改变触发Hint的时间。但遗憾的是：Delphi中Hint的字体不可以改变。 </p>
		<p>　　3. Delphi里如何计算日期 <br />　　<br />　　算时间在delphi中是最容易的，如下： </p>
		<p>　　var ss : TDateTime </p>
		<p>　　其实Tdatetime是一个双精度的浮点数，它的小数点前表示天数：如， ss := ss + 20 表示从ss开始向后20天，如果 ss = 234.567 它就表示 234.567天,当然是从公元0年开始计算的！ </p>
		<p>　　4. 如何用Delphi编ScreenSaver? (null) <br />　　<br />　　屏幕保护程序无非是扩展名换成了.SCR的可执行程序，它接受两种命令行参数： <br />　　s 运行命令参数 <br />　　c 配置命令参数 <br />　　Windows通过向程序发-s命令行参数来启动程序。要注意的是：程序的窗口是无边框和标题；窗口大小应与屏幕大小一样；还要注意窗口的事件的处理。 </p>
		<p>　　5. Delphi 中如何改目录的名字 <br />　　<br />　　调用RenameFile函数，如: <br />　　RenameFile(’c:wang emp’, ’c:wang mp’); </p>
		<p>　　6. DELPHI显示JPEG图像文件 </p>
		<p>　　只要 uses中加入 JPEG就行，JPEG单元里是有一个TJPEGImage类,可定义一变量如Jpeg,用LoadFromFile调入某个JPEG文件, 然后用Form的Canvas.Draw(x,y,Jpeg)即可显示. </p>
		<p>　　7. Delphi中对Jpeg格式文件的处理… </p>
		<p>　　(1).在 Uses 中加入 JPEG 单元; </p>
		<p>　　(2).定义一个全程变量,例如 var AJPEG : TJPEGImage; </p>
		<p>　　(3).在 Form 的 OnCreate 事件中加入 : </p>
		<p>　　Canvas.Pen.Color:=clBlack; <br />　　Canvas.Pen.Style:=psSolid; <br />　　Canvas.Brush.color:=clBtnFace; <br />　　Canvas.Brush.Style:=bsSolid; //此上是设置 Canvas 的一些属性,便于以后 <br />　　//Clear Form and Load a new JPEG file; <br />　　Ajpeg:=TJpegImage.Create;//动态生成Ajpeg; <br />　　Ajpeg.LoadFromFile(’D:Temp.jpg’) //生成 Ajpeg 后,调入 JPEG 文件</p>
		<p>　　(4).在 Form 的 OnPain 事件中加入Canvas.Rectangle(2,2,560,430); //画一个黑框的矩形将图片围住; <br />　　<br />　　x:=10; y:=10; <br />　　Form1.Canvas.Draw(x,y,Ajpeg); //以(x,y)为左上角输出 JPEG 文件; <br />　　//实际上其作用是当图形被破坏是使图形恢复; </p>
		<p>　　(5).在’Load’或’Browse’按钮的 onClick 事件中加入: </p>
		<p>　　begin <br />　　if OpenPictureDialog1.Execute then <br />　　begin <br />　　Ajpeg.Free; //释放旧Ajpeg; <br />　　Ajpeg:=TJpegImage.Create; //产生一个新的Ajpeg; <br />　　Ajpeg.LoadFromFile(OpenPictureDialog1.Filename); //载入JPEG文件; <br />　　end; <br />　　Canvas.Rectangle(2,2,560,430); //将Form Clear; <br />　　x:=10; <br />　　y:=10; <br />　　Form1.Canvas.Draw(x,y,Ajpeg); //显示新的Ajpeg; <br />　　end;</p>
		<p>　　8. DELPHI3启动画面 </p>
		<p>　　in your *.dbr files do it <br />　　begin <br />　　{Create a splash form} <br />　　splash:=Tsplash.Create(self); <br />　　splash.Show; <br />　　splash.update <br />　　Application.Initialize; <br />　　Application.CreateForm(..) <br />　　. <br />　　. <br />　　. <br />　　splash.close; <br />　　splash.free; <br />　　Application.Run <br />　　end;<br /></p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/94455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-01-17 16:27 <a href="http://www.blogjava.net/liaojiyong/archive/2007/01/17/94455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Delphi中使代码简洁的 5 条忠告(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2006/12/22/89539.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 22 Dec 2006 07:19:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2006/12/22/89539.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/89539.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2006/12/22/89539.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/89539.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/89539.html</trackback:ping><description><![CDATA[
		<p>写代码是一种艺术。使用Delphi，任何人都可以轻而易举地开发出某种软件、完成某些任务。而完美的代码则只有真正的高手才能写出。除了正确的缩进、大小写、命名规则之外，请时刻牢记爱因斯坦的名言--简单就是美。下面将谈及的五个代码问题，可能是初学者、甚至一些老鸟都会犯的错误。</p>
		<p>
				<br />忠告一</p>
		<p>布尔型变量的赋值操作应该是直接的。例如，在一个if/then/else语句中，if子句将布尔型变量赋值为True，而else子句将其赋为False。下面这段代码的写法是不好的：</p>
		<p>if If_Love_Delphi then<br />  Result:=True<br />else<br />  Result:=False;</p>
		<p>而这样写就比较好：</p>
		<p>Result:= If_Love_Delphi;</p>
		<p>
				<br />忠告二</p>
		<p>避免使用嵌套的if/then/if语句，而用and来代替。下面这段代码太罗嗦：</p>
		<p>if If_Love_Delphi then<br />  if If_Love_Linux then<br />TryKylix(Now);</p>
		<p>应该这样写：</p>
		<p>if If_Love_Delphi and If_Love_Linux then<br />  TryKylix(Now);</p>
		<p>不用担心后面的判断语句会超前执行。Project|Options|Compiler|Syntax Options|Complete Boolean eval选项通常是关闭的（除非你选定这个项），这保证了执行顺序不会颠倒。</p>
		<p>综合前两个忠告，假如你有一段这样的代码：</p>
		<p>if If_Love_Delphi then<br />  if If_Love_Linux then<br />Result:=True;</p>
		<p>就可以把它改成：</p>
		<p>Result:= If_Love_Delphi and If_Love_Linux；</p>
		<p>简单而言，假如结果取决于一个条件判断，那么，Result:=True或者Result:=False这样的语句就是多此一举。在初始化布尔型变量的时候，可以给它们赋值。不过根本用不着把一个布尔型变量初始化为False--Delphi在创建这个变量的时候就已经把它赋职位False了。相似的情况还有：</p>
		<p>对象的布尔型属性(Boolean)，自动被初始化为False (0)；<br />整型变量(Integer)，自动被初始化为 0；<br />字符串(String)，自动被初始化为空字符串。</p>
		<p>
				<br />忠告三</p>
		<p>判断布尔型变量的值时，无需用"=True"或者"=False"这样的语句。下面的写法不好：</p>
		<p>if (If_Love_Delphi=True) and<br />  (If_Love_Linux=False) then<br />    DoNotTryLinux;</p>
		<p>对于函数的返回值或者一个属性是布尔型的情况，应该这样写：</p>
		<p>if If_Love_Delphi and<br />  not If_Love_Linux then<br />DoNotTryLinux;</p>
		<p>
				<br />忠告四</p>
		<p>尽量不要用"+"操作符进行字符串合并。这样做效率太低了。下面的例子不好：</p>
		<p>ShowMessage('在下身高'+IntToStr(iHeight)+'米，体重'+IntToStr(iWeight)+'公斤。');</p>
		<p>这样写会较好：</p>
		<p>ShowMessage(Format('在下身高%d，体重%d。', [iHeight,iWeight]));</p>
		<p>
				<br />忠告五</p>
		<p>尽量多用with语句。它不仅效率高，而且使代码更加易读。比如，这段代码：</p>
		<p>if Sender if TEdit then<br />  if (TEdit(Sender).Text=') or<br />(TEdit(Sender).Text[TEdit(Sender).SelStart]=') or<br />  (TEdit(Sender).SelLength=<br />Length(TEdit(Sender).Text)) <br />and (Key in ['a'..'z']) then<br />Key:=UpperCase(Key);</p>
		<p>就不如这样的代码来得简洁易读：</p>
		<p>if Sender is TEdit then<br />  with Sender as TEdit do<br />if (Text=') or<br />   (Text[SelStart]=') or<br />   (SelLength=Length(Text)) and<br />   (Key in ['a'..'z'] then<br />  Key:=UpCase(Key);<br /></p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p>(*//<br />标题:Delphi中建议使用的语句<br />整理:Zswang<br />连接:http://www.csdn.net/Expert/TopicView1.asp?id=724036<br />日期:2002-06-22<br />支持:wjhu111#21cn.com<br />//*)</p>
		<p>{ No.1 判断逻辑类型 }<br />var B: Boolean;<br />begin<br />  B := Boolean(2); //这样只是为了调试//B := True;<br />  if B = True then ShowMessage('B = True'); //不建议//不安全<br />  ///////<br />  if B then ShowMessage('B'); //建议//简短<br />end;</p>
		<p>var B: Boolean;<br />begin<br />  if Edit1.Text = '是' then //不建议//烦琐<br />    B := True<br />  else B := False;<br />  ///////<br />  B := Edit1.Text = '是'; //建议//简短<br />end;</p>
		<p>{ No.2 临时SQL查询 }<br />begin<br />  QueryTemp.Close;<br />  QueryTemp.SQL.Text := 'SELECT SUM(金额) AS 合计 FROM 销售表';<br />  QueryTemp.Open; //不建议//数据没有关闭造成资源浪费<br />  ShowMessage(Query1.FieldByName('合计').AsString);<br />  /////<br />  QueryTemp.SQL.Text := 'SELECT SUM(金额) AS 合计 FROM 销售表';<br />  QueryTemp.Open;<br />  ShowMessage(Query1.FieldByName('合计').AsString);<br />  QueryTemp.Close; //建议用//使用完就关闭<br />end;</p>
		<p>{ No.3 获取记录数 }<br />var<br />  vRecordCount: Integer;<br />begin<br />  Query1.SQL.Text := 'SELECT * FROM Table1'; //不建议//严重浪费资源，会取得很多不必要得信息<br />  Query1.Open;<br />  vRecordCount := Query1.RecordCount;<br />  Query1.Close;<br />  /////<br />  Query1.SQL.Text := 'SELECT COUNT(*) AS 记录数 FROM Table1'; //建议//快速有效、只处理一条记录<br />  Query1.Open;<br />  vRecordCount := Query1.FieldByName('记录数').AsInteger;<br />  Query1.Close;</p>
		<p>  ShowMessage(IntToStr(vRecordCount));<br />end;</p>
		<p>{ No.4 字段赋值 }<br />begin<br />  Table1.Edit;<br />  Table1.FieldByName('姓名').AsString := Edit1.Text; //不建议<br />  Table1.FieldByName('日期').AsDateTime := Date;<br />  /////<br />  Table1['姓名'] := Edit1.Text; //建议//简短、扩充性好<br />  //Table1.Fieldvalues['姓名'] := Edit1.Text; //Borland建议的方法。以及ParamValues[]<br />  Table1['日期'] := Date;<br />end;</p>
		<p>{ No.5 使用Self指针 }<br />begin<br />  Edit1.Parent := Form1; //不建议//Form1只是一个变量//如果没有分配资源怎么办？<br />  ///////<br />  Edit1.Parent := Self; //建议<br />end;</p>
		<p>{ No.6 遍历数据集 }<br />var<br />  I: Integer;<br />begin<br />  Query1.First;<br />  for I := 0 to Query1.RecordCount - 1 do begin //不建议//容易被影响<br />    Query1.Next;<br />    { };<br />  end;<br />  /////<br />  Query1.First;<br />  while not Query1.Eof do begin //建议<br />    { };<br />    Query1.Next;<br />  end;<br />end;</p>
		<p>{ No.7 利用Sender参数，使代码通用 }<br />procedure TForm1.Edit1Change(Sender: TObject);<br />begin<br />  if Edit1.Text = '' then //不建议<br />  Edit1.Color := clRed;<br />  ///////<br />  if TEdit(Sender).Text = '' then //建议//复制到EditXChange中很方便<br />  TEdit(Sender).Color := clRed;<br />end;</p>
		<p>{ No.8 使用默认转换函数 }<br />var<br />  I: Integer;<br />begin<br />  I := StrToInt(Edit1.Text); //不建议<br />  ///////<br />  I := StrToIntDef(Edit1.Text, 0);//建议//参考StrToFloatDef,StrToDateDef....不过这些只有Delphi6才有<br />end;</p>
		<p>{ No.9 遍历数组 }<br />var<br />  I: Integer;<br />  A: array[0..9] of Integer;<br />begin<br />  for I := 0 to 9 do //不建议<br />  A[I] := I;<br />  ///////<br />  for I := Low(A) to High(A) do //建议//扩充性好<br />  A[I] := I;<br />end;</p>
		<p>{ No.10 利用MaxInt常量 }<br />begin<br />  Caption := Copy(Edit1.Text, 3, Length(Edit1.Text) - 3 + 1); //不建议<br />  ///////<br />  Caption := Copy(Edit1.Text, 3, MaxInt); //建议//嘻嘻，少计算一次<br />end;</p>
		<p>{ No.11 Result函数指针 }<br />function FuncName: Boolean;<br />begin<br />  FuncName := True; //不建议//并且放在赋值号右边不能当普通变量<br />  ///////<br />  Result := True; //建议//扩充性好<br />end;</p>
		<p>function FuncSum(A: array of Integer): Integer;<br />var I: Integer;<br />begin<br />  Result := 0;<br />  for I := Low(A) to High(A) do<br />    Result := Result + A[I]; //可不能用 FuncSum := FuncSum + A[I];<br />end;</p>
		<p>{ No.12 必须执行的代码、使用try ... finally ... end语句 }<br />var<br />  vStringList: TStringList;<br />begin<br />  vStringList := TStringList.Create;<br />  vStringList.LoadFromFile('c:\temp.txt');<br />  ShowMessage(vStringList.Text);<br />  vStringList.Free; //不建议//如果出现异常资源将无法释放<br />  ///////<br />  vStringList := TStringList.Create;<br />  try<br />    vStringList.LoadFromFile('c:\temp.txt');<br />    ShowMessage(vStringList.Text);<br />  finally //建议//即使出现Exit都会执行<br />    vStringList.Free;<br />  end;<br />end;</p>
		<p>//其他情况1<br />begin<br />  Screen.Cursor := crHourGlass;<br />  try<br />  { 耗时操作 }<br />  finally<br />  Screen.Cursor := crDefault;<br />  end;<br />end;<br />//其他情况2<br />begin<br />  Query1.DisableControls;<br />  try<br />  { 操作数据集 }<br />  finally<br />    Query1.EnableControls;<br />  end;<br />end;<br /><br /><br /><br /><br />&gt;&gt;对象的布尔型属性(Boolean)，自动被初始化为False (0)；<br />&gt;&gt;整型变量(Integer)，自动被初始化为 0；<br />&gt;&gt;字符串(String)，自动被初始化为空字符串。</p>
		<p>这个不一定</p>
		<p>局部变量最好初始化一下,不然会产生莫名错误.<br />特别是: Integer, string, Pointer<br />偶的经验<br />Table1['姓名'] := Edit1.Text;   这个可以  但要是：<br />Edit1.Text := Table1['姓名']   //这个绝对不行，因为这时候要是NULL就会报错 这时候要FieldByName<br /><br />己找到答案了，AnsiString也可以在Format和sprintf里用"%s"里指代.</p>
		<p>俺想少数两三个AnsiString还是可以用"+"来连接，而更多的AnsiString应该用sprintf或Format。</p>
		<p>比较一下</p>
		<p>strMsg ="姓名: " + name + "年龄: " + IntToStr(age) + "号码: " + IntToStr(num) + "工资: " + IntToStr(salary);</p>
		<p>和</p>
		<p>strMsg.sprintf("姓名: %s年龄: %d号码: %d工资: %d",name,age,num,salary);</p>
		<p>后者可读性比前者要略好，生成的机器码只有1/3, 更重要的是可以把sprintf里的格式字符串提出来集中维护，而前者用"+"导致的大量零碎字符串就不好处理。</p>
		<p>后者唯一缺点是当有大量参数时，需要花一点工夫将格式字符串和相应的参数对齐。<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />忠告1: 如果要用到with的地方,请想想能不能重构,将其作为一个函数使用<br />忠告2: 对于数据集的CLOSE请使用<br />       try<br />         DataSet.Open;<br />       finally<br />         DataSet.Close;<br />       end;<br />忠告3: 使用Sender时,请先判断一下是不是nil, 是不是非你要的那个类型<br />忠告4: FieldValue对null的处理实在是差,请还是使用FieldByName().AsXXXXX这个<br />忠告5: 如果你要写一个长长的判断,还是写成一个函数吧,不要写进一个if then中,那样,几天后,你就将看不懂了<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />1、关于WITH，我个人基本不喜欢用，因为他带来的是可读性非常差。一个参数类，几个属性的时候，用的还好，而且项目组人同要比较熟练这个类！如果二个以上的参数类，天知道怎么读这一小段的WITH代码。<br />2、关于字符串，用+和Format这两个我一般是看情况的。有些字符串边境用Format就很不好使，比如对一些SQL语句的拼写，多个SQL用+连接代码易读性高。而且这个效率还算好！然而一些楼主都提及的字符串，当然用Format要好，同样易读性好，我觉得在使用到字符（串）操作的时候可读性是主要的，如果跟效率搭上边了，长字符串处理，我觉得已经是设计问题了。<br />3、关于FOR和WHILE的比较，数据集的遍历当然用WHILE。RecordCount除非你不用数据集过渡，如果用了，这个系统大了，维护死你，不可预见性太高了。这不是效率问题，是你写出来的软件能不能用的问题。<br />4、关于FieldByName。这个嘛提下，我一直都是用它的。除非特殊性情会用Fields[]。要不然，别人的软件交给你维护的时候，你就等着哭吧，查字段你就得花上所有的加班时间。。</p>
		<p>可能我说的没道理，大家就指出来，如果能证明就更好了，这样我又学到东西了。。<br /><br /><br /></p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/89539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2006-12-22 15:19 <a href="http://www.blogjava.net/liaojiyong/archive/2006/12/22/89539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>delphi函數學習</title><link>http://www.blogjava.net/liaojiyong/archive/2006/09/14/69589.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 14 Sep 2006 03:21:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2006/09/14/69589.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/69589.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2006/09/14/69589.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/69589.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/69589.html</trackback:ping><description><![CDATA[1.<br />function Assigned(var P): Boolean;判斷過程或指針是否存在<br />Description<br />  Use Assigned to determine whether the pointer or procedure referenced by P is nil. P must be a variable reference of a pointer or procedural type. Assigned(P) corresponds to the test P&lt;&gt; nil for a pointer variable, and @P &lt;&gt; nil for a procedural variable.<br />  Assigned returns False if P is nil, True otherwise.<img src ="http://www.blogjava.net/liaojiyong/aggbug/69589.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2006-09-14 11:21 <a href="http://www.blogjava.net/liaojiyong/archive/2006/09/14/69589.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Delphi初学者应小心的六大陷阱（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2006/08/30/66582.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 30 Aug 2006 02:09:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2006/08/30/66582.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/66582.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2006/08/30/66582.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/66582.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/66582.html</trackback:ping><description><![CDATA[初学DelphiI的人，由于各种原因，对DelphiI中的许多概念不能很好的理解，并由此带来了许多的问题，或者是开发出的程序稳性不好，一会能运行，一会又不能运行；或者是遇到一个问题久思不得其解，还误以为是DelphiI自身的BUG，等等这些，浪费了我们大量的时间、精力，也影响了我们的开发效率。<br />　　<br />　　那么如何才能避免这些错误了，尽量少走弯路了？笔者从事DelphiI开发多年，下面就把我的经验总结介绍给大家，希望帮助到初学DelphiI的朋友。<br />　　<br />　　问题一：对类的概念理解不到位，程序开发中不能灵活运用。请看下面的程序：<br />　　<br />　　unit Unit1; <br />　　interface<br />　　<br />　　uses<br />　　Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br />　　Dialogs, StdCtrls, shellApi;<br />　　<br />　　type<br />　　TForm1 = class(TForm)<br />　　Button1: TButton;<br />　　private<br />　　{ Private declarations }<br />　　public<br />　　{ Public declarations }<br />　　end;<br />　　<br />　　var<br />　　Form1: TForm1;<br />　　implementation<br />　　<br />　　uses CommonUni;<br />　　<br />　　<br />　　在DelphiI中新建一个程序，然后添加一个按钮，就得到了下面这段程序。这应该是大家相当熟悉的一段程序，可也就是这段程序，让许多的人在做开发很长时间后，还不能很好理解。 该程序可分为三个个部分：第一部分，单元头（从起始位置到TYPE之前）；第二部分（从TYPE到END的部分），定义了一个从Tform继承过来的窗体类，它包含一个Tbuttton类型的成员。最后一部分（Var到结束的部分），定义了一个Tform1类型的变量。问题就出在这里了，许多人误以为这最后一段也是窗体类的一部分，在该窗体类中经常写出这样的代码，Form1.caption = ’窗体标题’，导致程序运行时得不到所要的结果。其实最后一部分根本就属于窗体类的定义，它们不过是在同一个UNIT中而已，所以代码应该这样写：self.caption = ’窗体标题’；<br />　　<br />　　问题二：将释放对象的代码写在窗体的CLOSE事件中，导致Access Violation…的错误。<br />　　<br />　　一个窗体的关闭（CLOSE）与窗体的析构（Destory），在系统处理上是有区别的，当一个窗体关闭时，窗体实际上只是隐藏起来了，它占用的资源并未从内存中释放了，我们还是可访问到窗体中的数据；而当窗体响应DESTORY事件时，窗体不仅仅是隐藏起来了，而且占用的系统资源也释放出来了。因此，如果一个窗体关闭后，我们还想访里面的对象，就应该将这些对象的FREE代码写的窗体的（DESTORY）事件中。<br />　　<br />　　问题三：不加区别地使用String与shortString数据类型。<br />　　<br />　　String类型与shortString类型是有区别的，在默认的情况下（取决于$H开关），如果你将一个变量定义为string类型，那么会被处理成一个ANSIString类型。这种类型是动态分配内存的，以NULL为结尾，最大长度为4G，而shortString的最大长度是不能超过255个字符的。由于ANSIstring是生存期自管理类型的数据，这意昧着这种类型的数据需要更多的系统开销，所以在程序开发中，shortString能满足要求的话，就尽量使用它，以提高程序的运行速度。<br />　　<br />　　问题四：进行数据类型转换时处理不当，犯错误最多的就是字符型到数字/浮点型的转换。<br />　　<br />　　当将一个字符型数据转换为整型时，我们经常这样写 I := StrToInt(aEdit.Text); 表面上看这一句，没有任何问题，函数的使用，格式的写法，都是正确的。可有一种情况我们却没有考虑到，如果用户在aEdit文本框中输入的不是数字文本的话，会怎么样呢？调用还会成功吗？显然是不会的，系统肯定会弹出一个英文的错误，让我们的用户不知所措的。正确的写法是：I := StrToIntDef(aEdit.Text, 0); 这样当转换不成功时，第二个参数就会赋给I。类似的函数还有strToInt64Def，StrToFloatDef等等。<br />　　<br />　　问题五：单元引用的问题。使用那个函数，就一定要引用函数所在的单元。<br />　　<br />　　比如在程序开发中我们要用到一个API函数ExtractIconEx（从程序或是文件中获得一个图标），那么就一要在它的USES中把单元shellApi加入进来，否则是不能通过编译了。类似的情况还有很多，我们常常使用帮助文档，从中查找需要的函数，可当程序编译时，却通不过，为什么呢？就是因为没有在USES中引用函数所在的单元。这个问题初学者犯得最多，应该加倍注意。<br />　　<br />　　问题六：避免循环引用，尽可能通过第三个单元实现。如果确实不可避免，应在不同位置进行引用。所谓循环引用就是A单元引用了B单元，而反过来，B单元又引用了A单元，产生循环。我们还看上面的那一段程序，在interface的下面有一个USES语句，而在implementation的下面，又有一个USES语句。循环如果确实不可避免，那么就应该在将A单元中的引用写在第一个USES语句中，而将B单元中的引用写在第二个USES语句中。<br /><img src ="http://www.blogjava.net/liaojiyong/aggbug/66582.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2006-08-30 10:09 <a href="http://www.blogjava.net/liaojiyong/archive/2006/08/30/66582.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Delphi 5.0 快捷键</title><link>http://www.blogjava.net/liaojiyong/archive/2006/08/21/64852.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 21 Aug 2006 10:04:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2006/08/21/64852.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/64852.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2006/08/21/64852.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/64852.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/64852.html</trackback:ping><description><![CDATA[
		<p>下面的快捷键大部分在Delphi 5.0的菜单中找不到，其中有一些还是非常有用的。</p>
		<p> Ctrl+PageUp      将光标移至本屏的第一行，屏幕不滚动。<br /> Ctrl+PageDown    将光标移至本屏的最后一行，屏幕不滚动。<br /> Ctrl+↓          向下滚动屏幕，光标跟随滚动不出本屏。<br /> Ctrl+↑          向上滚动屏幕，光标跟随滚动不出本屏。<br /> Ctrl+Shift+NUM   在光标行设置最多九个临时标志号，对临时切换非常有用。<br />    行的左边将出现一本书，封面有NUM，再按一次取消设置。  <br /> Ctrl+NUM         直接将光标跳到NUM处，NUM是用Ctrl+Shift+NUM设置的标号。<br />    NUM不能用小键盘。<br /> Ctrl+Home        将光标移至文件头。<br /> Ctrl+End         将光标移至文件尾。<br /> Ctrl+B           Buffer List窗口。<br /> Ctrl+I           同Tab键。<br /> Ctrl+M           同Enter键。<br /> Ctrl+N           同Enter键，但光标位置保持不变。<br /> Ctrl+T           删除光标右边的一个单词。<br /> Ctrl+Y           删除光标所在行。</p>
		<p> Ctrl+Shift+↑    光标在函数体内时，将光标快速移至当前函数声明处。<br /> Ctrl+Shift+↓    光标在函数声明行时，将光标快速移至函数定义处。<br /> Ctrl+Shift+C     声明一个过程或函数后，直接生成过程或函数的名称、begin、end;<br /> Ctrl+Shift+E     光标在Edit窗口和Explorer窗口间切换。<br /> Ctrl+Shift+G     插入GUID。<br /> Ctrl+Shift+J     弹出Delphi语句提示窗口，选择所需语句将自动完成一条语句。<br /> Ctrl+Shift+T     在光标行加入To-Do注释。<br /> Ctrl+Shift+Y     删除光标之后至本行末尾之间的文本。</p>
		<p> Ctrl+F3          Call Stack窗口。<br /> Ctrl+F4          等于File菜单中的Close项。</p>
		<p> Ctrl+鼠标转轮    加速滚屏。</p>
		<p> Shift+F8         调试时弹出CPU窗口。<br /> Shift+F10        等于鼠标右键（Windows快捷键）。</p>
		<p> Alt+F4           关闭所有编辑框中打开的源程序文件，但不关闭项目。<br /></p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/64852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2006-08-21 18:04 <a href="http://www.blogjava.net/liaojiyong/archive/2006/08/21/64852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>delphi学习笔记</title><link>http://www.blogjava.net/liaojiyong/archive/2006/08/21/64711.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 21 Aug 2006 01:38:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2006/08/21/64711.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/64711.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2006/08/21/64711.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/64711.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/64711.html</trackback:ping><description><![CDATA[
		<p>1、指针：@放在变量前面将获取变量的地址，并可以把地址赋值为同样数据类型得指针。把^放在一个数据类型的前面可以定义一个指针，把^放在一个指针后面，可以获得该指针指向地址空间的类容。<br />不可以将指针所指地址中的类容直接赋值给其他类型的变量。<br />2、变体类型(variant)：Variant 能支持所有的简单数据类型及OLE自动化对象。注意Variant不能表达Object Pascal对象。<br />3、强制类型转换：只有当两个变量的数据长度一样时，才能对变量进行强制转换。例如：不能把一个Double类型转换成Integer。<br /><br />运算符(Operators)：<br />   1、赋值运算符：Number:=5<br />   2、比较运算符：<br />   3、逻辑运算符：<br />   4、算术运算符：<br />   5、位运算符：<br />   6、加减运算符：<br />   7、指针运算符：<br />   8、基和运算符：<br />   9、类运算符：<br />   10、@运算符：<br />   <br />        一般来讲，在过程和函数中，任何类型说明都在变量说明之前，而任何变量说明都在常量之前。但是，只要遵从说明必须在过程与函数的标题之后，而且在程序代码之前，即是有效的。<br /><br />不管一个库单元是否和一个窗体有关，库单元的结构都是相同的。其结构如下：　</p>
		<p>unit &lt;<font lang="ZH-CN" face="宋体">库单元名称</font>&gt;　</p>
		<p>interface　</p>
		<p>uses &lt;<font lang="ZH-CN" face="宋体">选择性的库单元列表</font>&gt;</p>
		<p>{<font lang="ZH-CN" face="宋体">公有说明}　</font></p>
		<p>implementation　</p>
		<p>uses &lt;<font lang="ZH-CN" face="宋体">选择性的库单元列表</font>&gt;</p>
		<p>{<font lang="ZH-CN" face="宋体">私有说明}</font></p>
		<p>{<font lang="ZH-CN" face="宋体">过程和函数的执行部分}</font></p>
		<p>    initialization {<font lang="ZH-CN" face="宋体">选择性的}</font></p>
		<p>{<font lang="ZH-CN" face="宋体">选择性的初始化程序}</font></p>
		<p>end.</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/64711.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2006-08-21 09:38 <a href="http://www.blogjava.net/liaojiyong/archive/2006/08/21/64711.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DELPHI基础教程</title><link>http://www.blogjava.net/liaojiyong/archive/2006/08/18/64409.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 18 Aug 2006 09:31:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2006/08/18/64409.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/64409.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2006/08/18/64409.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/64409.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/64409.html</trackback:ping><description><![CDATA[
		<a href="http://www.cnread.net/cnread1/dnwl/cxsj/delphi/jcjc/index.html">http://www.cnread.net/cnread1/dnwl/cxsj/delphi/jcjc/index.html</a>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/64409.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2006-08-18 17:31 <a href="http://www.blogjava.net/liaojiyong/archive/2006/08/18/64409.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>