當前位置:首頁 » 編程軟體 » delphi模式編程

delphi模式編程

發布時間: 2023-01-04 05:59:04

⑴ 什麼是delphi

1、因人而異,大概要一個月左右。可以從學習簡單常式入手。delphi比起C,C++簡單多了。
2、Delphi,是Windows平台下著名的快速應用程序開發工具(Rapid Application Development,簡稱RAD)。它的前身,即是DOS時代盛行一時的「BorlandTurbo Pascal」,最早的版本由美國Borland(寶蘭)公司於1995年開發。主創者為Anders Hejlsberg。經過數年的發展,此產品也轉移至Embarcadero公司旗下。Delphi是一個集成開發環境(IDE),使用的核心是由傳統Pascal語言發展而來的Object Pascal,以圖形用戶界面為開發環境,透過IDE、VCL工具與編譯器,配合連結資料庫的功能,構成一個以面向對象程序設計為中心的應用程序開發工具。
3、由Borland公司推出的Delphi是全新的可視化編程環境,為我們提供了一種方便、快捷的Windows應用程序開發工具。它使用了MicrosoftWindows圖形用戶界面的許多先進特性和設計思想,採用了彈性可重復利用的完整的面向對象程序語言(Object-Oriented Language)、當今世界上最快的編譯器、最為領先的資料庫技術。對於廣大的程序開發人員來講,使用Delphi開發應用軟體,無疑會大大地提高編程效率,而且隨著應用的深入,您將會發現編程不再是枯燥無味的工作——Delphi的每一個設計細節,都將帶給您一份欣喜。

⑵ Delphi面向對象的編程方法(八)

重載一個方法

您可以重載(Override)一個方法 通過在後代對象中說明一個與祖先對象重名的方法 就可以重載一個方法 如果想使這個方法在後代對象中作和祖先對象中一樣的工作但是使用不同的方式時 您就可以重載這個方法 Delphi不推薦您經常重載方法 除非您想建立一個新的部件 重載一個方法 Delphi編譯器不會給出錯誤或警告提示信息

對象公有域和私有域的說明

當使用Delphi的環境來建立應用程序時 您可以在一個TForm的後代對象中加入數據域和方法 也可以通過直接修改對象類型說明的方法來為一個對象加上域和方法 而不是把一個部件加入窗體或事件處理過程中

您可以在對象的Public或Private部分加入新的數據域和方法 Public和Private是Object Pascal的保留字 當您在工程中加入新的窗體時 Delphi開始建立這個新窗體對象 每一個新的對象都包含public和private指示 以便您在代碼中加入數據域和方法 在public部分中說明其它庫單元中對象的方法也可以訪問的數據域或方法 在private部分的說明有訪問的限制 如果您在private中說明域和方法 那麼它在說明這個對象的庫單元外是不透明的 而且不能被訪問 private中可以說明只能被本庫單元方法訪問的數據域和本庫單元對象訪問的方法 過程或函數的程序代碼可以放在庫單元的implementation部分

訪問對象的域和方法

當您想要改變一個窗體對象的一個域的某個屬性 或是調用它的一個方法時 您必須在這個屬性名稱或調用方法之前加上這個對象的名稱 例如 如果您的窗體上有一個編輯框部件 而您需要在運行中改變它的Text屬性 需要編寫下列的代碼

Edit Text := Wele to Delphi ;

同樣 清除編輯框部件中選中的文本 可以調用TEdit部件的相應方法

Edit ClearSelection;

如果您想改變一個窗體對象中一個對象域的多個屬性或調用多個方法時 使用with語句可以簡化您的程序 with語句在對象中可以和在記錄中一樣方便地使用 下面的事件處理過程在響應OnClick事件時 會對一個列表框作多個調整

procere TForm Button Click(Sender:TObject); beginListBox Clear;ListBox MultiSelect :=True;ListBox Item Add( One );ListBox Item Add( Two );ListBox Item Add( Three );ListBox Sorted :=Ture;ListBox FontStyle :=[fsBold];ListBox Font Color :=clPurple;ListBox Font Name := Times New Roman ;ListBox ScaleBy( );end;

如果使用了With語句 則程序如下

procere TForm Button Click(Sender:TObject); beginwith (ListBox ) dobeginClear;MultiSelect :=True;Item Add( One );Item Add( Two );Item Add( Three );Sorted :=Ture;FontStyle :=[fsBold];Font Color :=clPurple;Font Name := Times New Roman ;ScaleBy( );end;end;

使用with語句 您不必在每一個屬性或方法前加上ListBox 標識符 在With語句之內 所有的屬性或調用方法對於ListBox這個對象而言都是在它的范圍內的

對象變數的賦值

如果兩個變數類型相同或兼容 您可以把其中一個對象變數賦給另一個對象變數 例如 對象TForm 和TForm 都是從TForm繼承下來的類型 而且Form 和Form 已被說明過 那麼您可以把Form 賦給Form :

Form :=Form ;

只要賦值的對象變數是被賦值的對象變數的祖先類型 您就可以將一個對象變數賦給另一個對象變數 例如 下面是一個TDataForm的類型說明 在變數說明部分一共說明了兩個變數 AForm和DataForm

typeTDataForm = class(TForm)Button :TButton;Edit :TEdit;DataGrid :TDataGrid;Database :TDatabase;TableSet :TTableSet;VisibleSession :TVisibleSession;private{私有域說明}public{公有域說明} end; varAForm:TForm;DataForm:TDataForm;

因為TDataForm是TForm類型的後代 所以Dataform是AForm的後代 因此下面的賦值語句是合法的

AForm :=DataForm;

這一點在Delphi中是極為重要的 讓我們來看一下應用程序調用事件處理過程的過程 下面是一個按鈕部件的OnClick事件處理過程

procere TForm Button Click(Sender:TObject);beginend;

您可以看到TObject類在Delphi的Visual Component Library的頂部 這就意味著所有的Delphi對象都是TObject的後代 因為Sender是TObject類型 所以任何對象都可以賦值給它 雖然您沒有看見賦值的程序代碼 但事實上發生事件的部件或控制部件已經賦給Sender了 這就是說Sender的值是響應發生事件的部件或控制部件的

您可以使用保留字is來測試Sender以便找到調用這個事件處理過程的部件或控制部件的類型 Delphi中的一個顯示drag and drop的DRAGDROP DPR工程 載入它 可以查閱到DROPFONT PAS庫單元的代碼 在Memo DragOver方法中檢查了一個對象變數的類型 在這種情形下 參數是Source而不是Sender

procrre TForm Memo DragOver(SenderSource:TObject;X Y:integer;State:TDragState;var Accept:Boolean);beginAccept :=Source is TLabel;end;

Source參數也是TObject類型 Source被賦值為那個被拖曳的對象 用Memo DragOver方法的目的是確保只有標簽可以被拖曳 Accept是布爾型參數 如果Accept為True 那麼用戶選擇的部件可以被拖曳 反之當Accept的值為False時 用戶就不可以拖曳選擇控制部件 is保留字檢查Source是否TLabel的類型 所以Accept只有在用戶拖曳一個標簽時才為真 並作為變參輸出到函數之外

下面的drag and drop展示的Memo DragDrop事件處理過程中也使用了Source參數 這個方法是為了把Memo部件的字型改變成和放入這個備注控制部件的標簽一樣的字型

procere TForm Memo DragDrop(SenderSource:TObject;X Y:Integer);beginMemo Font := (Source as TLabel) Font; end;

當您在這個事件處理過程中編寫賦值語句時 開發人員並不知道用戶會放入哪一個標簽 只有通過參考這個標簽的名稱(Source as TLabel)用戶才能知道 並把標簽類型賦給Memo TFont Source包含了用戶拖放控制部件的名稱 只有當Source是一個標簽時 這個事件處理過程才允許這個賦值發生

建立非可視化對象

您在Delphi中使用的大部分對象都是您在設計和運行期間可以看見的部件 例如編輯框 按鈕等 一些部件 如通用對話框(Common dialog box)等 在設計時看不見 而在運行時可以看見 另外有些部件 例如計時器(Timer) 數據源(Data Source)部件等 在程序的運行期間沒有任何可視化的顯示 但您卻可以在您的應用程序中使用它們

說明一個非可視化對象

下面 通過一個簡單的例子講述如何建立自己的非可視化對象

您可以用如下的方法 建立一個自己的TEmployee非可視化對象

type Temployee = class(TObject);Name := String[ ];Title := String[ ];HourlyPayRate : Double;function CalculatePayAmount:Double;end;

在這種情況下 TEmployee從TObject繼承下來 且包含三個域和一個方法 把您建立的類型說明放在庫單元中的說明部分 並和窗體說明放在一起 在這個程序庫單元的變數說明部分 說明一個新類型的變數

varEmployee : TEmployee;

用Create方法建立對象實例

TEmployee只是一個對象類型 除非通過一個構造函數的調用從而被實例取代或創建 否則一個對象並不存儲在內存中 構造函數是一個方法 它為新對象配置內存並且指向這個新的對象 這個新的對象也被稱為這個對象類型的一個實例

建立一個對象的實例 需要調用Create方法 然後構造函數把這個實例賦給一個變數 如果您想說明一個TEmployee類型的實例 在您訪問這個對象的任何域之前 您的程序代碼必須調用Create

Employee := TEmployee Create;

Create方法並沒有在TEmployee類型中說明 它繼承自TObject類型 因為TEmployee是TObject的子類 所以它可以調用Create方法而創建一個TEmployee實例 然後把它賦給Employee變數 在創建了一個這樣的對象後 您就可以象使用其他的Delphi對象一樣訪問Employee對象了

撤銷對象

當您使用完對象後 您應該及時撤銷它 以便把這個對象佔用的內存釋放出來 您可以通過調用一個注銷方法來撤銷您的對象 它會釋放分配給這個對象的內存

Delphi的注銷方法有兩個 Destroy和Free Delphi建議使用Free 因為它比Destroy更為安全 同時調用Free會生成效率更高的代碼

您可以用下列的語句釋放用完的Employee對象

Employee Free;

lishixin/Article/program/Delphi/201311/24951

⑶ Delphi面向對象編程的20條規則

前言

大多數Delphi程序員都像使用Visual Basic 那樣使用他們手頭上開發工具 而絲毫沒有意識到Delphi的強大功能 更談不上使用這些功能了 (寫到這里 編輯惶恐的舉起了手 怎麼可能呢?)Delphi和Visual Basic不同 Delphi完全建立在面向對象結構上 這不僅影響到VCL的結構 而且影響到使用Delphi開發的每一個程序 在本文中 我不想涉及到面向對象編程(OOP)的所有理論 只是提出一些簡單的經驗規則 希望這些規則能夠幫助改善你的程序結構 無論你開發的是何種類型的程序 這些經驗規則都是適用的 你應當把他們當作一些建議 記住他們並把他們應用到你開發的程序中去 關於面向對象編程 我想強調的一個關鍵原理是封裝 我們都希望創建一些靈活而且強健的類 因為這樣的類允許我們以後修改他們的實現方法而不影響到程序中的其他部分 這正是封裝給我們帶來的好處 雖然封裝不是創建一個好的面向對象程序的唯一標准 但是它構成了面向對象編程的基礎 所以在本文中我也許會過多的強調封裝性 請不要感到奇怪 我有足夠充分的理由這么做 最後 我想說明這樣一個事實 本文將主要集中說明窗體(Forms)的開發(雖然其中的一些規則對於組件的開發同樣適用) 因此這些規則對於所有的Delphi程序員都是適用的 那些編寫組件的程序員必須把面向對象編程和類(Class)作為核心的元素 但是對於那些使用組件編程的程序員 他們時常會忘記面向對象 對於他們 本文可以當作一個提示 提醒他們始終記住面向對象編程

第一部分 窗體是類(A Form is A Class)(rule rule ) 程序員常常將窗體看作是對象 而事實上窗體是類 兩者的差別在於你創建基於相同的窗體類的多個窗體對象 令人感到疑惑的是Delphi為你定義的每一個窗體類創建了一個默認的全局對象 這對於新手來說是相當方便的 但是這同樣會使他們形成壞習慣

第二部分 繼承(Inheritance)(rule rule ) 在講述了一系列關於類特別是關於窗體類的規則後 第二部分將是一些關於類的繼承性以及可視化窗體繼承的建議和技巧

關於代碼 如果你想使用這些代碼 請注意構造器必要的初始化設置以及私有組件參照 同時有必要設置好窗體的OldCreateOrder屬性 否則 帶有組件的窗體構造器的初始化代碼將在窗體的OnCreate事件之前得到執行

規則一 為每一個類創建一個單元(One Class One Unit) 請始終牢記這一點 類的私有(private)和保護(protected)的部分只對於其他單元中的類和過程(procere)才是隱藏的 因此 如果你想得到有效的封裝性 你應該為每一個類使用一個不同的單元 對於一些簡單的類 比如那些繼承其他類的類 你可以使用一個共享的單元 不過共享同一個單元的類的數目是受到限制的 不要在一個簡單的單元里放置超過 個復雜的類 雖然Borland公司的VCL代碼曾經這樣做過 如果你使用窗體的時候 Delphi會默認的遵循 一個類使用一個單元 的規則 這對於程序員來說也是十分方便的 當你向你的項目中添加一個沒有窗體的類時 Delphi也會創建一個新的獨立的單元

規則二 為組件命名(Name Components) 為每一個窗體和單元給出一個有意義的名字是十分重要的 窗體和單元的名字必須是不同的 不過我趨向於為他們兩者使用相似的名字 如對於關於窗體和單元可以為他們使用AboutForm 和About pas 為組件使用帶有描述性的名字同樣十分重要 最常見的命名方式是使用類的小寫字母開頭 再加上組件的功能 如BtnAdd 或者editName 採用這樣的命名方式為組件命名可能會有很多相似的名字 而且也沒有一個最好的名字 到底應該選擇那一個應該依據你的個人愛好而定

規則三 為事件命名(Name Events) 對於事件處理方法給出合適的名字更加重要 如果你對於組件給出了一個合適的名字 那麼系統默認的名字ButtonClick將變成BtnAddClick 雖然從這個名字中我們可以猜到這個事件處理程序的功能 但是我認為使用一個能夠描述該方法的作用的名字 而不是採用Delphi附加的名字是一種更好的方式 例如 BtnAdd按鈕的OnClick事件可以命名成AddToList 這會使得你的程序可讀性更強 特別是當你在這個類的其他方法中調用這個事件處理程序時 而且這會幫助程序員為類似的事件或是不同的組件選用相同的方法 不過我必須聲明 使用動作(Actions)是目前開發重要的程序時我最喜歡的方法

規則四 使用窗體方法(Use Form Methods) 窗體都是一些類 因此窗體的代碼是以方法組織的 你可以向窗體中添加事件處理程序 這些處理程序完成一些特別的功能 而且他們能被其他方法調用 除了事件處理方法外 你還可以向窗體添加完成動作的特別定義的方法以及訪問窗體狀態的方法 在窗體中添加一些公共的(Public)方法供其他窗體調用要比其他窗體直接操作他的組件要好

規則 添加窗體構造器(Add Form Constructors) 在運行時創建的第二個窗體除了一個默認的構造器(從Tponent 類繼承而來)外還會提供其他特殊的構造器 如果你不需要考慮和Delphi 以前的版本的兼容性問題 我建議你重載(Overload)Create方法 添加必要的初始化參數 具體代碼可參見下面的代碼:

Public Constructor Create(Text:string): reintroce ; overload; Constructor TformDialog Create(Text:string); Begin Inherited Create(Application); Edit Text:=Text; End;

規則 避免全局變數(Avoid Global Variables) 應該避免使用全局變數(就是那些在單元的interface 部分定義的變數) 下面將會有一些建議幫助你如何去做 如果你需要為窗體存儲額外的數據 你可以向窗體類中添加一些私有數據 這種情況下 每一個窗體實例都會有自己的數據副本 你可以使用單元變數(在單元的implementation部分定義的變數)聲明那些供窗體類的多個實例共享的數據 如果你需要在不同類型的窗體之間共享數據 你可以把他們定義在主窗體里來實現共享 或者使用一個全局變數 使用方法或者是屬性來獲得數據

規則 永遠不要在Tform 類中使用Form (Never Use Form in Tform ) 你應該避免在類的方法中使用一個特定的對象名稱 換句話說 你不應該在TForm 類的方法中直接使用Form 如果你確實需要使用當前的對象 你可以使用Self關鍵字 請牢記 大多數時候你都沒有必要直接使用當前對象的方法和數據 如果你不遵循這條規則 當你為一個窗體類創建多個實例的時候 你會陷入麻煩當中

規則 盡量避免在其他的窗體中使用Form (Seldom Use Form In Other Forms ) 即使在其他窗體的代碼中 你也應該盡量避免直接使用全局變數 如Form 定義一些局部變數或者私有域供其他窗體使用會比直接調用全局變數要好 例如 程序的主窗體能夠為對話框定義一個私有域 很顯然 如果你計劃為一個派生窗體創建多個實例 這條規則將是十分有用 你可以在主窗體的代碼范圍內保持一份清單 也可以更簡單地使用全局Sreen對象的窗體數組

規則 移除Form (Remove Form ) 事實上 我的建議是在你的程序中移除Delphi自動創建的全局窗體對象 即使你禁止了窗體的自動添加功能 這也有可能是必要的 因為在Delphi隨後仍然可能添加這樣的窗體 我給你的建議是應該盡量避免使用全局窗體對象 我認為對於Delphi新手而言 移除全局窗體對象是十分有用的 這樣他們不至於對類和全局對象兩者的關系感到疑惑 事實上 在全局窗體對象被移除後 所有與它有關的代碼都會產生錯誤

規則 添加窗體屬性(Add Form Properties) 正如我已經提到過的 當你需要為你的窗體添加數據時 請添加一個私有域 如果你需要訪問其他類的數據 可以為你的窗體添加屬性 使用這種方法你就能夠改變當前窗體的代碼和數據(包含在它的用戶界面中)而不必改變其他窗體或類的代碼 你還應該使用屬性或是方法來初始化派生窗體或是對話框 或是訪問他們的最終狀態 正如我前文所說的 你應該使用構造器來完成初始化工作

規則 顯示組件屬性(Expose Components Properties) 當你需要訪問其他窗體的狀態時 你不應該直接訪問它的組件 因為這樣會將其他窗體或其它類的代碼和用戶界面結合在一起 而用戶界面往往是一個應用程序中最容易發生改變的部分 最好的方法是 為你需要訪問的組件屬性定義一個窗體屬性 要實現這一點 可以通過讀取組件狀態的Get方法和設置組件狀態的Set方法實現 假如你現在需要改變用戶界面 用另外一個組件替換現有的組件 那麼你只需做的是修改與這個組件屬性相關的Get方法和Set方法 而不必查找 修改所有引用這個組件的窗體和類的源碼 詳細實現方法請參見下面的代碼

private function GetText:String; procere SetText(const Value:String); public property Text:String; read GetText write SetText; function TformDialog GetText:String; begin Result:=Edit Text; end; procere TformDialog SetText(const Value:String); begin Edit Text;=Value; end;

規則 屬性數組(Array Properties) 如果你需要處理窗體中的一系列變數 你可以定義一個屬性數組 如果這些變數是一些對於窗體很重要的信息 你還可以把他們定義成窗體默認的屬性數組 這樣你就可以直接使用SpecialForm[ ]來訪問他們的值了 下面的代碼顯示了如何將一個listbox組件的項目定義成窗體默認的屬性數組

type TformDialog =class(TForm) private listItems:TlistBox; function GetItems(Index:Integer):String; procere SetItems(Index:Integer:const Value:String); public property Items[Index:Integer]:string; end; function TFormDialog GetItems(Index:Integer):string; begin if Index >=ListItems Items Count then raise Exception Create( TformDialog:Out of Range ); Result:=ListItems Items[Index]; end; procere TformDialog SetItems(Index:Integer;const alue:string); begin if Index >=ListItems Items Count then raise Exception Create( TformDialog:Out of Range ); ListItems Items[Index]:=Value; end;

規則 使用屬性的附加作用(Use Side Effects In Properties) 請記住 使用屬性而不是訪問全局變數(參見規則 )的好處之一就是當你設置或者讀取屬性的值時 你還可能有意想不到的收獲 例如 你可以直接在窗體界面上拖拉組件 設置多個屬性的值 調用特殊方法 立即改變多個組件的狀態 或者撤銷一個事件(如果需要的話)等等

規則 隱藏組件(Hide Components) 我經常聽見那些面向對象編程的狂熱追求者抱怨Delphi窗體中包含一些在published部分聲明的組件 這是和面向對象思想的封裝性原理不相符合的 他們確實提出了一個重要的議題 但是他們中的大多數人都沒有意識到解決方法其實就在他們手邊 完全不用重寫Delphi代碼 也不用轉向其他語言 Delphi向窗體中添加的組件參照可以被移到private部分 使得其他窗體不能訪問他們 如果你這樣做 你就有必要設置一些指向組件的窗體屬性(請參見規則 ) 並且使用它們來訪問組件的狀態 Delphi將所有的這些組件都放在published部分 這是因為使用這種方式能夠保證這些域一定是在 DFM文件中創建的組件 當你改變一個組件的名稱時 VCL能夠自動地將這個組件對象與它在窗體中的參照關聯起來 因為delphi使用RTTI和Tobject方法來實現這種功能 所以如果想要使用這種自動實現功能 就必須把參照放置在published部分(這也正是為什麼delphi將所有的組件都放在published部分的緣故) 如果你想知道的更詳細一點 可以參看下面的代碼

procere Tponent SetReference(Enable:Boolean); var Field:^Tponent; begin If Fowner<> nil then begin Field:=Fowner FieldAddress(Fname); If Field<>nil then Field^:=Self else Field^:=nil; end; end;

上面的代碼是Tponent類的SetReference方法 這個方法可以被InserComponent RemoveComponent和SetName等方法調用 當你理解了這一點後 你應該不難想到如果你將組件參照從published部分移到了private段 你將失去VCL的自動關聯功能 為了解決這個問題 你可以通過在窗體的OnCreate事件中添加如下代碼解決 Edit :=FindComponent( Edit ) as Tedit; 你接下來應該做的就是在系統中注冊這些組件類 當你為他們注冊過後就能使RTTI包含在編譯程序中並且能夠被系統所使用 當你將這些類型的組件參照移到private部分時 對於每一個組件類 你只需為他們注冊一次 即使為他們注冊不是一定必要的時候 你也可以這樣做 因為對於RegisterClasses的額外調用有益無害 通常你應該在單元中負責生成窗體的初始化部分添加以下的代碼 RegisterClass([TEdit]);

規則 面向對象編程的窗體向導(The OOP Form Wizard) 為每一個窗體的每一個組件重復上述兩個操作不僅十分的煩人 而且相當的浪費時間 為了避免額外的負擔 我已經為此寫了一個簡單的向導程序 這個程序將會生成一些可以完成以上兩步工作的代碼 你需要做的僅僅是做幾次復制和粘貼就行了 遺憾的是這個向導程序不能自動將代碼放置到單元中合適的地方 我目前正在修改這個向導程序 希望能實現這個功能

規則 可視化窗體繼承(Visual Form Inheritance) 如果應用得當 這將是一個強大的工具 根據我的經驗 你所開發的項目越大 越能體現它的價值 在一個復雜的程序中 你可以使用窗體的不同等級關系來處理一組相關窗體的多態性(polymorphi *** ) 可視化窗體繼承允許你共享多個窗體的一些公共的動作 你可以使用共享的方法 公用的屬性 甚至是事件處理程序 組件 組件屬性 組件事件處理方法等等

規則 限制保護域數據的使用(Limit Protected Data) 當創建一些具有不同分級體系的類時 一些程序員趨向於主要使用保護域 因為私有數據不能被子類訪問 我不能說這沒有其合理性 但是這肯定是和封裝性不相容和的 保護數據的實現能夠被所有繼承的窗體所共享 而且一旦這些數據的原始定義發生改變 你必須更改所有的相關部分 請注意 如果你遵循隱藏組件這樣一條規則(Rule ) 繼承窗體就不可能訪問基類的私有組件 在一個繼承窗體中 類似Edit Text = 的代碼就不會被編譯 雖然這是相當的不方便 但是至少在理論上這是值得肯定的事情 而不是否定的 如果你感覺到實現封裝性是最主要 最需要的 就請將這些組件參照放在基類的私有段

規則 保護域中的訪問方法(Protected Access Methods) 在基類中將組件參照放置在私有域中 而為這些組件添加一些訪問函數來得到他們的屬性 這將是一種更好的方法 如果這些訪問函數僅僅在這些類內部使用而且不是類介面的一部分 你應該在保護域聲明他們 例如Rule 中描述過的GetText和SetText方法就可以聲明成protected 並且我們可以通過調用SetText( )來編輯文本 事實上 當一個方法被鏡像到一個屬性時 我們可以簡單地採用如下代碼就可以達到編輯文本的目的 Text:= ;

規則 保護域中的虛擬方法(Protected Virtual Methods) 實現一個靈活的分級制度的另一個關鍵點是定義一些你可以從外部類調用的虛擬方法來得到多態性 如果這個方法使用得當 將會很少出現其他公共的方法調用保護域中的虛擬方法的情況 這是一個重要的技巧 因為你可以定製派生類的虛擬方法 來修改對象的動作

規則 用於屬性的虛擬方法(Virtual Methods For Properties) 即使是訪問屬性的方法也能定義成virtual 這樣派生類就能改變屬性的動作而不必重新定義他們 雖然這種方法在VCL中很少使用 但是它確實十分靈活 強大 為了實現這一點 僅僅需要將Rule 當中的Get 和Set 方法定義成Virtual 基類的代碼如下所示

type TformDialog = class ( TForm) Procere FormCreate(Sender:Tobject); Private Edit :Tedit; Protected function GetText:String;virtual; procere SetText(const Value:String);virtual; public constructor Create(Text :String):reintroce;overload; property Text:String read GetText write SetText; end;

在繼承窗體中 你可以添加一些額外的動作來重載虛擬方法SetText procere TformInherit SetText(const Value:String); begin inherited SetText(Value); if Value= then Button Enabled:=False; end;

lishixin/Article/program/Delphi/201311/8509

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:593
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:888
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:581
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:765
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:684
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1012
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:255
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:114
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:806
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:712