熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

DELPHI基礎教程:Delphi自定義部件開發(三)[3]

2022-06-13   來源: Delphi編程 

  控制Delphi是否存儲屬性的方法是在屬性聲明後面加stored指令後跟True或False或者是布爾方法名你可以給任何屬性的聲明或重聲明加stored表達式下面的代碼顯示了部件聲明三種新屬性一個屬性是總是要存儲一個是不存第三個則決定於布爾方法的值

  type

  TSampleCompiment = class(TComponent)

  protected

  function storeIt: Boolean;

  public { 正常情況下在不存 }

  property Important: Integer stored True; { 總是存儲 }

  published { 正常情況下保存 }

  property UnImportant: Integer stored False; { 不存 }

  property Sometimes: Integer stored StoreIt; { 存儲依賴於函數值 }

  end;

  ④ 載入後的初始化

  在部件從存儲的描述中讀取所有的屬性後它調用名為Loaded的虛方法這提供了按需要執行任何初始化的機會調用Loaded是在窗體和它的控制顯示之前因此不需要擔心初始化會帶來屏幕閃爍

  在部件載入屬性時初始化它要覆蓋Loaded方法

  在Loaded方法中要做的第一件事是調用繼承的Loaded方法這使得在你的部件執行初始化之前任何繼承的屬性都已初始化

  下面的代碼來自於TDatabase部件在裝入後TDatabase試圖重建在它存儲時已打開的連接並描述在連接發生異常時如何處理

  procedure TDatabaseLoaded

  begin

  inherited Loaded; { 總是先調用繼承的方法 }

  Modified; { 設置內部標志 }

  try

  if FStreamedConnected then Open; { 重建聯接 }

  except

  if csDesigning in ComponentState then { 在設計時 }

  ApplicationHandleException(self) { 讓Delphi處理異常 }

  else raise; { 否 則 }

  end;

  end;

   Delphi部件編程實例

   創建數據庫相關的日歷控制TDBCalendar

  當處理數據庫聯接時將控制和數據直接相聯是很重要的就是說應用程序可以建立控制與數據庫之間的鏈Delphi包括了數據相關的標簽編輯框列表框和柵格用戶可以使自己的控制與數據相關

  數據相關有若干等級最簡單的是只讀數據相關或數據浏覽以及反映數據庫當前狀態的能力比較復雜的是數據相關的編輯也即用戶可以在控制上操作數據庫中的數據

  在本部分中將示例最簡單的情況即創建聯接數據庫的單個字段的只讀控制本例中將使用Component Palette的Samples頁中的TCalendar部件

  創建數據相關的日歷控制包括下列幾步

  ● 創建和注冊部件

  ● 使控制只讀

  ● 增加數據聯接(Data Link)

  ● 響應數據改變

   創建和注冊部件

  每個部件的創建都從相同的方式開始在本例中將遵循下列過程

  ● 將部件庫單元命名為DBCal

  ● 從TCalendar繼承一個新部件名為TDBCalendar

  ● 在Component Palette的Samples頁中注冊TDBCalendar

  下面就是創建的代碼

  unit DBCal;

  interface

  uses SysUtils WinTypes WinProc Messages Classes Graphics Controls

  Forms Grids Calendar;

  type

  TDBCalendar=class(TCalendar)

  end;

  procedure Register;

  implementation

  procedure Register;

  begin

  RegisterComponents(Samples[TDBabendar])

  end;

  end

   使控制只讀

  因為這個數據日歷以只讀方式響應數據所以用戶不能在控制中改變數據並指望它們反映到數據庫中

  使日歷只讀包含下列兩步

  ● 增加只讀屬性

  ● 允許所需的更新

   增加只讀屬性

  給日歷控制增加只讀選項是直接過程通過增加屬性可以提供在設計時使控制只讀的方法當屬性值被設為True將使控制中所有元素不可被選

  ⑴ 增加屬性聲明和保存值的private域

  type

  TDBCalendar=class(TClendar)

  private

  FReadOnly: Boolean;

  public

  constructor Create (Aowner: TComponent) override;

  published

  property ReadOnly: Boolean read FReadOnly write FReadOnly default True;

  end;

  constructor TDBCalendarCreate(Aowner: TComponent)

  begin

  inherited Create(AOwner)

  FReadOnly := True;

  end;

  ⑵ 覆蓋SelectCell方法使得當控制是只讀時不允許選擇

  function TDBCalendarSelectCell(ACol Arow: Longint) Boolean;

  begin

  if FReadOnly then

  Result := False

  else

  Result := inherited SelectCell(AcolARow)

  end;

  還要在TDBcalendar的聲明中聲明SelectCell

  如果現在將Calendar加入窗體會發現部件完全忽略鼠標和擊鍵事件而且當改變日期時也不能改變選擇的位置下面將使控制響應更新

   允許所需的更新

  只讀日歷使用SelectCell方法實現各種改變包括設置Row和Col的值當日期改變時UpdateCalendar方法設置Row和Col的值但因為SelectCell不允許你改變即使日期改變了選擇仍留在原處

  可以給日歷增加一個Boolean標志當標志為True時允許改變

  type

  TDBCalendar=class(TCalendar)

  private

  Fupdating: Boolean;

  protected

  function SelectCell(Acol Arow: Longint) Boolean; override;

  public

  procedure UpdateCalendar; override;

  end;

  function TDBCalendarSelectCell(ACol ARow: Longint) Boolean;

  begin

  if (not FUpdating) and FReadOnly then

  Result := False { 如果更新則允許選擇 }

  else

  Result := inherited SelectCell(ACol ARow) { 否則調用繼承的方法 }

  end;

  procedure UpdateCalendar;

  begin

  FUpdating := True; { 將標志設為允許更新 }

  try

  inherited UpdateCalendar; { 象通常一樣更新 }

  finally

  FUpdating := False; { 總是清除標志 }

  end;

  end;

  現在日歷仍舊不允許用戶修改但當改變日期屬性時能正確反映改變目前已有了一個真正只讀控制下一步是增加數據浏覽能力

   增加數據聯接

  控制和數據庫的聯接是由一個名為DataLink的對象處理Delphi提供了幾種類型的Datalink將控制與數據庫單個域相聯的DataLink對象是TFieldDatalinkDelphi也提供了與整個表相聯的DataLink

  一個數據相關控制擁有DataLink對象就是說控制負責創建和析構DataLink

  要建立作為擁有對象的Datalink要執行下列三步

  ● 聲明對象域

  ● 聲明訪問屬性

  ● 初始化DataLink

  ⑴ 聲明對象域

  每個部件要為其擁有對象聲明一個對象域因此日歷對象DataLink 聲明TFieldDataLink類型的域

  日歷部件中DataLink的聲明如下

  type

  TDBCalendar = class(TSampleCalendar)

  private

  FDataLink: TFieldDataLink;

  …

  end;

  ⑵ 聲明訪問屬性

  每一個數據相關控制有一個DataSource屬性該屬性描述應用程序給控制提供數據的數據源而且訪問單個域的數據庫還需要一個DataField 屬性描述數據源中的域

[]  []  []  []  


From:http://tw.wingwit.com/Article/program/Delphi/201311/25115.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.