當前位置:編程學習大全網 - 源碼下載 - 從TurboPascal到Delphi

從TurboPascal到Delphi

 牢騷

 我是在高壹接觸pascal語言 因為參加NOI的需要 順理成章的要使用Turbo Pascal來寫程序了 半年後 我開始想著如何編寫Windows程序 又理所當然的找上Delphi 初見Delphi 除了begin end讓我覺得倍感親切外 Object Pascal裏的增加的面向對象的語法卻讓我很是吃驚 當時的我可根本不懂什麽叫面向過程 面向對象 最可惡的是 國內那些教育家們 除了會拿著清華的那本精簡的不能再精簡的pascal教材照本宣科外 似乎再也沒有什麽實質性的工作了 傳說中的《Turbo Pascal大全》更是無處可尋 所以關於unit interface這些Delphi裏隨處可見的關鍵字我也很不明白 所幸 其後不久 我得到壹本名為《計算機反病毒技術》的書 裏面統統都是用Turbo Pascal編寫的源代碼 通過它我迅速明白了早已存在於Turbo Pascal中unit interface等關鍵字的含義和用法 又以Delphi中的Help文檔為扶手 開始蹣跚學步了

 印象中 國內Delphi作家似乎更偏愛編寫應用實例類的技術書籍 至於語法這種東西 沒有幾個人願意多去涉及 即使書中必須談及 也是寥寥數筆 匆匆帶過 或者幹脆與某本書類似 對Object Pascal語法講解最好 最權威的恐怕就算《Delphi 開發人員指南》了 這本書至今也是備受推崇的 但與如今泛濫的C++書籍相比 Delphi仍然遜色許多 也難怪很多新手特別是從來沒有接觸過pascal語言的新手 在學習Object Pascal時會遇到不少困難 自己的感覺是 在從Turbo Pascal向Delphi過渡的過程中 由於沒有正確的指引 走了很多彎路 由於沒有正確的橋梁 必須要壹步實現大跨越 所以 在這裏 我提出自己曾經遇見的溝壑 路標性給出我自己的認識和總結 希望給入門的同學們壹些幫助 我不打算詳細介紹語法知識 並假設妳已經有壹點pascal語言和面向對象概念的基礎 要想學習相關詳細知識 我推薦各位壹定要閱讀《Delphi開發人員指南》和Delphi Help文檔中的相關章節

 記錄體和類

 習慣了在壹個Program模塊內寫完所有面向過程代碼的我 有幾天的時間壹直未能徹底明白在非Unit模塊中 非繼承的自定義類的框架 語法是如何的 VCL源代碼雖然經典 卻過於繁雜 不能讓我迅速掌握根本 我需要壹個最簡單又最能說明問題 完整的可運行的代碼 苦於無處尋求答案 只好親自動手 探索對應關系 終成其下兩段代碼

 program TP;  {本代碼在Turbo Pascal 下編譯通過}  type  MyRecord = record{ }  end;

 var  MR: MyRecord;  procedure Procedure ;  begin  {Procedure Code}  end;  {=========== main ===========}  begin  {以這個begin為標誌 主程序開始 其作用相當於C/C++中的main函數}  Procedure ;  end

 上面是壹段及其簡單的包含記錄類型聲明和過程聲明的代碼 二者基本規則如下 用戶自定義的數據類型 需要放在以保留字 type 開頭的代碼段中 過程(procedure)和函數(function)要放在以保留字 var 開頭的代碼段中 最後壹個夾在begin和end間的代碼段是主程序的開始 也就是整個程序的入口 作用相當於C/C++裏的main函數 請註意 只有在以program保留字開頭的代碼模塊中 這個begin和end才具有程序入口的作用

 另外 在Turbo Pascal中已經支持原始的面向對象 它的聲明關鍵字是Object 與現在我們常見的Class不同 語法如下   object  Field;  Field;   Method;  Method;  end;

 Method允許以下幾種形式  procedure MethodName(:type);

 或者function MethodName(:type):type;

 或者constructor MethodName(: type [;:type]); [virtual];

 或者destructor MethodName[(: type)];[virtual];

 不錯的 構造函數和析構函數都支持virtual 在構造函數中 還有壹個有用的東西是Fail函數 當構造函數的初始化失敗時 它可以用來釋放已經分配的資源 遺憾的是 Object裏面還沒有區分私有***有 接下來的代碼 是Turbo Pascal的Help文檔中 關於Fail函數的演示代碼 可以讓大家對此有個較深的認識 Turbo Pascal卻是是很強大和優秀的

 type  PBase = ^TBase;  TBase = object(TObject)? {在這裏就已經出現Tobject了 是不是很親切?}  constructor Init(FailMe: Boolean);  end;

 PDerived = ^TDerived;  TDerived = object(TBase)  constructor Init(FailMe: Boolean);  end;

 constructor TBase Init(FailMe: Boolean);  begin  inherited Init;  if FailMe then Fail;  end;  constructor TDerived Init(FailMe: Boolean);  begin  if not inherited Init(FailMe) then {判斷父類的初始化是否成功}  { Ancestor failed to construct we must fail too }  Fail;  { Otherwise proceed with construction }  { }  end;  var  P: PObject;  X: Boolean;  begin  for X := False to True do  begin  P := New(PDerived Init(X));  if P <> nil then  begin  writeln( Object constructed sucessfully );  Dispose(P Done);  end  else  writeln( Object failed to construct );  end;  end 回到Delphi中 再看下面的代碼   program Delphi;  {代碼在Delphi 下編譯通過}  {$APPTYPE CONSOLE}  uses  SysUtils;  type  TMyClass = class(TObject)  public  constructor Create;  procedure PrintClassName;  private  ClassName: string;  end;  var  MyClass: TMyClass;  constructor TMyClass Create;  begin  ClassName := TMyClass ;  end;  procedure TMyClass PrintClassName;  begin  writeln(ClassName);  end;  {=========== main ===========}  begin  MyClass := TMyClass Create;  MyClass PrintClassName;  MyClass Free;  readln;  end

 類作為用戶自定義的壹種數據類型 其聲明的規則 成員函數 過程的實現方法都符合經典 Pascal的基本規則 唯壹不同的是保留字變了 從記錄體變成了類(詳細比較代碼結構和語法規則) 這也說明Object Pascal是在經典Pascal的基礎上進行了面向對象內容的語法擴充 當然 內部的運行機制並沒有表面語法擴充這麽輕松 可那是編譯器的事情 在這裏 我們完全不用理會 差點忘記告訴讀者怎麽調試上面的代碼了 在IDE環境主菜單裏選擇 File | New | Other 在New Item項裏選擇Console Application 這時出現了代碼編輯框 再將上面的代碼貼入 F 完成!  代碼內的{$APPTYPE CONSOLE}是壹個編譯開關 它告訴編譯器 這是控制臺程序 在格式上它與註釋的差別就是那個 $ 符號 TMyClass = class(TObject)可以簡寫為

 TMyClass = class 表示TMyClass類從TObject類繼承而來 TObject是Delpi中所有對象的祖先 這也是為什麽我在代碼中沒有聲明Destroy過程卻仍然能夠使用的原因 Delphi中類的構造很有趣 請註意MyClass := TMyClass Create這壹句 這與C++不同 readln使程序停頓下來 直到用戶按下回車鍵才結束程序退出 更多詳細內容請參考《Delphi開發人員指南》 節

 上面兩段代碼相互對應 雖然很簡單 不過我卻認為他們在某種程度上很容易讓同學發現由經典Pascal向Object Pascal過渡的壹些方法 對Object Pascal的類定義語法有個初步了解 這是很重要的壹步 當初我要是能夠看到這兩段代碼 或許能少浪費很多時間了

 unit模塊

 在Turbo Pascal的Help文檔裏 是這樣說明unit功能的 Units are the basis of modular programming inBorland Pascal You use units to createlibraries and to divide large programs into logically related modules 傳統上 我們都將所有代碼集中在壹個program模塊中 可是面對更加復雜的功能代碼 正確的劃分功能封裝功能對代碼管理和以後的維護有著重要的作用 而使用unit模塊正好解決了這些問題 其語法規則如下

 unit identifier;? { Heading }  interface? { Public symbols }:  uses?{ Uses clause }  const?{ Constants }  type?{ Types }  var?{ Variables }  procedure { Procedures }  function? { Functions }  implementation? { Private symbols }:  uses?{ Uses clause }  label?{ Labels }  const?{ Constants }  type?{ Types }  var{ Variables }  procedure?{ Procedures}  function?{ Functions }  begin?{ Initialization }  statement;?{ Statements }  statement  end

 Interface部分用來聲明對外接口 也就是可以被外部引用該文件的程序使用的函數和過程 implementation部分包含接口部分聲明的各種函數 過程具體實現的代碼 begin壹直到最後的end 之間都是初始化部分 可以為本unit內的各種變量 過程 函數初始化 如果沒有內容需要初始化 那麽begin可以省略 但end 必須存在

 在Delphi下經典Pascal中的unit部分有了變動 請看來源於Delphi Help文檔的說明 unit Unit ;  interface  uses  { List of units goes here }  { Interface section goes here }  implementation  uses? { List of units goes here }  { Implementation section goes here }

 initialization  { Initialization section goes here }  finalization  { Finalization section goes here }  end 可見Initialization部分的關鍵字begin 被Initialization取代了 並且增加了壹個finalization部分 Initialization部分的代碼可以這樣寫 initialization  begin  {do something…}  end;  也可以這樣寫 initialization  {do something…}  finalization部分的功能 有點類似於析構函數 它主要針對本unit模塊中initialization部分初始化的資源進行釋放 並且是在程序結束時運行 如果程序以Halt過程結束了 該部分的程序將不能執行

 Unit模塊中的interface等關鍵字和結構初看似乎有些限制程序員的自由度 但也正是這種語法規定體現出Pascal語言的嚴謹和優美 為減少程序出錯的幾率做出保證 program相當文章的提綱挈領 unit則是文章的各個段落 Delphi裏 program模塊包含在 prj文件中 unit模塊包含在傳統的 pas文件中 這就是為什麽在Delphi中我們經常面對的是為各個窗口服務的unit模塊 而非在壹個program中寫完所有代碼 不過我在Delpi的Help中看到這樣壹句話 In traditional Pascal programming all source code including the main program is stored in pas files 不知道這算思考角度不同還是算bug 畢竟這種語法並非Delphi中才有 Turbo Pascal程序員也壹直在采用這種方法組織程序結構 給出壹個簡單的initialization例子 在菜單中選擇File | New | Application 再在窗體上放置壹個按鈕 雙擊該按鈕編寫它的Click事件處理代碼 完整代碼如下

 unit Unit ;  interface  uses  Windows Messages SysUtils Variants Classes Graphics Controls Forms Dialogs StdCtrls;  type  TForm = class(TForm)  Button : TButton;  procedure Button Click(Sender: TObject);   private  { Private declarations }  public  { Public declarations }  end;

 var  Form : TForm ;  Msg: string;  implementation  {$R * dfm}  procedure TForm Button Click(Sender: TObject);  begin  ShowMessage(Msg);  Msg := second ;  end;  initialization  Msg := first ;  end

 以上所述 是過渡中兩個基本的重要問題 弄懂它們方可初步明白自己為什麽要這樣編寫代碼 該在哪裏編寫代碼 如何擴展代碼功能 推薦的參考書籍

 Delphi參考書籍

 《Delphi 開發人員指南》機械工業出版社

 《Inside VCL》李維 電子工業出版社

 《Delphi深度歷險》陳寬達 科學出版社

 《Pascal精要》網絡下載電子版  Windows參考書籍

 《Programming Windows》Charles Petzold

 《Windows 開發人員指南》中國水利水電出版社

 Delphi組件參考書我暫時沒有發現特別好的 平時我主要依靠論壇 源代碼 Delphi自帶的Demo和文檔來學習組件的使用

 現在有壹些大學取消了Pascal語言課程 去年的ACM大賽也取消了Pascal語言的使用 不禁心寒 啟蒙教育沒有人做了 這些都使得Delphi在學生中的處境更加艱難 在國內的Delphi論壇上 常常見到許多半吊子程序員在享受Delphi的快速開發的時候 嘴巴裏還在責備Delphi功能太弱 不能搞什麽底層開發 甚至直接責怪Pascal語言 殊不知 在Dos年代 有多少著名軟件使用Pascal開發出來的呢 有多少底層控制程序有著Pascal的身影呢?現在我手頭上還有Pascal編寫的病毒代碼 反病毒代碼 IC芯片控制代碼

 或許正是Delphi的RAD能力降低了程序開發的門檻 讓很多半吊子進入了程序界 RAD開發蒙蔽了許多半吊子編程者(稱呼他們為程序員或許稍欠火候)的眼睛 但是國內的教育界同樣有著不可推卸的責任 選修課開VB的不少 講Delphi的很少 我曾經還遇到過壹個從心底裏就瞧不起Delphi 不啻談論的老師 而事實上他根本就沒有用過Delphi 我現在常去外國網站 發現國內被爭論不休的問題 在國外早就有人在做 並且做的非常棒

lishixinzhi/Article/program/Delphi/201311/24962

  • 上一篇:2019年抖音最火最浪漫高級表白密碼三篇
  • 下一篇:幣圈dex是什麽意思?
  • copyright 2024編程學習大全網