轉眼間使用Delphi開發已近2年了,其間有幾次想把它學好,但總有一種排斥心理,找各種借口間斷了自己的努力,不知不覺間自己差距越來越大,無奈我必須面對現實,從現在起堅持做自己該做的,出來混,遲早要換的,現在就要努力補課,換自己以前的偷懶和惰性。今天第一次聽說delphi中的Frames,程序中要復用一個界面,我一開始想用彈出一個模特Frame的方法實現,聽一位delphi大牛說可以用Frames實現更好,我頓時傻眼了,也沒好意思問Frames為何物,只好自己百度搜索一下。找了幾篇文章看了后依舊頭暈,於是就按照一篇文章所說嘗試了一下:1.在我現有的工程中加入框架Frames:菜單File-》New –》Frames然后命名;2.單擊standard選項卡上的Frames拖到我想放置Frames的主窗體panel上,彈出Select frame to insert對話框,選擇我剛才新建的Frame。3.發現我原來Frame命名為FrameCount,而新插入的Frame被命名為FramesCount1,我於是在FrameCount上放置幾個按鈕控件,切換到主窗體上的FrameCount1,居然上面多了同名按鈕控件;我直接在FrameCount1上放置幾個按鈕,FrameCount上沒有,我大概明白了框架重用的含義,也逐漸明白了幾篇文章,現摘錄如下:
那么Frame到底是什么呢?簡單來說:
1. Frame是組件容器,類似Panel
2. Frame在使用上類似Components組件,但並沒有構造器和解析器,依賴於父容器完成Destroy的工作
3. Frame可以繼承和嵌套
4. Frame內部的控件都是公開的,可以在IDE里重置屬性和事件,所以frame的內部封裝一般都是松散的。訪問frame上的組件用frame.control方式
5. Frame的使用范圍僅在當前工程內
6. Frame的使用不像一般組件component有獨立的功能,很多時候需要和父容器耦合在一起
frame和普通components組件一樣,都是為復用設計的。只是frame是Delphi的特技,是一種簡化版組件。如果你有一組可視化組件的集合,在多個地方重復出現,就應該考慮使用Frame了。
摘自:http://blog.csdn.net/ppayun/article/details/7570946
Delphi中TFrame組件的使用
從Delphi 5.0開始,Borland 引進了一個新的可視化的容器類TFrame。這個類,我們稱之為TFrame框架組件,使程序開發人員能夠可視化的設置一組組件,之后系統中對它進行重用。
TFrame框架有兩個主要的好處:
第一、框架可大幅減少需要存儲在工程中的資源量。
第二、框架允許你可視化的創建能復制和擴展的對象。對可視化窗體繼承(VFI), 你可以享受同樣的好處。
VFI允許你很簡單的創建由繼承得來的窗體。VFI的限制是你必須用"全部或全無"的方式來使用窗體。更具體的說,當你用VFI時,你總是創建一個新的窗 體。
TFrame框架也可認為與組件模板(含一個或更多組件並用Component | Create Component Template命令保存到組件 面板的一個組)相似。但是,相似之處僅限於它們都是被可視化設計的(不象傳統的完全基於代碼的組件設計)。實際上,框架與組件模板的差異是巨大的。正如我 們已學過的,框架是一定義類的實例,當定義類發生改變時框架也將發生變化。與之相比,組件模板是組件的集合。對組件模板的改變不影響以前從這一模板創建的 對象。
創建框架
1> 選擇 File | New Application 建立一個新的工程。
2> 選擇 File | New Frame 建立一個新的TFrame框架。在這一框架上,添加三個Label和三個DBEdit,還有一個 DBNavigator和一個DataSource。將Label的Caption分別設為ID,First Name和Last Name。將 DBEdit和DBNavigator的DataSource屬性設為DataSource1。
3> 將框架的Name屬性設為NameFrame。(相比其它對象,起一個有意義的名字對框架來說非常重要)最后,選擇File | Save As 保存框 架。在這里,用文件名NAMEFRAM.PAS保存框架。
使用框架
1> 在由上面步驟建立的工程中選擇Form1。
2> 加兩個GroupBox到窗體上,其中一個在另一個之上。設置第一個的Caption為Customers,第二個的Caption為 Employees。
3> 現在添加框架。選擇組件面板的Standard頁,點擊Frame組件並將其拖到名為Customers的GroupBox中。這時Delphi會顯示一 個Select frame to insert對話框。
4> 在對話框中選擇NameFrame。現在框架將在名為Customers的GroupBox中顯示。重復這一步驟,這一次將框架放在名為 Employees的GroupBox中。你可能要調節框架的尺寸,這跟你最初是如何放置有關。
5> 將兩個Table組件放到窗體中,將其DatabaseName屬性都設為IBLocal。將Table1的TableName屬性設為 CUSTOMER,將Table2的TableName屬性設為EMPLOYEE。將兩個Table的Active屬性都設為True,使它們有效。
6> 下面的步驟將把事情變得有趣。選擇名為Customers的GroupBox中的DataSource,將其DataSet屬性設為Table1。一般的 你不能直接選擇組件中的對象,但是框架是個例外。你可以選擇框架中的任何對象,操作它們的屬性。然后,選擇名名為Customers的GroupBox中 DataSource,其DataSet屬性設為Table2。
7> 最后,設置好所有的DBEdits。將名為Customers的 GroupBox中的三個DBEdits的DataField屬性分別設為CUST_NO,CONTACT_FIRST和CONTACT_LAST。對 Employees中的,設置DataField屬性為EMP_NO,FIRST_NAME和LAST_NAME。
8> 保存工程並運行。
框架和繼承
1> 在上面建立的工程中,按[Shift][F12]並在窗體列表中選擇NameFrame。
2> 將DataSource的AutoEdit屬性設為False 。
3> 然后,選擇DBNavigator,展開它的VisibleButtons屬性,並設置nbInsert,nbDelete,nbEdit,nbPost 和nbCancel標志為False。
4> 現在看一下你的主窗體,注意兩個NameFrame的后代都繼承了你對框架做的修改。
重載包含組件的屬性
框架的優點之一(與VFI一樣)是你可以改變框架中對象的屬性和事件處理函數。這些修改重載了繼承的值。說得具體些,隨后對初始框架的重載屬性的修改將不 改變后代的重載屬性的值。
1> 在名為Customers的GroupBox中,選擇標題為"ID"的label,在Object Inspector將其Caption屬性改為 "Customer No:"。現在選擇名為Customers的GroupBox中的標題為"ID"的Label,其Caption屬性改為 "Employee ID:"。
2> 按[Shift][F12]並選擇NameFrame。將標題為"ID"的Label的Caption屬性改為Identifier。
3> 回到主窗體,注意Label的Caption屬性沒有變為Identifier。它們仍保持它們的重載值。
4> 這一效果是由保存在DFM文件中的信息實現的。
注意所有其屬性改變過的在框架中的對象,都出現在DFM文件中的內置部分。但是,這一部分僅列出那些改變的值,所有其它屬性值要么按初始框架的值設置(它 們已經存儲在框架的DFM文件中),要么按每一組件的默認類定義值。
就象窗體中的對象的事件處理函數是窗體類的公開方法,框架中的對象的事件處理函數也是框架類的公開方法。(代碼段實際上並沒有說框架的這些方法是公開的, 而是它們在框架聲明的默認可見部分被聲明,其可見性默認是公開的。)
框架節省資源
在聲明窗體中有兩個框架。我們已經討論了TwoButtonFrame框架。第二個框架顯示公司標志,名為LogoFrame。
LogoFrame在FramDemo的多個窗體中出現。一種替代使用框架的做法是在每個窗體中設置一個Image對象來顯示公司標志。但是,用框架可以 顯著減少需要編譯到EXE文件中的資源,生成一個較小的可執行文件。
如果把一個TImage放在窗體中,窗體的DFM文件將必須包含整個公司標志的二進制數表示。而且,每一個含有圖象的窗體都重復保存這一資源。但用框架 時,資源只定義一次。
簡化框架的使用
在一單個、小的工程中,使用組件面板Standard頁上的框架組件是相當簡單的。但是對更大的、或是要在多個程序中使用同一個框架的情況下,你需要使操 作更簡單。幸運的是,Delphi允許你將單個框架放到組件面板,使這些框架不需要另外的步驟而簡單的重復使用。框架也可放到對象庫 (Object Repository)中,使它可以簡單的拷貝。這兩個技術都將在下面敘述。
把框架添加到組件面板
把一個框架添加到組件模板,你可以使放置這一框架變得與其它組件一樣簡單。與之相比,用組件模板的Standard頁中的框架組件需要四步,而且限制你僅 能放置在你的工程中已經定義的框架。將一特定框架添加到組件模板中,需要:
1> 保存框架。如果你要在多個程序中使用一個框架,我非常建議你將框架保存到升級Delphi時不會被刪除的目錄中。例如,建立一個名為 c:\Program Files\Borland\DelphiFrames的目錄來保存你的框架。
2> 選擇框架並在上面點鼠標右鍵,選擇Add to Palette,Delphi會顯示Component Template Information對話 框。
3> 在Component name欄定義框架組件的名稱,在Palette page欄填寫你想讓框架在組件模板內出現的頁。如果你已為框架建立了一個 24 x 24象素、16色的圖標,點擊Change按鈕來選擇這個BMP文件。當你完成后,點擊OK按鈕。
從組件模板使用框架
要使用一個已添加到組件面板的框架,在組件面板中選擇你保存框架的頁,選擇框架圖標並在你要框架后代出現的窗體上拖出該框架。這個過程僅需這兩步。
將框架添加到對象庫
把框架添加到對象庫,你可以使拷貝該框架到一個新工程的過程變得簡單。尤其重要的是對象庫提供放置繼承的框架到新的工程的能力,它使框架和它的祖先之間的 關系得以保持。要將框架添加到對象庫,需要以下步驟:
1> 保存框架。除了保存框架到Delphi的OBJREPOS目錄或是共享目錄,你還可以使用你保存添加到組件模板中的框架的目錄。如果你使用共享庫,將框架 保存到共享目錄特別好,它允許多個開發者共享框架。
2> 在框架上面點鼠標右鍵,選擇Add To Repository,Delphi會顯示Add To Repository對話框。
3> 就像你添加其它模板到Object Repository一樣填寫Add To Repository對話框。完成后點擊OK按鈕。
從對象庫中使用框架
按照下面步驟來從對象庫中使用框架:
1> 選擇 File | New.
2> 選擇你在Object Repository保存框架模板的頁。
3> 選擇代表框架的圖標,然后選擇Inherit單選按鈕。
4> 點擊OK按鈕,添加框架的繼承版本到你的工程
如果你選擇Copy單選按鈕而不是Inherit單選按鈕,添加進的框架將是原框架的一個拷貝。當你需要創建一個新的框架,但又不想保持它與原框架的關系 時是很有用的。
把需要重復使用的框架添加到組件模板與添加到對象庫有不同的效果嗎?答案是:"Yes!"。在 大多數情況,你要把你頻繁使用的框架添加到組件面板中。這樣當你放置框架時,你得到的是框架的一個實例。你然后可以容易的修改這一實例 的屬性和事件處理函數,就象本文先前介紹的一樣。與之相比,從對象庫放置一個框架會產生一個新的類,而不是一個實例。這 個類要么是原來的拷貝要么是原來的繼承,取決於你在Object Repository對話框中選擇了哪一個單選按鈕。如果你要在工程中 使用框架,添加一個框架實例比定義一個框架新類有意義的多。如果是這一目的,將框架保存到組件面板是最好的方法。
有一種情況你要使用對象庫:當你需要專門創建一框架層次,並且每一個框架后代引進了附加的對象、方法或事件處理函數。這時,對象庫提 供的繼承性使創建后代變得簡單。定義好需要經常使用框架的后代,可以將它們添加到組件面板以簡化它們的使用。