《Mastering Delphi6》學習筆記之三 (轉)

worldblog發表於2007-12-09
《Mastering Delphi6》學習筆記之三 (轉)[@more@] 

程式碼編輯器/窗體設計器/ Inspector中的一些

在程式碼編輯器中按Ctrl+E可以 啟用Increment Search。這樣就避免了從選單中選擇Search->Find,再輸入文字的繁瑣步驟。

選中一或者幾行文字,然後按Ctrl+Shift+I,可以增加這幾行的縮排量;Ctrl+Shift+U減少縮排。縮排的距離取決於Editor Options裡面的Auto Indent設定。

選中一些文字,按Ctrl+O+U(保持Ctrl按下,先按O,再按U),將改變選中文字的大小寫。Ctrl+K+E將選中文字全部變成小寫;Ctrl+K+F變成全部大寫。

 :namespace prefix = o ns = "urn:schemas--com::office" />

在FoDesigner中工作的時候,選中某個構件,按下Ctrl和方向鍵拖動它將能夠微調它的位置,而不用對齊到網格(Snap to Grid只對滑鼠操作有效。)不過,如果Shift和Ctrl一起按下,則按方向鍵的時候構件移動會自動對齊到網格。

 

Object Inspector中的一個重要改進是Object Inspector支援Component reference的In-place expanding。例如,Label的Focuntrol會以褐色標記,表示它是指向另一個構件的特殊屬性。將FocusControl設為某個構件,在FocusControl前面會出現小的+號,允許你直接編輯這個構件的屬性,而不需要選中它。

另外,在FocusControl的屬性值上按住Ctrl鍵雙擊,將會跳轉到FocusControl指向的構件(例如Edit1)。

 

Ctrl+O+O將在單元前面新增所有的設定。

 

關於中的條件編譯

 

Delphi支援類似於C++中條件編譯的概念。其方法也很簡單。不過,因為使用頻率相對較少的緣故,有些人對它還是不太熟悉,而且Delphi和C++在條件編譯的語法上也有一點小的差別,所以有必要簡單提一下。

 

最簡單的形式類似這樣:

{$IFDEF DE}

  ShowMessage(‘Display a Debug Message!’);

{$ENDIF}

 

在Delphi 6中,支援IFDEF的一個增強的形式:IF。IF不僅可以測試符號定義,而且允許測試常量(包括常量,如SizeOf,Pred,Succ等),而且能夠測試組合條件。下面是一個例子:

const

  DebugControl = 3;

{IF Defined(DEBUG) and (DebugControl>=3)}

  ShowMessage( ‘High Debug Level!’);

{$IFEND}

熟悉C++的朋友應該注意,測試結束部分有兩種形式,分別是ENDIF和IFEND,它們分別用於對應IFDEF(也包括IFNDEF)和IF,不可以混用,否則將得到一個出錯資訊,這是Object Pascal和C++的一個不同點。

 

更復雜一些的形式如下:

{$IFDEF ...}

  ...

{$ELSEIF ...}

  ...

{$ELSE}

  ...

{$IFEND}

 

條件編譯在Delphi 6中變得相對比較重要,因為Delphi 6分別支援VCL和CLX這兩個不同的庫。因而在VCL中和其他一些地方,你能夠看到類似這樣的語句:

{$IF Defined(CLX)}

  ...

{$IFEND}

 

Delphi中預定義了一些條件編譯符號。下面列出其中比較重要的一些:

1.VER140

這個定義暗示Delphi 6.0在Borland Pascal產品家族中的真正版本號是14.0。在Delphi 5中則定義了VER130。應用如下:

{$IFDEF VER140}

  ShowMessage('Is Delphi 6!')

{$ENDIF}

{$IFDEF VER130}

  ShowMessage('Is Delphi 5!')

{$ENDIF}

 

2.MS / /

前面兩個定義顯然是為跨平臺而準備的。至於WIN32,你也可以把它當作MSWINDOWS來用;不過,實際上它是為Delphi 1.0/2.0的相容性而保留的,除非你有這兩個版本的應用需要維護,否則一般不應該再使用它。當然了,在將來的64位平臺上,還會出現WIN64的定義;如果你是個很前衛的程式設計師,你甚至可以現在就編寫這樣的程式碼:

{$IFDEF WIN64}

  ...

{$ENDIF}

這樣做也並不是毫無意義的,因為Delphi目前對Int64型別已經提供了不錯的支援。

 

3.CONSOLE

指示這是一個控制檯(Console)應用程式。

 

4.BCB

如果需要在C++Builder中編譯.Pas,某些情況下可能需要它。

 

5.ConditionalExpressions

在Delphi 5和以前版本中不支援$IF。不過,用下面這種方式,不論在Delphi 5還是Delphi 6中都可以毫無問題地透過編譯:

{$IFDEF ConditionalExpressions}

  {$IF Defined(Debug)}

  ShowMessage('Debug!');

  {$IFEND}

{$ENDIF}

 

《Mastering Delphi 6》的作者給了我們兩條忠告:

1.條件編譯很有用,只要使用得當,它能夠為程式提供相當的靈活性。但是,應該只在確實需要用它們的時候才用;否則,很容易讓程式碼變得難於閱讀,並且可能給器造成麻煩。

2.當你改變了某些定義,編譯器並不一定總是能夠正確的區分哪些程式碼需要重新編譯。如果你改變了這些定義後,程式的執行情況變得有點奇怪,那麼請選擇Build All。

 

 

Delphi 6中引入了一個新的指示字(directive):platform。因為Delphi 6支援跨平臺程式設計,但是,當你需要編寫一些特定於平臺的程式碼的時候,最好用platform來宣告。

下面是例子:

var

  WinInteger : integer=3000 platform;

 

procedure Test;platform;

begin

  Beep;

end;

 

type

  WinClass=class

x : integer;

  end platform;

 

其中class宣告中platform出現的位置似乎有點奇怪,沒關係,知道就行了,反正我們一般不太會用得到它(但是真有需要的時候,你也得有所瞭解才行)。如果你一定要尋根究底的話,《Mastering Delphi 6》的作者對此有一個簡要的解釋:

The position of semicolons for hint directives can be quite confusing at first. The rule is that a hint directive must appear before the semicolon following the symbol it modifies. But a proce-dure, function, or unit header declaration can be followed only by reserved s, so its hint directive can appear following the semicolon. A type, variable, or constant declaration can be followed by another ntifier, so the hint directive must come before the semicolon closing its declaration. Part of the rationale behind this is that the hint directives are not reserved words, so they can be used as the name of an identifier.

 

關於deprecated指示字

《Mastering Delphi 6》中關於deprecated的這一段說明似乎有點古怪,文字很淺顯,可是我看了三遍也沒有完全搞清楚到底是在說什麼。先記錄在這裡,以後再看好了。

The deprecated directive works in a similar way to the platform directive;the only real differences are that it is used in a different context and produces a different compiler warning.The role of deprecated is to mark dentifiers that are still part of the system for compatibility reasons,but either are going to be removed in the future or expose you to risks of incompatibility.This symbol is used sparingly in the Delphi library.

 

 

Delphi 6中另外一個相當有用的關鍵字是$MESSAGE。你可以用它來提醒你程式中任何值得注意的地方,比如說下面的例子:

{$MESSAGE ‘這裡尚未完成,記住下次要改完!’}

當然,用To-do List也可以完成類似的工作,而且To-do List在功能上更完善一些;不過,$MESSAGE比 To-do List優越的一個地方是,編譯器每次編譯程式的時候都會提醒你,所以不容易忘記;相對而言,不是每個程式設計師都會去經常察看To-do List。

$MESSAGE也類似於Visual C++中的#pragma message。不過,在Delphi 6的Message視窗雙擊該行資訊,就能夠跳到原始檔中相應定義的地方,而這一點在Visual C++中卻辦不到。

 

 後記:《Mastering Delphi 6》現在才看到第65頁(總共1071頁),也就是說,萬里長征才走完第一步。這本書讀到這個地方還是很好理解的(基本上不用動用金山詞霸),但是後面的內容就要艱深一些了。應該老實承認我的英文水平還是很差,讀原版書滿辛苦的。想起蔡學鏞老師說,他開始讀外文資料的時候必須正襟危坐,手頭必備電子辭典,讀的多了,現在已經很隨意地能夠把外文資料當作小說來看,不論是坐著還是躺著,都不影響閱讀。什麼時候我才能達到這種境界呢?

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990380/,如需轉載,請註明出處,否則將追究法律責任。

相關文章