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

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

2013-11-23 17:48:12  來源: Delphi編程 

  下例是名為IsTrue的布爾類型屬性設置缺省值True的過程

  type

  TSampleComponent=class(TComponent)

  private

  FIsaTrue: Boolean;

  pubilic

  constructor Create (AOwner: TComponent) Overvide;

  published

  property Istrue: Boolean read FIsTrue write FIsTrue default True;

  end;

  constructor TSampleComponentCreate (AOwner: TComponent)

  begin

  inherited Create ( Aowner)

  Fistvue := True; { 設置缺省值 }

  end;

   編寫屬性編輯器

  Object Inspector提供所有類型屬性的缺省編輯器Delphi也支持通過編寫和注冊屬性編輯器的方法為屬性設計自己的編輯器可以注冊專門為自定義部件的屬性設計的編輯器也可設計用於所有某類型的屬性編寫屬性編輯器需要下列五個步驟

  ● 繼承一個屬性編輯器對象

  ● 將屬性作為文本編輯

  ● 將屬性作為整體編輯

  ● 描述編輯器屬性

  ● 注冊屬性編輯器

  ⑴ 繼承屬性編輯器對象

  DsgnIntf庫單元中定義了幾種屬性編輯器它們都是從TPropertyEditor繼承而來當創建屬性編輯器時可以直接從TPropertyEditor中繼承或從表中的任一屬性編輯器中繼承

  表 屬性編輯器的類型

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  類型 編輯的屬性

  ─────────────────────────────────────

  TOrdinalProperty    所有有序的屬性(整數字符枚舉)

  TIntegerProperty    所有整型包括子界類型

  TCharProperty     字符類型或字符子集

  TEnumProperty   任何枚舉類型

  TFloatProperty   所有浮點數

  TStringProperty   字符串包括定長的字符串

  TSetElementProperty 集合中的獨立元素

  TSetElementProperty 所有的集合並不是直接編輯集合類型而是展開成一列集合元素屬性

  TClassProperty 對象顯示對象名並允許對象屬性的展開

  TMethodPropevty 方法指針主要指事件

  TComponentProperty 相同窗體中的部件用戶不能編輯部件的屬性但能指向兼容的部件

  TColorProperty    部件顏色顯示顏色常量否則顯示十六進制數

  TFontNameProperty 字體名稱

  TFontProperty 字體允許展開字體的屬性或彈出字體對話框

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  下面是TFloatPropertyEditor的定義

  type

  TFloatProperty=Class(TPropertyEditor)

  public

  function AllEqual: Boolean; override;

  function GetValue: String; override;

  procedure SetValue ( Const Value: string ) override;

  end;

  ⑵ 象文本一樣編輯屬性

  所有的屬性都需要將它們的值在Object Inspector窗口中以文本的方式顯示屬性編輯器對象提供了文本表現和實際值之間轉換的虛方法這些虛方法是GetValue和SetValue你的屬性編輯器也能繼承了一系列的方法用於讀和寫不同類型的值見下表

  表 讀寫屬性值的方法

  ━━━━━━━━━━━━━━━━━━━━━━━━━━

  屬性類型   Get方法 Set方法

  ──────────────────────────

  浮點數 GetFloatValue SetFloatVallue

  方法指針 GetMethodValue SetMehodValue

  有序類型 GetOrdValue SetOrdValue

  字符串 GetStrValue SetStrValue

  ━━━━━━━━━━━━━━━━━━━━━━━━━━

  當覆蓋GetValue方法時調用一個Get方法當覆蓋SetValue方法時調用一個Set方法

  屬性編輯器的GetValue方法返回一個字符串以表現當前屬性值缺省情況下GetValue返回unknown

  屬性編輯器的SetValue接收Object Inspector窗口String類型的參數並將其轉換成合適的類型並設置屬性值

  下面是TIntegerProperty的GetValue和SetValue的例子

  function TIntegerProperty GetValue: string;

  begin

  Result := IntToStr (GetOrdValue)

  end;

  proceduve TIntegerPropertySetValue (Const Value: string)

  var

  L: Longint;

  begin

  L := StrToInt(Value) { 將字符串轉換為數學 }

  with GetTypeData (GetPropType)^ do

  if ( L < Minvalue ) or ( L > MaxValue ) then

  Raise EPropertyErrorCreate (FmtloadStr(SOutOfRange

  [MinValueMaxValue]))

  SetOrdValue (L)

  end;

  ⑶ 將屬性作為一個整體來編輯

  Delphi支持提供用戶以對話框的方式可視化地編輯屬性這種情況常用於對對象類型屬性的編輯一個典型的例子是Font屬性用戶可以找開Font對話框來選擇字體的屬性

  提供整體屬性編輯對話框要覆蓋屬性編輯對象的Edit方法Edit方法也使用GetSet方法

  在大多數部件中使用的Color屬性將標准的Windows顏色對話框作為屬性編輯器下面是TColorProperty的Edit方法

  procedure TColorPropertyEdit

  var

  ColorDialog: TColorDialog;

  begin

  ColorDialog := TColorDialogCreate(Application) { 創建編輯器 }

  try

  ColorDialogColor := GetOrdValue; { 使用已有的值 }

  if ColorDialogExecute then

  SetOrdValue (ColorDialogColor)

  finally

  ColorDialogFree;

  end;

  end;

  ⑷ 描述編輯器的屬性

  屬性編輯必須告訴Object Inspector窗口如何采用合適的顯示工具例如Object Inspector窗口需要知道屬性是否有子屬性或者是否能顯示可能取值的列表描述編輯器的屬性通常覆蓋屬性編輯器的GetAttributes方法

  GetAttributes返回TPropertyAttributes類型的集合集合中包括表中任何或所有的值

  表 屬性編輯器特征標志

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  標志 含 義 相關方法

  ──────────────────────────────

  paValuelist 編輯器能給予一組枚舉值 GetValues

  paSubPropertie 屬性有子屬性 GetPropertises

  paDialog 編輯器能顯示編輯對話框 Edit

  PaMultiSelect 當用戶選擇多於一個部件時屬性應能顯示 N/A

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[]  []  []  []  


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